如何在静态控件中绘制一条线?

我想在一个静态控件中画一条线:

case WM_CREATE: { hgraph=CreateWindow(WC_STATIC,NULL,WS_CHILD|WS_VISIBLE|SS_CENTER,20,20,660,80,hWnd,NULL,NULL,NULL); SendMessage(hgraph,WM_SETTEXT,NULL,(LPARAM) "My Static"); break; } case WM_PAINT: { hdc=GetDC(hgraph); hp=CreatePen(0 ,5,RGB(0,100,0)); SelectObject(hdc,hp); MoveToEx(hdc, 0, 0, 0); LineTo(hdc, 100, 100); ReleaseDC(hgraph, hdc); } break; 

但它在静态控制下: 在这里输入图像说明

当绘制到任何子窗口时,您需要在子窗口过程的WM_PAINT中执行绘图,而不是在父窗口的WM_PAINT中执行绘图。

对于系统控制(例如静态),您需要对窗口进行子类化 ,这意味着您需要用自己的窗口替换系统定义的窗口过程。 一旦将自己的窗口过程安装到系统控件中,就可以捕获系统控件上的WM_PAINT事件来完成绘画。

完整的程序如下:

  1. 为静态控制定义替代窗口过程。

    我们还必须定义一个变量,我们可以使用这个变量来存储控制系统的原始系统窗口过程,我们必须在某个时刻调用这个变量来允许控件按正常方式绘制。

     static WNDPROC pFnPrevFunc; static LRESULT CALLBACK ProcessStaticMessages(HWND hWindow, UINT uMessage, WPARAM wParam, LPARAM lParam) { /* * call the original system handler so the control * gets painted as normal. */ (*pFnPrevFunc)(hWindow, uMessage, wParam, lParam); /* * perform our custom operations on this control in * addition to system operations. */ switch (uMessage) { ... case WM_PAINT: /* * static control has just been painted by system. */ hDC = GetDC(hWindow); /* draw your lines on the static control */ ReleaseDC(hWindow, hDC); return TRUE; } return TRUE; } 
  2. 创建你的静态控制窗口。

     hWndStatic = CreateWindow(WC_STATIC, (LPSTR) NULL, WS_CHILD|... ); 
  3. 继承你的静态控制窗口(安装你的窗口过程)

     pFnPrevFunc = SetWindowLongPtr(hWndStatic, GWLP_WNDPROC, (LONG_PTR) ProcessStaticMessages); 

如果这个工作正常,那么你应该在静态的私人消息处理函数中接收WM_PAINT消息,并且你的绘图应该正确地发生。

黑兄弟! 不要忘记在静态过程中添加DefWindowProc 。 有时你不能没有DefWindowProc函数绘制你的控件。

例:

 LRESULT CALLBACK StaticProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch(Msg) { case WM_PAINT: // Do paint here. break; } return DefWindowProc(hWnd, Msg, wParam, lParam); // Call Default Window Procedure. }