1. PAINTSTRUCT Ps;
hDc = BeginPaint(hwnd,&Ps); //获取设备环境句柄
EndPaint(hwnd,&Ps);//释放资源
处理非WM_PAINT(如在WM_CREATE)消息里使用以下函数加载设备
2.使用GetDC()返回句柄可以在整个显示区域绘图,在处理非WM_PAINT消息里
hDc = GetDC(hwnd); //获取句柄
ReleaseDC(hwnd,hDc); //释放设备资源
3.使用GetWindowDC()返回设备内容句柄,可以在程序显示的整个窗口上绘图,包括标题列、菜单、滚动条和框架
GetWindowDC(hwnd);
ReleaseDC(hwnd,hDc);
4. 使用CreateDC()创建设备内容并返回句柄,
函数原型:HDC CreateDC(LPCTSTR lpszDrive,LPCTSTR lpszDevice, LPCTSTR lpszOutput, CONST DEVMODE *lplnitData);
lpszDriver: Windows NT:指向一个以Null结尾的字符串的指针,该字符串为显示驱动指定DISPLAY或者指定一个打印驱动程序名,通常为WINSPOOL。
在基于32位的应用程序中,该参数被忽略或者为Null。但有一个例外,可以通过指定以null结尾的DISPLAY来得到一个显示设备上下文环境,如果该参数为DISPLAY,
其他所有的参数必须为Null。
lpszDevice:指向一个以null结尾的字符串的指针,该字符串指定了正在使用的特定输出设备的名字,它不是打印机模式名。LpszDevice参数必须被使用。
lpszOutput:该参数在32位应用中被忽略;并置为Null,它主要是为了提供与16位应用程序兼容,更多的信息参见下面的注释部分。
LplnitData:指向包含设备驱动程序的设备指定初始化数据的DEVMODE结构的指针,DocumentProperties函数检索指定设备获取已填充的结构,如果设备驱动程序使用
用户指定的缺省初始化值。则lplnitData参数必须为Null。返回值:成功,返回值是特定设备的设备上下文环境的句柄;失败,返回值为Null。
例如要获取整个屏幕的设备内容句柄
hDc = CreateDC(_T(“DISPLAY”),NULL,NULL,NULL);
DeleteDC(hDc);
5. 有时您只是需要取得关于某设备内容的一些信息而并不进行任何绘画,在这种情况下,您可以使用CreateIC来取得一个”信息内容”的句柄,
hDc = CreateIC(_T(“DISPLAY”),NULL,NULL,NULL);
不能用这个信息内容句柄往设备上写东西;
使用位图时,取得一个”内存设备内容”有时是有用的
hdcMem = CreateCompatibleDC (hdc) ;
DeleteDC (hdcMem) ;
可以将位图选进内存设备内容,然后使用GDI函数在位图上绘画
这里只讲常用的RGB色彩值得宏,三个参数分别是红绿蓝,如RGB(255,0,0)是红色
可以用GetRValue()、GetGValue()和GetBValue()分别获取宏RGB的三个值
画线即改变屏幕上一系列像素点的颜色。
MoveTo()开始画线、弧和多边形时,把光标移动到一个初始位置
LineTo()画一条从初始位置到另一个点的直线
Arc()画一段弧, BOOL Arc( int x1, int y1, intx2, int y2, int x3, int y3, int x4, int y4 );
x1为有效矩形左上角X坐标点.y1为有效矩形左上角y坐标点.x2为有效矩形右下
角x坐标点.y2为有效矩形右下角y坐标点.x3为画圆弧起始x坐标点.y3为画圆弧
起始y坐标点.x4为画圆弧终点x点,y4为画圆弧终点y点.x1,y1,x2,y2为画圆弧矩
形区域.x3,y3,x4,y4为画圆弧起始点,终点. Arc 画圆弧是按逆时针方向.
ArcTo()画一段弧,并更新初始位置
AngleArc()画一条线,然后画一段弧,并更新初始位置
PolyDraw()画一系列线段和Bezier样条
PolyLine()画一系列线段
PolyPolyLine()画多个系列线条
这里的形状是一系列封闭线条。
Rectangle()画一个矩形
Pie()画一个饼状楔形
Chord() ; //不知道这个图形怎么称呼, 椭圆周上的弧,两端以弦连接
RoundRect()画一个圆角矩形
Draw3dRect()画一个三维矩形
Polygon()画一个多边形
DrawEdge()画一个矩形的边缘
PolyPolygon()创建一个或多个多边形
DrawFrameControl()画一个框架控件
Ellipse()画一个椭圆
1. Rectangle(hdc, xLeft, yTop, xRight, yBottom) ;
点(xLeft, yTop)是矩形的左上角,(xRight, yBottom)是矩形的右下角
2. Ellipse (hdc, xLeft, yTop, xRight,yBottom);
3. RoundRect (hdc, xLeft, yTop, xRight,yBottom,xCornerEllipse, yCornerEllipse) ;
4. Chord (hdc, xLeft, yTop, xRight,yBottom, xStart, yStart, xEnd, yEnd) ;
5. Pie(hdc, xLeft, yTop, xRight, yBottom,xStart, yStart, xEnd, yEnd)
现有的画笔和画刷
1.画笔
在我们画线时,系统是使用设备内容中的BLACK_PEN的画笔画线
使用已经存在的画笔
HPEN hPen;
hPen = (HPEN)GetStockObject(WHITE_PEN);//获取现有画笔(WHITE_PEN)的句柄
SelectObject(hDc,hPen);//将画笔放入设备内容
自定义画笔,现有的画笔太少了
使用CreatePen()函数
hPen = CreatePen (iPenStyle, iWidth,crColor) ;
iPenStyle参数确定画笔是实线、点线还是虚线
对于PS_SOLID、PS_NULL和PS_INSIDEFRAME画笔样式,iWidth参数是画笔的宽度。iWidth值为0则意味着画笔宽度为一个图素。
现有画笔是一个图素宽。如果指定的是点划线或者虚线式画笔样式,同时又指定一个大于1的实际宽度, 那么Windows将使用实线画笔来代替
例如:hPen = CreatePen(PS_SOLID,1,RGB(255,0,0));//红色画笔
然后再使用SelectObject(hDc,hPen);//将画笔放入设备内容
在最后要使用DeleteObject(hPen)删除画笔
2.画刷
和画笔一样,有可以使用现有的,也可以自定义
使用现有的
HBRUSH hBrush;
hBrush =(HBRUSH)GetStockObject(GRAY_BRUSH);//灰色画刷
SelectObject(hDc,hBrush); //加载到设备内容中
自定义画刷
HBRUSH hBrush;
hBrush = CreateSolidBrush (crColor) ;//还有其他的函数
如hBrush = CreateSolidBrush (RGB(255,0,0)) ;//红色画刷
SelectObject(hDc,hBrush); //加载到设备内容中
最后要使用DeleteObject(hBrush)删除画刷
填充和翻转改变一个形状内的所有像素点颜色。
FillRect()填充一个矩形
SetBkColor(hdc, crColor) ;填入空隙的背景色
FillSolidRect()用用一单色填充一个矩形
InvertRect()反转一个矩形的颜色
ExtFloodFill()用用当前画刷填充一个区域,
FrameRect()画一个矩形的边框
FillRgn()填充一个区域
InvertRgn()反转一个区域的颜色
FrameRgn()画一个特定区域的边框
我们可能会认为文本是打印的,不是画的;但在一个图形用户界面中,甚至一个文本字
符都是由像素构成的一幅图。
TextOut()在在一个指定的位置,输出一个字符串
ExtTextOut()在在一个矩形区域里输出一个字符串
TabbedTextOut()在基于用该函数传输的一个表,在指定位置输出一个字符串,并将字符串中的任何制表符转换为空格
DrawText()在在指定的矩形域里绘制文本,但比TextOut()有更多的选项,如把文本居中和显示多行文本
ClientToScreen():将显示区域坐标转换为屏幕坐标
ScreenToClient():将屏幕坐标转换为显示区域坐标
GetWindowRect():取得屏幕坐标下的整个窗口的位置和大小
GetClientRect():取得客户区域的位置和大小,它总是使用设备单位
我的部分代码
//窗口过程函数的实现(消息处理函数)
LRESULT CALLBACK MyWindowProc(
HWND hwnd, // handle to window 窗口句柄
UINT uMsg, // message identifier 消息标识
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
HDC hDc;//设备上下文
HPEN hPen; //画笔
HBRUSH hBrush;//画刷
PAINTSTRUCT Ps;
switch(uMsg)
{
case WM_PAINT:
{
TCHAR str[] = _T("这是一个Windows的SDK程序!");
hDc = BeginPaint(hwnd,&Ps); //获取设备环境句柄
hPen = CreatePen(PS_SOLID,1,RGB(255,0,0));
SelectObject(hDc,hPen);
SetTextColor(hDc,RGB(13,25,200)); //设置文本颜色
TextOut(hDc,0,0,str,18); //输出文字
//画线
MoveToEx(hDc,0,40,NULL); //移到一个初始点
LineTo(hDc,500,40); //从初始点到另外一点的线
//加载画刷
hBrush = (HBRUSH)GetStockObject(GRAY_BRUSH);//灰色画刷
/*画弧线
BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );
x1为有效矩形左上角X坐标点.y1为有效矩形左上角y坐标点.x2为有效矩形右下
角x坐标点.y2为有效矩形右下角y坐标点.x3为画圆弧起始x坐标点.y3为画圆弧
起始y坐标点.x4为画圆弧终点x点,y4为画圆弧终点y点.x1,y1,x2,y2为画圆弧矩
形区域.x3,y3,x4,y4为画圆弧起始点,终点. Arc 画圆弧是按逆时针方向.
*/
Arc(hDc,0,100,100,200,0,100,100,200);
ArcTo(hDc,200,100,300,200,200,100,300,200);
//画矩形
SelectObject(hDc,hBrush); //加载到设备上
Rectangle(hDc,400,100,500,200);//左上角与右下角坐标
//画圆角矩形
RoundRect(hDc,600,100,700,200,20,20);
//画椭圆
Ellipse(hDc,800,100,950,200); //矩形的左上角与右下角坐标
//画多边形
POINT ps[5];
ps[0].x = 50; ps[0].y = 300;
ps[1].x = 0; ps[1].y = 350;
ps[2].x = 25; ps[2].y = 400;
ps[3].x = 75; ps[3].y = 400;
ps[4].x = 100;ps[4].y = 350;
Polygon(hDc,ps,5);
DeleteObject(hPen);
EndPaint(hwnd,&Ps); //释放资源
};
break;
case WM_CLOSE: //点击"X"按钮时发送此消息,使消息循环停止
if(IDYES == MessageBox(hwnd,_T("是否要退出?"),_T("提示"),MB_YESNO))
{
DestroyWindow(hwnd); //销毁窗口,发送WM_DESTROY消息,注意程序进程还没退出
};
break;
case WM_DESTROY:
PostQuitMessage(NULL); //进程结束,完全退出程序
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam); //处理未处理的消息
break;
}
return 0;
}
今晚心情不是很好,所以后面的就概况了一下,希望谅解,如有不足的地方尽情的拍砖哦....^_^....
这有一份我网上下载的资料,里面讲的很详细,所以我共享到了我的资源里了
Windows编程GDI基础