こんばんは。
ただ着色するだけならば、WM_CTLCOLORBTNで、ブラシをすり替えれば良いみたいです。
http://m--takahashi.com/bbs/pastlog/07200/07144.html
どちらにしろ、「押されて凹んだ・テキスト表示」等は、WM_DRAWITEMを処理する羽目に陥るようです。
以下参考程度に(手間は大して変らない事が分かると思います)。
typedef struct __brush
{
HBRUSH hbr;
COLORREF color;
COLORREF arCustColor[16];
} brush;
static brush s_brush = {::CreateSolidBrush(0)};
static int CallCC(HWND hWnd, brush* p)
{
CHOOSECOLOR cc = {sizeof(cc)};
cc.hwndOwner = hWnd;
cc.lpCustColors = p->arCustColor;
cc.rgbResult = p->color;
cc.Flags = CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT;
if(!::ChooseColor(&cc))return 0;
//必ず開放する
if(p->hbr)::DeleteObject(p->hbr);
p->hbr = ::CreateSolidBrush(p->color = cc.rgbResult);
return 1;
}
int CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
const WORD wNotifyCode = HIWORD(wParam);
const WORD wID = LOWORD(wParam);
HWND hwndCtl = (HWND)lParam;
const LPDRAWITEMSTRUCT lpdis = (LPDRAWITEMSTRUCT)lParam;
switch(uMsg)
{
case WM_INITDIALOG:
return FALSE;
case WM_COMMAND:
if(wID != IDC_BUTTON1)
break;
if(::CallCC(hDlg, &s_brush))
{
::InvalidateRect(hwndCtl, 0, TRUE);
}
break;
case WM_CTLCOLORBTN:
if(::GetDlgCtrlID((HWND)lParam) == IDC_BUTTON1)
{
HDC hDC = (HDC)wParam;
::SetBkMode(hDC, TRANSPARENT);
//テキスト色はブラシの色を反転させたものにする
::SetTextColor(hDC, ~s_brush.color & 0xffffff);
return (BOOL)s_brush.hbr;
}
break;
case WM_DRAWITEM:
if(lpdis->CtlID != IDC_BUTTON1)
break;
switch(lpdis->itemAction)
{
case ODA_SELECT:
::DrawEdge(lpdis->hDC, &lpdis->rcItem, BDR_SUNKENINNER, BF_RECT);
break;
case ODA_FOCUS:
::DrawFocusRect(lpdis->hDC, &lpdis->rcItem);
break;
case ODA_DRAWENTIRE:
::FillRect(lpdis->hDC, &lpdis->rcItem, s_brush.hbr);
::DrawText(lpdis->hDC, "色彩選択", 8, &lpdis->rcItem, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
}
return FALSE;
}
お礼
回答ありがとうございます。 どっちにしろ手間がかかるのですね。 ボタンの色のみ変更は普通にあると思っていたのですが、 案外、ないものなんですね。