在窗口中绘制控件gdi
我以前使用过Visual Basic 6(LOONG以前),它有一个名为PictureBox的控件,你可以在其中绘制东西,如果你想要的话可以获得设备上下文等。现在试图找出如何在纯GDI/WinApi(无MFC,.net,atl,gdi +等)中拥有类似的“控制”。我使用的是一个所有者绘制按钮控件,但单击时无法(很容易)获得鼠标坐标,所以我想我需要一些其他控件。我尝试了一个静态控制,但那个没有所有者支持。我尝试过处理WM_PAINT,但据我所知(在谷歌搜索几个小时后),没有办法使用它来更新客户端的一个区域或只是一个HWND。在窗口中绘制控件gdi
所以,我问的是,人们如何使用纯粹的GDI和Windows API动画或blit选择窗口的某些区域,无论是控件还是其他任何东西?我知道MFC有一些叫做子类化的东西,但是因为MFC只是Windows API的包装器,所以必须有一种方法可以在没有它的情况下做到这一点(正如我之前所说的,MFC不是一种选择)。
创建子窗口并在其WM_PAINT
中进行绘画。当您想强制重漆时请致电InvalidateRect()
。
诚实地说,我认为这可能是您现在采取的一个大项目。在尝试这个之前,你可能想尝试一些使用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(...,“你的WINDOW CLASS这里”,...);现在
,你的窗口过程应该是这个样子:
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()'。 – 2011-05-20 11:13:23
对不起,但我对GDI不太了解。我如何处理WM_PAINT只为一个子窗口? – stelonix 2011-05-20 11:19:31
您在窗口过程中处理WM_PAINT消息。 – 2011-05-20 11:27:26