c++ - 控件在窗口中绘制 gdi

标签 c++ c winapi gdi bitblt

我过去(很久以前)使用过 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/

相关文章:

c++ - 绘制一个对象,比较模板缓冲区的两个不同值

c++ - API Hooking 在整个过程中生效——包括 EXE 和 DLL

c++ - GLUT + OpenGL 多重采样抗锯齿 (MSAA)

c - 用 C 语言生成一个完美的迷宫

python - 如何摆脱 Python Tkinter 根窗口?

c++ - 错误:在 CComVariant::Copy 中迭代 CComSafeArray 时出现 "bad variable type"

计算给定边界框以及图像的宽度和高度的比例

winapi - 为什么我的 PE 文件无效?

c++ - 什么是 C/C++ for Windows 中基于共享内存的轻量级 IPC 机制?

c - 在 C 语言中添加矩阵代码 帮助!我不知道出了什么问题