我想在静态控件中画一条线:
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
事件来进行绘画。
完整流程如下:
定义静态控制的替换窗口过程。
我们还必须定义一个变量,用于存储控件的原始系统窗口过程,我们必须在某个时刻调用该变量以允许正常绘制控件。
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; }
创建静态控制窗口。
hWndStatic = CreateWindow(WC_STATIC, (LPSTR) NULL, WS_CHILD|... );
子类化您的静态控制窗口(安装您的窗口过程)
pFnPrevFunc = SetWindowLongPtr(hWndStatic, GWLP_WNDPROC, (LONG_PTR) ProcessStaticMessages);
如果工作正常,那么您应该在静态的私有(private)消息处理函数内收到 WM_PAINT 消息,并且您的绘图应该正确进行。
关于c - 如何在静态控件中画线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11159672/