在我的 Windows 应用程序中,我正在使用 CreateWindow() API 创建子按钮窗口。我将按钮的样式标记为 BS_OWNERDRAW,因为我想着色相同并且还想让它们变圆。这是我的 WM_DRAWITEM 处理:
case WM_DRAWITEM:
{
RECT wndrect;
pdi = (DRAWITEMSTRUCT*)lParam;
GetWindowRect(pdi->hwndItem,&wndrect);
hRgn =CreateRoundRectRgn(0,0,(wndrect.right-wndrect.left),(wndrect.bottom - wndrect.top),8,8);
//SetWindowRgn(pdi->hwndItem,hRgn,TRUE);
DrawColorButton(pdi->hDC,pdi->hwndItem,0/*Control id to be used*/,pdi->itemState,hRgn);
DeleteObject(hRgn);
return TRUE;
}
void DrawColorButton(HDC hdc,HWND hWnd ,int iControlid/*unused*/,UINT iState, HRGN hRgn)
{
RECT rect;
int iWidth,iHeight;
char str[100]={0};
UINT oldAlign;
GetClientRect(hWnd,&rect);
GetWindowText(hWnd,str,sizeof(str));
iWidth = rect.right - rect.left;
iHeight = rect.bottom - rect.top;
SetWindowRgn(hWnd,hRgn,TRUE);
SetBkMode(hdc,TRANSPARENT);
if(iState & ODS_DISABLED)
{
FillRect(hdc,&rect,CreateSolidBrush(GetSysColor(COLOR_INACTIVEBORDER)));
SetTextColor(hdc,GetSysColor(COLOR_SCROLLBAR));
}
else
{
FillRect(hdc,&rect,CreateSolidBrush(RGB(100,225,255)));
//FillRgn(hdc,hRgn,CreateSolidBrush(RGB(100,225,255)));
//SetBkColor(hdc,RGB(100,225,255));
}
}
这段代码的行为非常间歇和奇怪。当窗口第一次打开时,所有按钮都被正确地圆角和着色。如果我最小化和最大化窗口,圆角区域消失,整个按钮矩形被颜色填充。在我看来,FillRect() API 导致了这个问题,因为评论说我可以在 UI 上一致地看到圆形(虽然无色)。我尝试了其他 Api,例如 FillRgn() 和 SetBkColor(),但它们都没有为该区域填充任何颜色。
WM_COLORBTN 与它有关吗?我没有在我的代码中处理它,因为在这种情况下我将无法直接获取状态。如果我在做 WM_DRAWITEM,我也觉得没有必要。想法?