私の 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 を実行している場合も、必要だとは感じませんでした。考え?