c - 如何在静态控件中画线?

标签 c windows winapi graphics

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

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;

但它处于静态控制之下: enter image description here

最佳答案

当绘制到任何子窗口时,您需要在子窗口过程的 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);
    

如果工作正常,那么您应该在静态的私有(private)消息处理函数内收到 WM_PAINT 消息,并且您的绘图应该正确进行。

关于c - 如何在静态控件中画线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11159672/

相关文章:

c - 指针无法正确打印值

c - 尝试在 c 中实现并发 TCP 服务器和客户端

Python 解释器在关闭时崩溃

windows - 所有版本的 Windows 上的 Win32 透明控件

windows - 导出符号时必须指定 extern "C"吗?

c - 消息未发送: C socket

c - 难以理解 C 中的可变长度数组

Windows 等同于 Linux "screen"或其他替代方案?

Windows + Docker + 端口未公开/不可访问

c++ - 调整文件大小(向下)