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

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

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

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

Q&A

1回答

4189閲覧

VC++ ボタンフォーカス時の処理が実行されない

architect

総合スコア17

Visual C++

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

0グッド

0クリップ

投稿2015/10/28 04:51

編集2015/10/28 04:58

下記のプログラムを実行するとステータスが0×0100と0×0300しか返ってこず、
if分が実行されません。

MFCダイアログでは上手く実行できますが、
ActiveXでは上手く実行できません。
原因がわからず困っています。

この記述だとActiveXでは上手くいかないのでしょうか?
UINT nState = lpDrawItemStruct->itemState;

現状:ボタンを押下しても下2ケタの2ビットが取得できない。
<取得したい値>
ODS_SELECTED 0x0001
ODS_FOCUS 0x0010

開発環境
・Visual Studio 2008
・ActiveXコントロール
・Windows7

VC++

1void CAXSMPCtrl::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 2{ 3 // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 4 if (lpDrawItemStruct->CtlType == ODT_BUTTON) { 5 if (nIDCtl == IDC_BUTTON1) { 6 CDC dc; 7 dc.Attach(lpDrawItemStruct->hDC); 8 CRect rect(lpDrawItemStruct->rcItem); 9 10 CDC* pDC = &dc; 11 CString strCaption; 12 UINT nState = lpDrawItemStruct->itemState; 13 CRect focusRect, btnRect; 14 focusRect.CopyRect(&lpDrawItemStruct->rcItem); 15 btnRect.CopyRect(&lpDrawItemStruct->rcItem); 16 17 // フォーカス矩形領域の作成 18 focusRect.left += 4; 19 focusRect.right -= 4; 20 focusRect.top += 4; 21 focusRect.bottom -= 4; 22 23 // ボタンのキャプションを取得 24 m_pButton1->GetWindowText(strCaption); 25 26 // ボタンの描画(背景色、エッジ、キャプション) 27 DrawBkGround(pDC, btnRect, GetBackGroundColor()); 28 DrawCaption(pDC, btnRect, GetTextColor(),strCaption); 29 pDC->DrawEdge(btnRect,EDGE_RAISED,BF_RECT); 30 31 // フォーカスを得たときや選択されているとき 32 if (nState & ODS_FOCUS) 33 { 34 if (nState & ODS_SELECTED) 35 { 36 pDC->DrawEdge(btnRect,EDGE_SUNKEN,BF_RECT); 37 } 38 pDC->DrawFocusRect(focusRect); 39 }// ボタンが無効であるとき 40 else if(nState & ODS_DISABLED) 41 { 42 DrawCaption(pDC, btnRect, GetDisabledColor(), strCaption); 43 } 44 dc.Detach(); 45 return; 46 } 47 COleControl::OnDrawItem(nIDCtl, lpDrawItemStruct); 48 } 49}

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

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

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

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

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

guest

回答1

0

私も実験してみましたがフォーカスに関してはDRAWITEMSTRUCT のitemStateメンバにはフラグがセットされないみたいですね。

ちょっと見方を変えてhwndItemメンバがAPI関数GetFocus()で取得できるウィンドウハンドルと一致するかどうかで判定してみてはどうでしょうか?

投稿2015/10/28 06:30

KoichiSugiyama

総合スコア3041

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

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

architect

2015/10/28 12:22

上手くできませんでした... 回答ありがとうございました。
KoichiSugiyama

2015/10/28 13:13

私のところでは”if (nState & ODS_FOCUS)”を" if (lpDrawItemStruct->hwndItem == ::GetFocus())"に変えると、ボタンをマウスでクリックした際に"if (nState & ODS_SELECTED)"の中の処理に入りました。ご参考まで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問