
環境: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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) VBAで早押しゲームを作りたい 4 2022/05/12 13:46
- Excel(エクセル) マクロでボタンにつける名前がどこに設定されているかわからないケースがありました。 1 2023/06/19 19:37
- Access(アクセス) Access 登録ボタンからサブフォームの更新 1 2022/07/22 10:23
- Visual Basic(VBA) VBA 複数のブックに同じ列を表示させる方法 2 2022/07/20 23:49
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- JavaScript jsで診断コンテンツのページ内切り替えについて 1 2023/04/14 17:31
- その他(Microsoft Office) Office(Windows版,Word/Excel/PowerPoint等)にログインできません 4 2022/07/24 15:18
- Windows 10 Windows 10 ノートのディスプレイが暗いです 6 2023/07/16 12:59
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
WinAPIでの画像高速切り替え表...
-
ツリーコントロールの開閉アイ...
-
MoveToExとLineToについて
-
Win32 APIに関する質問
-
別関数に渡す変数のポインタが...
-
ウィンドウが表示されない
-
画像を表示したいのですが……
-
return文がない場合の戻り値は...
-
「Aに対するBの割合」と「Aに対...
-
fgetsなどのときのstdinのバッ...
-
信頼区間の1.96や1.65ってどこ...
-
Aの値からBの値を除するとは??
-
複数桁10進数の*桁目だけを抽出...
-
visualstudio C# テキストボッ...
-
#define _CRT_SECURE_NO_WARNIN...
-
このプログラムの実行結果につ...
-
C# 除算
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
-
getchar()を int でとる理由...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
ウィンドウ非表示に時に表示し...
-
エラー Run-Time Check Failur...
-
Win32APIにて、ウィンドウ全体...
-
ボタンの色(WINAPI)
-
ダイアログプログラムでEnterキ...
-
C#のswitch文を簡略化したいの...
-
オーバーレイみたいな処理がしたい
-
Win32APIでウィンドウを中央に...
-
プログラミングでエラーが出ま...
-
ツリーコントロールの開閉アイ...
-
なぜhButton1ボタンからのWM_CO...
-
C言語win32api、エディットボッ...
-
LoadImageとSetCursorについて
-
コンソールアプリケーションの...
-
画像を表示したいのですが……
-
MoveToExとLineToについて
-
ウィンドウのサイズ変更について
-
ボタンのアイコン表示
-
トラックのループの仕方
おすすめ情報