先看一下源代码: 新建一个空的工程 Line(或者直接在原来的 Win Hello World 上修改) ,加入一个 C++ 的源文件,将原来的 Win Hello World 中的代码拷贝过来。 在文件开头加入标准头文件: #include #include #include ………………………….. 然后,将 WndProc 函数修改成如下代码: …………………………………….. LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { HDC hdc; //定义画笔 PAINTSTRUCT ps; static HPEN hpen; switch(message) { case WM_CREATE: //创建画笔 Windows 下的 C/C++编程 hpen = CreatePen(PS_SOLID,3,RGB(255,0,0)); return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps);//画第一条线 MoveToEx(hdc,0,0,NULL); LineTo(hdc,100,100);//改变画笔样式画第二条线 SelectObject(hdc,hpen); MoveToEx(hdc,0,50,NULL); LineTo(hdc,100,150);//还原系统画笔 SelectObject(hdc,GetStockObject(BLACK_PEN)); EndPaint(hwnd,&ps); return 0; case WM_DESTROY://退出时销毁画笔 DeleteObject(hpen); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wParam,lParam); } 编译运行,将得到如下结果(见图 1-26) 。 图 1-26 画线 先画了一条直线,再更换画笔,画了另外一条直线。函数的调用方法很简单,参看上面的 源代码就可以明白,和 TC 中的差不多。 下面,给出部分常用的 GDI 函数及其说明: ◆SetPixel(HDC hdc , int x ,int y ,COLORREF crColor) 画点函数,用于在屏幕上画点。 hdc:设备句柄; x:象素点横坐标; y:象素点纵坐标 crColor:RGB 色彩值; ◆ MoveToEx(HDC hdc , int x ,int y ,LPPOINT lpPoint) 指定线段起始位置。 Windows 下的 C/C++编程 hdc:设备句柄; x:起始点横坐标; y:起始点纵坐标 lpPoint:通常置为 NULL ◆LineTo(HDC hdc , int x ,int y) 绘制直线,起始位置由 MoveToEx 函数指定,同时终点也是下一起始点,除非再次调用 MoveToEx 函数。 hdc:设备句柄; x:终点横坐标; y:终点纵坐标 ◆Polyline(HDC hdc ,CONST POINT *lppt ,int cPoints) 绘制折线。 hdc:设备句柄; *lppt:指向 POINT 类型数组,如 POINT Points[3]={0,0,10,10,50,50},表示 3 个点 (0,0)(10,10)(50,50) , , ; cPoints:表示端点个数。 ◆ Rectangle HDC hdc , nLeftRect, nTopRect, nRightRect, nBottomRect) ( int int int int 矩形函数,用于绘制矩形并用画刷填充。 hdc:设备句柄; nLeftRect :矩形左上点横坐标; nTopRect :矩形左上点纵坐标; nRightRect:矩形右上点横坐标; nBottomRect:矩形右上点纵坐标; ◆ Ellipse (HDC hdc , int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) 椭圆(圆)函数,用于绘制椭圆并用画刷填充。 hdc:设备句柄; nLeftRect :椭圆外切矩形左上点横坐标; nTopRect :椭圆外切矩形左上点纵坐标; nRightRect:椭圆外切矩形右上点横坐标; nBottomRect:椭圆外切矩形右上点纵坐标; 消息和定时 1)消息传递 这里,简单的谈谈四个函数。 首先是消息传递函数 SendMessage 和 PostMessage。两个函数的定义如下: 函 数 HWND hWnd , UINT Msg , WPARAM wParam , LPARAM lParam) ; 函数原型 LRESULT PostMessage ( HWND hWnd , UINT Msg , wParam , lParam) ; LRESULT SendMessage ( WPARAM LPARAM Windows 下的 C/C++编程 SendMessage 和 PostMessage 的 功 能 是 一 样 的 , 只 是 在 系 统 具 体 操 作 上 有 些 不 同 。 SendMessage 直接向窗口传递一个消息,实际上是调用 WinProc 函数;而 PostMessage 只是将一 个消息插入消息队列中, 所以 PostMessage 就没有 SendMessage 来得及时, 可能会有一定的延迟。 如果要发送一个关闭消息,用两个函数分别表示为: SendMessage(hWnd , WM_DESTROY PostMessage(hWnd , WM_DESTROY , 0 , 0) ; , 0 , 0) ; 同时注意,如果在主循环外调用的话,尽量用 PostMessage 函数。