
環境:Windows XP Home、Visual C++
WINAPIにてボタンの色を変更したいと思っております。
ですので、オーナードローで作成しようと思ったのですが、
色だけ変更したいだけなのに文字列やその他といった、
全てを自分で書かなくちゃいけなくなりました。
他に簡単に出来る方法は無いのでしょうか?
以下に一応、したい事を記述します。
ボタンをクリックした時に、
ChooseColorダイアログを表示して、選択させる。
もしOKでダイアログを閉じた場合、
ボタンはそこで選択した色に変更させる。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
こんばんは。
ただ着色するだけならば、WM_CTLCOLORBTNで、ブラシをすり替えれば良いみたいです。
http://m--takahashi.com/bbs/pastlog/07200/07144. …
どちらにしろ、「押されて凹んだ・テキスト表示」等は、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;
}
回答ありがとうございます。
どっちにしろ手間がかかるのですね。
ボタンの色のみ変更は普通にあると思っていたのですが、
案外、ないものなんですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ウィンドウサイズを変更しても...
-
エラー Run-Time Check Failur...
-
ボタンの色(WINAPI)
-
最早開始時間と最遅完了時刻を...
-
20'(角度)の計算がわかりま...
-
信頼区間の1.96や1.65ってどこ...
-
Aの値からBの値を除するとは??
-
数字以外が入力されたらエラー...
-
値差の%計算方法について
-
「Aに対するBの割合」と「Aに対...
-
#defineが使用するメモリ領域に...
-
cout関数を使っているのですが...
-
2÷3などの余りについて
-
構造体の勉強中です 合計点の高...
-
main.c:7:43: warning: implici...
-
C言語 エラーの原因がわからな...
-
CTabCtrl:TABインデックス単位...
-
ExcelでPC(パソコン)によって...
-
#define _CRT_SECURE_NO_WARNIN...
-
(マルチスレッド)_beginthrea...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
エラー Run-Time Check Failur...
-
Win32APIでウィンドウを中央に...
-
ウィンドウサイズを変更しても...
-
音量調節
-
1~1000,1001~2000の間に素数が...
-
この列挙体でsysjanの関数はあ...
-
子ウインドウの作成と破棄について
-
Win32のファイルダイアログのサ...
-
ウィンドウ非表示に時に表示し...
-
COMPORTマルチスレッドで例外発生
-
ボタンの色(WINAPI)
-
マウスの反応
-
ポップアップメニュー
-
C言語win32api、エディットボッ...
-
ウィンドウが表示されない
-
WM_CREATE について
-
c言語のプログラミングでキーボ...
-
C++のcase文の書き方
-
LoadImageとSetCursorについて
おすすめ情報