在我的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,我也觉得没必要。想法?