0

首先,这是我想要实现的理想外观,但白色区域的圆角,并且没有完全成功 所需的外观,但白色区域的圆角

为了实现这一点,我已经确定了要变为白色的矩形的屏幕坐标,并创建了一个静态文本窗口并使用以下方法设置了一个圆角区域:

case WM_CREATE:
    SetRect( &Rect,... );
                hSubWnd = CreateWindow("STATIC",NULL,SS_LEFT|WS_CHILD|WS_VISIBLE,Rect.left,Rect.top,(Rect.right-Rect.left),(Rect.bottom-Rect.top),hFrame,(HMENU)NULL,NULL,NULL);


                hrgn = CreateRoundRectRgn(Rect.left, Rect.top, Rect.right, Rect.bottom,15,15);
                SetWindowRgn(hSubWnd,hrgn,TRUE);

然后为上面的区域设置着色,我使用了以下内容:

case WM_CTLCOLORSTATIC:
            //SetBkColor((HDC)wParam, RGB(0,0,0));
            if((HWND)lParam == hSubWnd)
            {
                SetBkMode((HDC)wParam,TRANSPARENT);

                return (INT_PTR )CreateSolidBrush(RGB(255,255,255));
            }
            break;

这使得该区域颜色为白色,但白色区域没有像我预期的那样变圆。以下是我的问题:

1-如何使 SetWindowRgn() 为子控件工作?我的方法是正确的还是我需要采取其他方式来实现我的目标(四舍五入孩子的角落)?

2-父窗口启用了 WS_CLIPCHILDREN 样式,这意味着我在主窗口的 WM_PAINT 中所做的任何事情都不会绘制子窗口区域。我还需要将一些文本放在子窗口的白色区域中。我在哪里做呢?TextOut() 似乎在 WM_CTLCOLORSTATIC 处理程序中不起作用。

我是否应该将孩子的窗口类从“STATIC”更改为某个自定义类并为孩子编写 WindowProc(),其中我处理 WM_PAINT 以在其上绘制文本?

请提供您的建议。

4

1 回答 1

2

既然您说您正在处理WM_PAINT您的主窗口以绘制文本,我建议完全跳过子控件和区域的复杂性。

我的意思是,你想要的只是窗口背景上的一个白色圆角矩形?所以自己画吧。使用该RoundRect函数可以轻松完成此操作。

如果您需要静态控件来确定 RoundRect 的坐标(这可以在处理不同的 DPI 设置时使事情变得更容易),您可以将其保留在那里但使其不可见。

示例代码:

void OnPaint(HWND hWnd)
{
    PAINTSTRUCT ps;
    BeginPaint(hWnd, &ps);

    // Create and select a white brush.
    HBRUSH hbrWhite = CreateSolidBrush(RGB(255, 255, 255));
    HBRUSH hbrOrig = SelectObject(ps.hdc, hbrWhite);

    // Create and select a white pen (or a null pen).
    HPEN hpenWhite = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
    HPEN hpenOrig = SelectObject(ps.hdc, hpenWhite);

    // Optionally, determine the coordinates of the invisible static control
    // relative to its parent (this window) so we know where to draw.
    // This is accomplished by calling GetClientRect to retrieve the coordinates
    // and then using MapWindowPoints to transform those coordinates.

    // Draw the RoundRect.
    RoundRect(ps.hdc, Rect.left, Rect.top, Rect.right, Rect.bottom, 15, 15);

    // If you want to draw some text on the RoundRect, this is where you do it.
    SetBkMode(ps.hdc, TRANSPARENT);
    SetTextColor(ps.hdc, RGB(255, 0, 0)); // red text
    DrawText(ps.hdc, TEXT("Sample Text"), -1, &Rect, DT_CENTER);

    // Clean up after ourselves.
    SelectObject(ps.hdc, hbrOrig);
    SelectObject(ps.hdc, hpenOrig);
    DeleteObject(hbrWhite);
    DeleteObject(hpenWhite);
    EndPaint(hWnd, &ps);
}
于 2013-04-17T07:22:46.440 回答