チェックボックスとボタンの判別

[戻る]
茶々 2005/09/02(金) 17:56:57
お世話になります。
開発環境はWinXP so2/VC++6.0 sp6 MFC使用です。

今使用しているアプリケーションで
リソースのダイアログエディタに
チェックボックスとボタンを配置して
使用しています。

その配置したコントロールは自作の
CButtonから派生したクラスのコントロール
として使用しています。

とある理由があって、プログラム内で
そのコントロールがチェックボックスなのか
ボタンなのかを判別しなければならなくなりました。

そのコントロールのスタイルで判別しようとしたのですが
GetStyle()や、GetExStyle()だと、
チェックボックス、ボタン共に同じ値が
帰ってきてしまいます。

プログラム内で作成したコントロールが
チェックボックスなのかボタンなのかを
判別するにはどうしたらいいのでしょうか。
どうぞご教授ください。

よろしくお願いいたします。

REE 2005/09/02(金) 18:37:37
BS_CHECKBOXスタイルが違うはずでは?

tib 2005/09/02(金) 18:44:06
REEさんの指摘が正しいと確認しつつ、

CButton::SetCheck(), GetCheck() が、pushbuttonの場合はそれぞれ
 SetCheck() → 常にゼロを返す。
 GetCheck() → 無視される
というのを利用して、そのボタンに「1」をsetしてみて、getした結果が1ならcheckbox、
0ならpushbutton、という判定はダメでしょうか。

もちろん、SetCheck()する前に現在地を保存しておくとして。

tib 2005/09/02(金) 18:45:07
逆だ。

誤:
 SetCheck() → 常にゼロを返す。
 GetCheck() → 無視される

正:
 SetCheck() → 無視される。
 GetCheck() → 常にゼロを返す。

茶々 2005/09/02(金) 18:53:29
REEさん、回答ありがとうございます。

コントロールを判別したいのは
自作のクラスがオーナードローのボタンクラスで、
その描画処理をチェックボックスとボタンで
分けたいからなのです。

そこで、自作クラスのDrawItemの中で
REEさんがおっしゃっているBS_CHECKBOXで
判別しようと

void CHogeButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
  DWORD dwStyle = GetStyle();

  if(dwStyle & BS_CHECKBOX)
  {
    //チェックボックスもボタンもここを通る
    DrawCheckBox(lpDrawItemStruct);
  }    
  else
  {
    DrawButton(lpDrawItemStruct);
  }
}

としてみたのですがチェックボックスもボタンも
DrawCheckBox()の方を通ってしまいます。
おかしな点があればご指摘いただきたいのですが・・・

茶々 2005/09/02(金) 19:05:24
tibさん、回答ありがとうございます。
教えていただいた手順に従って
下のようにしたところ、
処理を分けることができました。

void CHogeButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
  WORD dwStyle = GetStyle();

  int nState = GetCheck();

  SetCheck(1, FALSE);

  if(GetCheck() != 1)
  {
    DrawButton(lpDrawItemStruct);
  }
  else
  {
    SetCheck(nState, FALSE);
    DrawChecBBox(lpDrawItemStruct);
  }
}

ありがとうございました。

・・・ただひとつ気になるのはなぜREEさんが
おっしゃっている方法で判別できなかったかなのですが・・・

茶々 2005/09/02(金) 19:07:10
[[解決]]
あう、誤植・・・

誤:DrawChecBBox(lpDrawItemStruct);

正:DrawCheckBox(lpDrawItemStruct);

dairygoods 2005/09/02(金) 19:56:22
>・・・ただひとつ気になるのはなぜREEさんが
>おっしゃっている方法で判別できなかったかなのですが・・・

BS_PUSHBUTTON,BS_CHECKBOX,BS_OWNERDRAW の値を調べてみると良いと思います。

PATIO 2005/09/05(月) 16:10:32
要は判定方法に問題があったということですね。
1bit単位で割り振られているわけではないと言う事に気が付けば分かると思います。

茶々 2005/09/05(月) 22:16:44
dairygoodsさん、PATIOさん、回答ありがとうございます。
あんど回答が送れて申し訳ありません。

>BS_PUSHBUTTON,BS_CHECKBOX,BS_OWNERDRAW の値を調べてみると良いと思います。
>要は判定方法に問題があったということですね。

との事なので調べてみました。
BS_PUSHBUTTON : 0x00000000L
BS_CHECKBOX   : 0x00000002L
BS_OWNERDRAW  : 0x0000000bL
なるほど、オーナードローだと必ず(BS_OWNERDRAW & BS_CHECKBOX)が
真になるんですね。

REEさん、tibさん、キモの部分を省略した質問をしてしまってすみませんでした。

>1bit単位で割り振られているわけではないと言う事に気が付けば分かると思います。
・・・でも、同じクラスでラジオボタンや
グループボックスを描画するときはどうするんでしょうか。
BS_RADIOBUTTON: 0x00000004L
BS_GROUPBOX   : 0x00000007L
なのでこの場合だけビット演算して描画しようとするコントロールを
判別するんでしょうか・・・むー、違和感があるのは私だけでしょうか。

PATIO 2005/09/07(水) 14:00:34
>>1bit単位で割り振られているわけではないと言う事に気が付けば分かると思います。
>・・・でも、同じクラスでラジオボタンや
>グループボックスを描画するときはどうするんでしょうか。
>BS_RADIOBUTTON: 0x00000004L
>BS_GROUPBOX   : 0x00000007L
>なのでこの場合だけビット演算して描画しようとするコントロールを
>判別するんでしょうか・・・むー、違和感があるのは私だけでしょうか。

いえ、この場合は、0x0000000fでマスクして、== BS_GROUPBOXとかでは?
1ビット単位で割り振られているわけではないと言うのはそういう意味です。
この場合は8bitで一つの意味をなしていると見ればよいのではないかと。

古いスレッドには追加発言できません。