環境: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も見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
いけず言葉しりとり
はんなりと心にダメージを与える「いけず言葉」でしりとりをしましょう。 「あ」あら〜しゃれた服着てはりますな 遠くからでもわかりましたわ
-
とっておきの「まかない飯」を教えて下さい!
飲食店で働く方だけが食べられる、とっておきの「まかない飯」。 働いてらっしゃる方がSNSなどにアップしているのを見ると、表のメニューには出てこない秘密感もあって、「食べたい!!」と毎回思ってしまいます。
-
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
プシュボタンのテキストの色を変更したい
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
-
4
画面を強制的に再描画させる方法
C言語・C++・C#
-
5
ボタンの背景色を変更する方法
C言語・C++・C#
-
6
ウィンドウやボタンコントロールの色を変えたい
C言語・C++・C#
-
7
Win32APIでのエディットボックスの文字化け
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エディットコントロール入力時...
-
プログラミングでエラーが出ま...
-
エディットボックスの背景の色...
-
エラー Run-Time Check Failur...
-
音量調節
-
Win32APIでウィンドウを中央に...
-
1~1000,1001~2000の間に素数が...
-
c言語のプログラミングでキーボ...
-
オーバーレイみたいな処理がしたい
-
「指定されたキャストは有効で...
-
DWORDの実際の型は何でしょうか
-
プログラムでの数字につく”f”の...
-
プログラミング初心者です。 Py...
-
信頼区間の1.96や1.65ってどこ...
-
C言語での引数の省略方法
-
20'(角度)の計算がわかりま...
-
エクセルで可視セルにのみ値貼...
-
「Aに対するBの割合」と「Aに対...
-
Enterキーを押されたら次の処理...
-
ある商品のロス率を5%見込み、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
音量調節
-
エラー Run-Time Check Failur...
-
Win32APIでウィンドウを中央に...
-
return文がない場合の戻り値は...
-
1~1000,1001~2000の間に素数が...
-
ダイアログプログラムでEnterキ...
-
ボタンの色(WINAPI)
-
C言語win32api、エディットボッ...
-
MessageBoxについて
-
プログラミングでエラーが出ま...
-
キャレットの現在位置の表示 (W...
-
エディットボックスの背景の色...
-
エディットコントロール入力時...
-
オーバーレイみたいな処理がしたい
-
ウィンドウのサイズ変更について
-
C#のswitch文を簡略化したいの...
-
猫でもわかるWindowsプログラミ...
-
WM_INITDIALOGのフック
-
MoveToExとLineToについて
-
【Windowsアプリ】ファイルのド...
おすすめ情報