0

我过去(很久以前)使用过 Visual Basic 6,它有一个名为 PictureBox 的控件,您可以在其中绘制东西,如果需要,可以获取设备上下文等。我现在正试图找出如何拥有纯 GDI/WinApi(无 MFC、.net、atl、gdi+ 等)中的类似“控件”。我使用的是所有者绘制的按钮控件,但是当它被点击时你不能(容易地)获得鼠标坐标,所以我想我需要一些其他的控件。我尝试了一个静态控件,但那个控件没有所有者绘制支持。我尝试处理 WM_PAINT,但据我所知(在谷歌搜索数小时后),无法使用它来更新客户端的一个区域或单个 HWND。

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

4

2 回答 2

2

创建一个子窗口并在它的WM_PAINT. InvalidateRect()当您想强制重新绘制时调用。

于 2011-05-20T16:09:25.703 回答
2

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

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

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;
}

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

于 2011-05-20T22:47:50.960 回答