我过去(很久以前)使用过 Visual Basic 6,它有一个名为 PictureBox 的控件,您可以在其中绘制内容、根据需要获取设备上下文等。我现在正试图找出答案如何在纯 GDI/WinApi(无 MFC、.net、atl、gdi+ 等)中拥有类似的“控件”。我使用的是所有者绘制的按钮控件,但单击鼠标时无法(轻松地)获取鼠标坐标,因此我想我需要一些其他控件。我尝试了一个静态控件,但那个控件不支持自绘。我尝试处理 WM_PAINT,但据我所知(在谷歌搜索了几个小时后),没有办法使用它来更新客户端的一个区域或一个 HWND。
所以,我要问的是,人们如何使用纯 GDI 和 Windows API 对窗口的选择区域(无论是控件还是其他)进行动画处理或位 block 传输?我知道 MFC 有一种称为子类化的东西,但由于 MFC 只是 Windows API 的包装器,所以必须有一种方法可以在没有它的情况下执行此操作(正如我之前所说,MFC 不是一个选项)。
最佳答案
老实说,我认为这可能是您现在要承担的一个大项目。在尝试此操作之前,您可能想使用 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;
}
好吧,我希望这对您有所帮助。
关于c++ - 控件在窗口中绘制 gdi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6071068/