- ベストアンサー
ボタンの色(WINAPI)
環境:Windows XP Home、Visual C++ WINAPIにてボタンの色を変更したいと思っております。 ですので、オーナードローで作成しようと思ったのですが、 色だけ変更したいだけなのに文字列やその他といった、 全てを自分で書かなくちゃいけなくなりました。 他に簡単に出来る方法は無いのでしょうか? 以下に一応、したい事を記述します。 ボタンをクリックした時に、 ChooseColorダイアログを表示して、選択させる。 もしOKでダイアログを閉じた場合、 ボタンはそこで選択した色に変更させる。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 ただ着色するだけならば、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; }
お礼
回答ありがとうございます。 どっちにしろ手間がかかるのですね。 ボタンの色のみ変更は普通にあると思っていたのですが、 案外、ないものなんですね。