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));
    }
}

このコードでは、非常に断続的で奇妙な動作が発生します。ウィンドウが初めて開いたとき、すべてのボタンが適切に丸みを帯び、色付けされています。ウィンドウを最小化して最大化すると、丸みを帯びた領域が消え、ボタンの四角形全体が色で塗りつぶされます。UIで丸みを帯びた形状(無色ですが)が一貫して見えるとコメントしているため、FillRect()APIが問題を引き起こしているようです。FillRgn() や SetBkColor() などの他の Api を試しましたが、領域に色を塗りつぶすものはありませんでした。

WM_COLORBTN はそれと何か関係がありますか? その場合、状態を直接取​​得できないため、コードでそれを処理しませんでした。WM_DRAWITEM を実行している場合も、必要だとは感じませんでした。考え?

4

0 に答える 0