绘制圆形和彩色所有者绘制按钮

时间:2013-05-01 05:42:59

标签: windows winapi win32gui

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

0 个答案:

没有答案