2

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

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;

但它处于静态控制之下: 在此处输入图像描述

4

2 回答 2

2

绘制到任何子窗口时,您需要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 消息,并且您的绘图应该正确发生。

于 2012-07-03T09:52:29.860 回答
1

嘿兄弟!不要忘记在静态过程中添加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.
}
于 2013-06-22T13:29:50.340 回答