要在窗口 gdi 中绘制的控件

Control to draw in a window gdi

本文关键字:绘制 控件 gdi 窗口      更新时间:2023-10-16

我过去(LOONG之前)使用过Visual Basic 6,它有一个名为PictureBox的控件,您可以在其中绘制内容,如果需要,可以获取设备上下文等。我现在试图找出如何在纯 GDI/WinApi(没有 MFC、.net、atl、gdi+ 等)中拥有类似的"控件"。我使用的是所有者绘制按钮控件,但是单击鼠标时无法(轻松)获取鼠标坐标,因此我认为我需要其他控件。我尝试了一个静态控件,但那个控件没有所有者绘制支持。我尝试处理WM_PAINT,但是,据我所知(在谷歌搜索几个小时后),没有办法使用它来更新客户端的一个区域或单个 HWND。

所以,我要问的是,人们如何使用纯GDI和Windows API对窗口的选定区域进行动画处理或bling,无论是控件还是其他什么?我知道 MFC 有一个名为子类化的东西,但由于 MFC 只是 Windows API 的包装器,因此必须有一种方法可以在没有它的情况下做到这一点(也正如我之前所说,MFC 不是一种选择)。

老实说,我认为这对你来说可能是一个大项目。在尝试之前,您可能想尝试一些使用 Windows api 的简单项目,但无论如何我都会给您一些解释。

您将

需要创建自定义控件。为此使用现有控件是一种不好的做法,因为这不是它们的预期使用方式。若要创建自定义控件,首先需要使用 WNDCLASSEX 或 WNDCLASS 创建窗口类。

文德班: http://msdn.microsoft.com/en-us/library/ms633576
WNDCLASSEX: http://msdn.microsoft.com/en-us/library/ms633577

完成此操作并设置所需的所有成员值后,必须向 RegisterClass 或 RegisterClassEx 注册类。

WNDCLASS(EX) 对象之一采用窗口过程函数指针。使用此窗口类创建的任何窗口都将使用此窗口过程。

注册窗口类

后,可以使用已创建的窗口类创建窗口。只需做 CreateWindow(..., "YOUR WINDOW CLASS HERE", ...);

现在,您的窗口过程应如下所示:

LRESULT CALLBACK MyDrawProcedure(HWND hwnd, UMSG uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
      case WM_PAINT:
      {
        // Handle painting your control here.
      }
      break;
      default:
         return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

好吧,我希望这有所帮助。

创建一个子窗口并在其WM_PAINT中绘制。当您想要强制重新绘制时,请拨打InvalidateRect()