Winapi win32中的子窗口绘图问题

Winapi win32中的子窗口绘图问题,winapi,win32gui,Winapi,Win32gui,首先,这是我想要实现的理想外观,但是白色区域的圆角,我没有完全成功地做到这一点 为了实现这一点,我已经确定了矩形的屏幕坐标,该矩形将变为白色,并创建了一个静态文本窗口,并使用以下方法设置了一个圆形区域: case WM_CREATE: SetRect( &Rect,... ); hSubWnd = CreateWindow("STATIC",NULL,SS_LEFT|WS_CHILD|WS_VISIBLE,Rect.left,Rect.top,(

首先,这是我想要实现的理想外观,但是白色区域的圆角,我没有完全成功地做到这一点

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

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处理程序中似乎不起作用

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


请提供您的建议。

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

我的意思是,你想要的只是在你的窗口背景上有一个白色的圆形矩形?你自己画吧。这是通过使用函数实现的

如果您需要静态控件来确定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);
}

变量
hrgn
是否为全局变量?调用
SetWindowRgn()
是否返回非零值?听起来不错。非常感谢,我会尝试一下并让你知道。:)有大量的API需要了解。。哈哈…:PDid还没有运行这段代码,只是想理解一下。您制作了一个白色画笔和一支白色钢笔,然后用它来绘制RoundRect()。这是如何设置圆角矩形的背景的?api能解决这个问题吗?正如您在图像中看到的,我想要一个背景,在蓝色窗口背景之上有一个白色圆形矩形。好的,我浏览了RoundRect()的文档并得到了答案。父窗口的背景已经是浅蓝色(我假设)。AllRoundRect所做的是在现有背景的顶部绘制一个白色的圆形矩形。