質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

解決済

1回答

2597閲覧

VC++ ActiveX  ボタンの色???

architect

総合スコア17

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

0クリップ

投稿2015/10/27 06:57

MFCプロジェクトではボタンに色をつけることができましたが、
本命のActiveXコントロールプロジェクトでのボタンの色の付け方がわかりません。。。

ソースのサンプルや参考サイトをご存知の方、ご教示願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KoichiSugiyama

2015/10/27 08:10

他にも似たような質問を連発されていますが、情報不足で的確な回答が集まっていないのだと思います(後出しの情報が多い気がします)。ここらで、詳細に情報を書いてみてはどうでしょうか?VC++のプロジェクトは作成時に選択するオプションによって、全く別のライブラリやフレームワークを使うことになりますので、ノウハウが全く使いまわせないこともあります。まずは今回ActiveXを作成されていますが、MFCでActiveXを作るのか、ATLで作るのかどちらか書いてください。
architect

2015/10/27 08:13

MFCでActiveXを作ります
KoichiSugiyama

2015/10/27 08:15

MFCプロジェクトでボタンの色を付けることができた際のコードがActiveXではうまくいかなかったと解釈しますが、そのコードを一部でも掲載できませんか?
guest

回答1

0

ベストアンサー

ちょっといろいろ試してみましたが、ActiveXの場合ボタンをオーナードロースタイルにして、自分で描いてやる必要がありそうです。

手順としては
1)ボタン作成の際のスタイルに「BS_OWNERDRAW」を追加
2)コントロールクラスに「OnDrawItem」イベントハンドラを追加
3)OnDrawItem内で、引数のコントロールIDが対象のボタンか判断して、対象のボタンならデバイスコンテキストに描画をしてやる

ということになりますが、オーナードローだと、描画全てをコードで記述してやらないといけません。
色はもちろん、表示するテキスト、ボタン枠(3D効果が必要なら効果も)、ボタンの状態によって、変化する部分(無効の場合、フォーカスが当たった場合、ボタンを押された場合のなど)も自力で描画します。

下記に参考サイトのソースをベースに、色を変えるところまで記述したコードを載せますので、あとはいろいろ研究してみてください。

C++

1// CCustomControlCtrl.h 2 3 // メッセージマップに追加 4 afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct); 5 6 // メンバ変数に追加 7 CBrush m_Brush; 8 CButton* m_pButton1;

C++

1// CCustomControlCtrl.cpp 2 3// メッセージ マップ 4BEGIN_MESSAGE_MAP(CCustomControlCtrl, COleControl) 5 ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties) 6 ON_COMMAND(IDC_BUTTON1, CCustomControlCtrl::OnButton1) 7 ON_WM_CREATE() 8 ON_WM_DRAWITEM() 9END_MESSAGE_MAP() 10 11// イベントハンドラ 12int CCustomControlCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 13{ 14 if (COleControl::OnCreate(lpCreateStruct) == -1) 15 return -1; 16 17 // TODO: ここに特定な作成コードを追加してください。 18 m_pButton1 = new CButton(); 19 m_pButton1->Create(L"ボタン1", BS_PUSHBUTTON | BS_OWNERDRAW | WS_VISIBLE, CRect(0,0,99,99), this, IDC_BUTTON1); 20 // ブラシの作成(ボタン背景色:赤) 21 m_Brush.CreateSolidBrush(RGB(255,0,0)); 22 23 return 0; 24} 25 26void CCustomControlCtrl::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 27{ 28 // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 29 if (lpDrawItemStruct->CtlType == ODT_BUTTON) { 30 if (nIDCtl == IDC_BUTTON1) { 31 CDC dc; 32 dc.Attach(lpDrawItemStruct->hDC); 33 CRect rect(lpDrawItemStruct->rcItem); 34 // ボタン背景色を赤に 35 dc.FillRect(rect, &m_Brush); 36 dc.Detach(); 37 return; 38 } 39 } 40 COleControl::OnDrawItem(nIDCtl, lpDrawItemStruct); 41} 42

投稿2015/10/27 14:23

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

architect

2015/10/28 01:58

ご丁寧に対応していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問