2

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

4

0 回答 0