在win32中的儿童窗口绘图问题

时间:2013-04-17 04:43:33

标签: winapi win32gui

首先,这是我想要实现的外观,但是白色区域的圆角,并没有完全成功 desired look but with rounded  corner of white region

为了达到这个目的,我已经确定了矩形的屏幕坐标,这个坐标是白色的,并创建了一个静态文本窗口并使用它设置了一个圆角区域:

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以在其上绘制文本?

请提供您的建议。

1 个答案:

答案 0 :(得分: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);
}