チェックボックスとボタンの判別 – プログラミング – Home

チェックボックスとボタンの判別
 
通知
すべてクリア

[解決済] チェックボックスとボタンの判別


茶々
 茶々
(@茶々)
ゲスト
結合: 20年前
投稿: 10
Topic starter  

お世話になります。
開発環境はWinXP so2/VC++6.0 sp6 MFC使用です。

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

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

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

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

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

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


引用未解決
トピックタグ
REE
 REE
(@REE)
ゲスト
結合: 24年前
投稿: 240
 

BS_CHECKBOXスタイルが違うはずでは?


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

REEさんの指摘が正しいと確認しつつ、

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

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


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

逆だ。

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

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


返信引用
茶々
 茶々
(@茶々)
ゲスト
結合: 20年前
投稿: 10
Topic starter  

REEさん、回答ありがとうございます。

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

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

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

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

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


返信引用
茶々
 茶々
(@茶々)
ゲスト
結合: 20年前
投稿: 10
Topic starter  

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さんが
おっしゃっている方法で判別できなかったかなのですが・・・


返信引用
茶々
 茶々
(@茶々)
ゲスト
結合: 20年前
投稿: 10
Topic starter  

あう、誤植・・・

誤:DrawChecBBox(lpDrawItemStruct);

正:DrawCheckBox(lpDrawItemStruct);


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

要は判定方法に問題があったということですね。
1bit単位で割り振られているわけではないと言う事に気が付けば分かると思います。


返信引用
茶々
 茶々
(@茶々)
ゲスト
結合: 20年前
投稿: 10
Topic starter  

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
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました