1

我正在尝试创建一个圆形按钮。到目前为止,这是我的过程:

创建 BS_BITMAP 样式按钮:

hButton = CreateWindow(L"button",L"Label",WS_CHILD|WS_VISIBLE|BS_BITMAP,
               122,363,65,65,hWnd,(HMENU)BUTTON_ID,NULL,NULL);

使用 LoadImage 加载位图。位图是一个正方形,但我只想在中心显示圆圈(稍后会详细介绍):

buttonImage = (HBITMAP)LoadImage(hInstance,L"button.bmp",IMAGE_BITMAP,65,65, 
               LR_LOADFROMFILE|LR_CREATEDIBSECTION);

设置按钮的图像:

SendMessage(hButton,BM_SETIMAGE,IMAGE_BITMAP,(LPARAM)buttonImage);

为了只显示圆圈,我使用以下内容:

hButtonRgn = CreateEllipticRgn(0,0,65,65);
SetWindowRgn(hButton,hButtonRgn,TRUE);

请注意,我在全局范围内定义了 hButtonRgn 并且不再使用它,因为 SetWindowRgn 的 MSDN 文档指出“系统拥有由区域句柄 hRgn 指定的区域”。

这是问题所在:

该按钮最初仅显示为一个圆圈。但是,单击并按住时,会出现完整的方形位图,圆圈周围有空白区域。然而,在发布后,只有圆圈再次出现。

这是我尝试的解决方案:

单击按钮后,请在按钮周围重新绘制主窗口。然后,在主窗口的 WndProc 中,我执行以下操作:

case WM_PARENTNOTIFY:
    if ((int)wParam == WM_LBUTTONDOWN)
    {
        PAINTSTRUCT ps;
        BeginPaint(hWnd, &ps);
        pRenderTarget->BeginDraw();
        // paint the background surrounding the button in another function
        pRenderTarget->EndDraw();
        EndPaint(hWnd, &ps);
    }

然而,这并没有明显的效果。释放鼠标后按钮显示为圆形,但按住鼠标时显示为正方形。

关于我哪里出错的任何想法?

4

1 回答 1

0

您的重绘例程不正确。BeginPaint()应该只用于响应WM_PAINT消息 - 它告诉您某些东西很脏并且需要重新粉刷。您要做的是触发该机制,而您这样做的方式是使用InvalidateRect()标记父窗口的适当区域以进行重绘。

即使这确实对您有所改善,我认为您最终会出现闪烁,这可能是不可接受的。您可以研究的另一种机制是让按钮所有者绘制,因为您可以在同一步骤中将其绘制为圆形(并使父窗口无效)。

于 2013-10-17T19:37:22.707 回答