要在窗口 gdi 中绘制的控件
Control to draw in a window gdi
我过去(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()
。
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 如何更改窗体上所有控件的标题?[C++生成器]
- 双击更改 mfc 中列表控件中的行的颜色
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- wxWidgets 绘制实时图形的最佳控件
- MFC GUI 自定义控件:如何绘制光标更新以响应鼠标移动?
- 如何在我的子类控件paint方法中在默认的paint结果之上绘制一些东西
- 绘制滚动条到mfcactiveX控件Visual studio 2012(c++).
- STM_SETIMAGE不会使静态控件失效/重新绘制
- Tab 控件的 deal WM_PAINT 事件也需要手动绘制项目
- Win32 自定义绘制树视图控件
- C++Win32,可以编辑所有者绘制的控件
- 如何在改变文本时重新绘制静态控件
- 在图片控件中绘制图像
- 如何通知CTabCtrl中的所有控件,它们应该重新绘制(应该改变它们的大小)
- 要在窗口 gdi 中绘制的控件
- 如何在C++上绘制复杂的用户控件
- 无法绘制到 Win 7 上的 SysListView32 控件?