2011-05-20 72 views
0

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

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

+0

只需创建一个子窗口并在其WM_PAINT中进行绘画。当你想强制重画时调用'InvalidateRect()'。 – 2011-05-20 11:13:23

+0

对不起,但我对GDI不太了解。我如何处理WM_PAINT只为一个子窗口? – stelonix 2011-05-20 11:19:31

+0

您在窗口过程中处理WM_PAINT消息。 – 2011-05-20 11:27:26

回答

2

创建子窗口并在其WM_PAINT中进行绘画。当您想强制重漆时请致电InvalidateRect()

1

诚实地说,我认为这可能是您现在采取的一个大项目。在尝试这个之前,你可能想尝试一些使用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; 
} 

嗯,我希望这有助于一点。