C++ 如何利用标准按钮WinApi

C++ 如何利用标准按钮WinApi,c++,winapi,gdi,C++,Winapi,Gdi,我想在按钮上画一个简单的正方形 我创建了一个常规窗口和一个常规按钮。现在,在我的窗口的窗口过程中,在WM_PAINT消息中,我获得我的按钮的HDC,并绘制一个正方形: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { if (message == WM_PAINT) { PAINTSTRUCT ps; HDC my_hdc =

我想在按钮上画一个简单的正方形

我创建了一个常规窗口和一个常规按钮。现在,在我的窗口的窗口过程中,在
WM_PAINT
消息中,我获得我的按钮的
HDC
,并绘制一个正方形:

LRESULT CALLBACK WndProc(HWND   hWnd, UINT   message, WPARAM wParam, LPARAM lParam)
{

    if (message == WM_PAINT)
    {
        PAINTSTRUCT ps;
        HDC my_hdc = BeginPaint(hWnd, &ps);


        //---------------------------------------------
        HDC my_button_HDC = GetDC(GetDlgItem(hWnd, 11));  //Get HDC my button

        Rectangle(my_button_HDC, 5, 5, 30, 30);
        //---------------------------------------------


        EndPaint(hWnd, &ps);
}


WinMain()
{
//standart code create window and button...
}
创建窗口时,按钮上不显示正方形。只有当我将窗口向下移动到屏幕外并将其抬起时,它才会出现。

但是,只要我调整窗口大小或单击按钮,正方形就会再次消失


我不明白为什么会发生这种情况。

您仅在绘制按钮的父窗口时才在按钮上绘制(同时,您正在泄漏按钮的
HDC
)。调整窗口大小并不总是触发重新绘制

但是,即使它这样做了,当按钮本身绘制自己时,它也会绘制出您已经绘制的任何内容

使用标准Win32按钮的正确方法是:

  • 为按钮指定
    BS_OWNERDRAW
    样式,然后让其父窗口处理消息

  • 如果正在使用
    ComCtl32.dll
    v6(请参阅),则父窗口可以处理该消息,而不需要使用
    BS_OWNERDRAW
    。有关更多详细信息,请参阅


.IInspectable,不幸的是,我不明白它是如何解决问题的,以及问题是什么。问题是,按钮会自行绘制,并删除您所绘制的内容。要更改控件的外观,您需要对其进行子类化,以便截取绘制消息并修改其行为。Jonathan Potter,谢谢,请告诉我,在哪里可以看到示例,需要截取哪些消息以及如何重新配置它?。