首先,这是我想要实现的外观,但是白色区域的圆角,并没有完全成功
为了达到这个目的,我已经确定了矩形的屏幕坐标,这个坐标是白色的,并创建了一个静态文本窗口并使用它设置了一个圆角区域:
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以在其上绘制文本?
请提供您的建议。
答案 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);
}