VC: GDI绘图基本步骤总结
一、获得绘图的窗口句柄
方法(详细参数及其调用可以看考MSDN):
1、 HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)
HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)
2、 HWND WindowFromPoint(POINT& Point)
3、 BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)
BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
二、由窗口句柄得到设备环境句柄HDC
方法:BeginPaint、GetWindowDC、GetDC。这些函数都需要步骤一中的HWND的句柄。调用这些函数后要释放句柄,相应的有EndPaint、ReleaseDC进行清理。
1、 采用BeginPaint获取HDC
HDC hdc;
PAINTSTRUCT ps;// 保存
hdc = ::BeginPaint( hwnd, &ps );
// 此处添加绘图代码
::EndPaint( hwnd, &ps );
说明:获得的hdc的有效区域仅限于客户区无效区域的设备环境句柄,不包括标题栏、边框等。
2、 采用GetWindowDC获取HDC
HDC hdc = ::GetWindowDC( hwnd );
// 此处添加绘图代码
::ReleaseDC( hwnd, hdc );
说明:绘制区域是整个窗口(边框、标题栏、客户区的总和)。
3、 采用GetDC获取HDC
HDC hdc = ::GetDC( hwnd );
// 此处添加绘图代码
::ReleaseDC( hwnd, hdc );
说明:获得的hdc的有效区域仅限于客户区有效区域的设备环境句柄,不包括标题栏、边框等。
三、图形绘制方法
1、 画笔CreatePen
绘画之前先选择画笔,画笔的功能主要是绘制边框,其函数原型如下:
WINGDIAPI HPEN WINAPI CreatePen(
__in int iStyle, // 画笔的类型,比如是实线,还是虚线等等。
__in int cWidth, // 线的宽度。
__in COLORREF color // 线的颜色。
);
// iStyle参数可选值:
PS_SOLID = 0;// 实线
PS_DASH = 1;// 段线; 要求笔宽<=1
PS_DOT = 2;// 点线; 要求笔宽<=1
PS_DASHDOT = 3;// 线、点; 要求笔宽<=1
PS_DASHDOTDOT = 4;// 线、点、点; 要求笔宽<=1
PS_NULL = 5;// 不可见
PS_INSIDEFRAME = 6;// 实线; 但笔宽是向里扩展
返回值为画笔类型,SelectObject函数选中。选中后,返回原来画刷的句柄用来恢复时使用。图形绘制完毕后使用DeleteObject函数将其释放。
SelectObject函数说明:
函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);
参数:
hdc:设备上下文环境的句柄。
hgdiobj:被选择的对象的句型,该指定对象必须由如下的函数创建。
位图:CreateBitmap, CreateBitmapIndirect, CreateCompatible Bitmap, CreateDIBitmap, CreateDIBsection(只有内存设备上下文环境可选择位图,并且在同一时刻只能一个设备上下文环境选择位图)。
画笔:CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush。
字体:CreateFont, CreateFontIndirect。
笔:CreatePen, CreatePenIndirect。
区域:CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect。
返回值:如果选择对象不是区域并且函数执行成功,那么返回值是被取代的对象的句柄;如果选择对象是区域并且函数执行成功,返回如下一值;
DeleteObject函数说明:
函数功能:该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了。
函数原型:BOOL DeleteObject(HGDIOBJ hObject);
参数:
hObject:逻辑笔、画笔、字体、位图、区域或者调色板的句柄。
返回值:成功,返回非零值;如果指定的句柄无效或者它已被选入设备上下文环境,则返回值为零。
2、 画刷
画刷的功能主要是填充区域内的颜色,创建画刷的方法如下:
A、CreateSolidBrush函数
函数功能:该函数创建一个具有指定颜色的逻辑刷子。
函数原理:HBRUSH CreateSolidBrush(COLORREF crColor);
参数:
crColor:指定刷子的颜色。
返回值:如果该函数执行成功,那么返回值标识一个逻辑实心刷子;如果函数失败,那么返回值为NULL。
B、GetStockObject函数
函数功能:该函数检索预定义的备用笔、刷子、字体或者调色板的句柄。
函数原型:HGDIOBJ GetStockObject(int fnObject);
参数:
fnObject:指定对象的类型,该参数可取如下值之一;
BLACK_BRUSH:黑色画笔;
DKGRAY_BRUSH:暗灰色画笔;
DC_BRUSH:在Windows98,Windows NT 5.0和以后版本中为纯颜色画笔,缺省色为白色,可以用SetDCBrushColor函数改变颜色,更多的信息参见以下的注释部分。
GRAY_BRUSH:灰色画笔;
HOLLOW_BRUSH:空画笔(相当于HOLLOW_BRUSH);
LTGRAY_BRUSH:亮灰色画笔;
NULL_BRUSH:空画笔(相当于HOLLOW_BRUSH);
WHITE_BRUSH:白色画笔;BLACK_PEN:黑色钢笔;
DC_PEN:在Windows98、Windows NT 5.0和以后版本中为纯色钢笔,缺省色为白色,使用SetDCPenColor函数可以改变色彩,更多的信息,参见下面的注释部分。
WHITE_PEN:白色钢笔;
ANSI_FIXED_FONT:在Windows中为固定间距(等宽)系统字体;
ANSI_VAR_FONT:在Windows中为变间距(比例间距)系统字体;
DEVICE_DEFAUCT_FONT:在WindowsNT中为设备相关字体;
DEFAULT_GUI_FONT:用户界面对象缺省字体,如菜单和对话框;
OEM_FIXED_FONT:原始设备制造商(OEM)相关固定间距(等宽)字体;
SYSTEM_FONT:系统字体,在缺省情况下,系统使用系统字体绘制菜单,对话框控制和文本;
SYSTEM_FIXED_FONT:固定间距(等宽)系统字体,该对象仅提供给兼容16位Windows版本;
DEFAULT_PALETTE:缺省调色板,该调色板由系统调色板中的静态色彩组成。
返回值:如果成功,返回值标识声请的逻辑对象,如果失败,返回值为NULL。
C、CreateHatchBrush函数
函数功能:该函数可以创建一个具有指定阴影模式和颜色的逻辑刷子。
函数原型:HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);
参数:
fnStyle:指定刷子的阴影样式。该参数可以取下列值,这些值的含义为:
HS_BDIAGONAL:表示45度向下,从左至右的阴影;
HS_CROSS:水平和垂直交叉险影;
HS_DIAGCROSS:45度交叉阴影;
HS_FDIAGONAL:45度向上,自左至右阴影;
HS_HORIZONTAL:水平阴影;
HS_VERTICAL:垂直阴影。
cirref:指定用于阴影的刷子的前景色。
返回值:如果函数执行成功,那么返回值标识为逻辑刷子;如果函数执行失败,那么返回值为NULL。
画刷的选中和释放,请参照画笔。
3、 点SetPixel
函数功能:该函数将指定坐标处的像素设为指定的颜色。
函数原型:COLORREF SetPixel(HDC hdc, int X, int Y, COLORREF crColor);
参数:
hdc:设备环境句柄。
X:指定要设置的点的X轴坐标,按逻辑单位表示坐标。
Y:指定要设置的点的Y轴坐标,按逻辑单位表示坐标。
crColor:指定要用来绘制该点的颜色。
返回值:如果函数执行成功,那么返回值就是函数设置像素的RGB颜色值。这个值可能与crColor指定的颜我色有不同,之所以有时发生这种情况是因为没有找到对指定颜色进行真正匹配造成的;如果函数失败,那么返回值是C1。
4、 直线MoveToEx、LineTo
A、 MoveToEx
函数功能:将当前位置指定为特定的某一点
函数原型:BOOL MoveToEx( __in HDC hdc, __in int X, __in int Y, __out LPPoint lpPoint )
参数:
hdc:设备环境句柄。
X:指定要设置的点的X轴坐标,按逻辑单位表示坐标。
Y:指定要设置的点的Y轴坐标,按逻辑单位表示坐标。
lpPoint:指向一个POINT结构,用来接收前一位置,为空时,当前位置不被返回。
返回值:执行成功返回非零,否则返回值为零。
B、 LineTo
函数功能:从当前点到目标点进行画线。
函数原型:BOOL LineTo( int x, int y )
参数说明:
X:目标点的横坐标。
Y:目标点的纵坐标。
返回值:成功非零,其它返回零。
5、 矩形Rectangle
函数功能:该函数画一个矩形,用当前的画笔画矩形轮廓,用当前画刷进行填充。
函数原型:BOOL Rectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect);
参数:
hdc:设备环境句柄。
nLeftRect:指定矩形左上角的逻辑X坐标。
nTopRect:指定矩形左上角的逻辑Y坐标。
nRightRect:指定矩形右下角的逻辑X坐标。
nBottomRect:指定矩形右下角的逻辑Y坐标。
返回值:如果函数调用成功,返回值非零,否则返回值为0。
6、 椭圆Ellipse
函数功能:该函数画一个椭圆形,用当前的画笔画矩形轮廓,用当前画刷进行填充。
函数原型:BOOL Ellipse( HDC hdc, int x1, int y1, int x2, int y2 )
参数:
hdc:设备环境句柄。
x1:指定椭圆形左上角的逻辑X坐标。
y1:指定椭圆形左上角的逻辑Y坐标。
x2:指定椭圆形右下角的逻辑X坐标。
y2:指定椭圆形右下角的逻辑Y坐标。
返回值:如果函数调用成功,返回值非零,否则返回值为0。
7、 其它(参考MSDN)
分享到:
相关推荐
- **绘图操作**: VS2005中使用GDI+的基本步骤与VC6相似,但可以利用C++的RAII(Resource Acquisition Is Initialization)特性更好地管理对象。例如,创建并使用Graphics对象绘制直线: ```cpp auto graphics = ...
要在VC中使用GDI+,需要经历以下步骤: #### 1. 安装GDI+ SDK 首先,确保你的开发环境中已经安装了GDI+ SDK。如果没有安装,可以通过下载并安装Microsoft Windows SDK来获取。安装过程中要注意选择包含GDI+组件的...
4. **使用GDI+的步骤**: - 引入头文件:在源代码中包含`#include <Gdiplus.h>`。 - 初始化GDI+:在程序开始时,通过`GdiplusStartup`函数启动GDI+环境,传入适当的参数。 - 使用GDI+对象:创建`Graphics`对象,...
通过上述步骤,你可以在VC6中成功地集成并使用GDI+进行图形编程。然而,需要注意的是,VC6是一款较老的IDE,它不支持C++11及更高版本的特性,因此在编写代码时可能需要遵循C++98标准。此外,虽然GDI+功能强大,但在...
源代码示例中,很可能包含了如何创建和管理memDC,如何使用GDI+绘图,以及如何在WM_PAINT消息中实施双缓冲的详细步骤。通过学习这个例子,开发者可以更好地理解和掌握如何在VC6环境下利用GDI+双缓冲技术来优化图形...
以上就是使用VC++和GDI+库实现图片旋转的基本步骤。在实际应用中,可能还需要处理更多细节,如异常处理、用户交互等。GDI+提供了丰富的函数和类,可以让你实现更复杂的图像操作,如裁剪、滤镜效果等。在学习过程中,...
在VC++编程环境中,"vc mtc GDI+ 双缓存画图板"是一个涉及到图形用户界面(GUI)开发的技术点。这个标题暗示我们将会讨论如何使用Microsoft的多线程类库(MTL,Multithreaded Apartment)以及GDI+图形库来实现一个双...
总的来说,VC6.0中利用GDI+加载和显示动态GIF图片涉及以下几个关键步骤:启动GDI+、加载GIF文件、创建`Graphics`对象、绘制图像,以及可能的帧控制。通过理解这些概念,你可以进一步开发出具备更高级功能的图形界面...
例如,创建一个简单的GDI+程序,可以包括以下步骤: 1. 初始化GDI+:调用`GdiplusStartup`函数,传入适当的参数以初始化GDI+环境。 2. 创建绘图对象:实例化Pen、Brush等对象,设置它们的属性。 3. 开始绘图:使用`...
4. **高级绘图对象**:GDI+提供了多种绘图对象,如Pen(笔)、Brush(刷子)、Font(字体)、Image(图像)等,这些对象都有丰富的属性可以调整,使得图形绘制更加灵活。 5. **贝塞尔曲线与路径**:GDI+支持贝塞尔...
实现这个效果主要涉及以下几个步骤: 1. **初始化GDI**: 在VC++的窗口类的`Create`函数中,我们需要创建一个设备上下文(Device Context, DC),这是GDI绘图的基础。通过`GetDC`函数获取窗口的设备上下文,并且...
在显示图片时,我们通常需要以下步骤: 1. **加载图像文件**:首先,我们需要读取图片文件并将其转换为GDI可以处理的数据结构。对于不同的图片格式,如BMP、JPEG或PNG,这需要使用不同的库或者API函数。例如,BMP...
在VC6中,我们通常会创建一个MFC(Microsoft Foundation Classes)应用程序框架,然后在C++类中实现GDI绘图功能。首先,你需要在资源编辑器中添加位图资源,这样你就可以在代码中通过LoadBitmap函数获取位图句柄。 ...
在VC++中使用GDI+进行图像编程一般包括以下步骤: 1. **包含头文件**:首先需要包含`gdiplus.h`头文件,并链接`gdiplus.lib`库。 2. **初始化GDI+**:在程序开始时调用`GdiplusStartup`函数初始化GDI+环境。 3. **...
GDI的使用通常涉及以下步骤: 1. 初始化GDI:在创建窗口时,系统会自动加载GDI库。但在某些情况下,可能需要手动初始化,例如通过`LoadLibrary`和`GetProcAddress`加载GDI函数。 2. 创建图形对象:GDI中的对象包括...
在Windows编程领域,GDI+(Graphics Device Interface Plus)是一个强大的图形处理库,它扩展了传统的GDI功能,提供了更多的图形绘制和图像处理能力。在MFC(Microsoft Foundation Classes)框架下,我们可以利用GDI...
在这个“C#中用GDI+做的绘图程序”中,我们可以学习到如何利用GDI+来实现基本的绘图功能。 首先,我们需要了解GDI+的核心类——`Graphics`,它是所有绘图操作的基础。`Graphics`对象代表了一个设备上下文,可以用于...
GDI+是Windows图形设备接口(Graphics Device Interface)的一个增强版本,主要为.NET Framework和旧版的Microsoft Visual Studio如VC6.0提供图形处理能力。它引入了许多现代图形编程的功能,比如矢量图形、Alpha...
在Visual C++ 6.0(简称vc6.0)这样的开发环境中,GDI库文件是进行图形绘制、窗口管理、文本渲染等基本图形用户界面编程所必需的。 GDI库提供了大量的函数和结构,使得程序员可以方便地控制屏幕上的图形输出,包括...
在Windows编程领域,Visual C++ (VC) 是一个常用的开发工具,它支持使用GDI+(Graphics Device Interface Plus) 来创建图形用户界面。GDI+是微软提供的一个强大的图形绘制库,它扩展了传统的GDI功能,提供了矢量图形...