チェックボックスのAutoプロパティについて – プログラミング – Home

チェックボックスのAutoプロパティに...
 
通知
すべてクリア

[解決済] チェックボックスのAutoプロパティについて


ぷらす
 ぷらす
(@ぷらす)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

WindowsXP SP2
Visual Studio 2005 MFCです。

ダイアログボックス上に配置したチェックボックスについて質問があります。

チェックボックスのプロパティのAutoをFalseにすると、アプリケーション実行時に
マウスでクリックしてもチェックボックスのオン、オフ状態を切り替えることが
出来なくなります。

このAutoプロパティのTrue,Falseをプログラム上で動的に設定するにはどのように
すればよいでしょうか。


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

クリックイベントで CButton::SetCheck すればよいかと。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

Autoプロパティってのは、Trueの時にはプログラム上にチェックを制御するコードを
書かなくてもよい。プログラム上で複雑な制御を行いたい時にはFalseにしてコード
を書く。
っていう風に使うんだと思っているんだけど、「Autoプロパティをプログラムから
動的に設定する」ってどういう使い道があるんだろう?

多分そんなことはできない。
第一、そんなことが出来たとして、Falseの時にはチェックボタンを制御するコード
が必要で、Trueになったら、わざわざ、そのコードを動作しないようにする必要が
出てくるでしょ。そんな無駄なことをやる必要は無いと思う。

素直にFalseにして、aetosさんの言うとおり
> クリックイベントで CButton::SetCheck すればよいかと。
とするのが一番。


返信引用
ぷらす
 ぷらす
(@ぷらす)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

aetosさん、maruさん、お世話になります。

>っていう風に使うんだと思っているんだけど、「Autoプロパティをプログラムから
>動的に設定する」ってどういう使い道があるんだろう?

使い道として、こんなことを考えています。
ダイアログ上にエディットボックスやチェックボックスを配置して、
そこにiniファイルから読み込んだ値を設定する。
このダイアログをデータ変更用として使うときはAutoプロパティをTrueにする。
データ参照用として使うときはAutoプロパティをFalseにする。

EnableWindowを使うと希望している動作になるのですが淡色表示となるので
他の方法を探していたときに、C#ではAutoCheckというプロパティで、
プログラムから動的に設定できることが分かり、VC++(MFC)でも同様のことが出来れば
と思い質問させて頂きました。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

ああ、勘違い。
チェックを動的にじゃなくて、Auto を動的にですか。
CButton::SetButtonStyle で BS_AUTOCHECKBOX をつけ外ししてやればいいと思います。

が、個人的に、淡色じゃないのに押しても変わらないチェックボックスは混乱すると思
うので嫌いです。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

>このAutoプロパティのTrue,Falseをプログラム上で動的に設定するにはどのように
>すればよいでしょうか。

当該のチェックボックスをhwnd_chとすると

LONG_PTR Style = ::GetWindowLongPtr( hwnd_ch, GWL_STYLE);
Style |= BS_AUTOCHECKBOX;
::SetWindowLongPtr( hwnd_ch, GWL_STYLE, Style);
::SetWindowPos( hwnd_ch, NULL, 0, 0, 0, 0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW);

で、できると思います。
ですが、他の回答者のおっしゃるとおり、あまり意味はないでしょう。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

知識の無さをろていしてしまった。orz

と思って追試してみました。
Autoチェックボックスを作成し、別のボタンでスタイルをチェンジ!
UINT flag = m_check.GetButtonStyle();
if (flag & BS_AUTOCHECKBOX)
{ flag &= ~BS_AUTOCHECKBOX;
} else
{ flag |= BS_AUTOCHECKBOX;
}
m_check.SetButtonStyle(flag);
何とチェックボックスはプッシュボタンになってしまいました。

BS_AUTOCHECKBOXを調べてみたら、
/*
* Button Control Styles
*/
#define BS_PUSHBUTTON 0x00000000L
#define BS_DEFPUSHBUTTON 0x00000001L
#define BS_CHECKBOX 0x00000002L
#define BS_AUTOCHECKBOX 0x00000003L

これじゃあスタイルを変更するだけじゃダメで、毎回Createする必要がありそう。

> が、個人的に、淡色じゃないのに押しても変わらないチェックボックスは混乱すると

> うので嫌いです。
同意。操作できないコントロールはグレイ表示になっている方が親切と思う。


返信引用
maru
 maru
(@maru)
ゲスト
結合: 17年前
投稿: 358
 

ちょっとコードを変更して、

UINT flag = m_check2.GetButtonStyle();
if (flag == BS_AUTOCHECKBOX)
{ flag = BS_CHECKBOX;
} else
{ flag = BS_AUTOCHECKBOX;
}
m_check2.SetButtonStyle(flag);

これならOK!


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

うーん、
僕だったら、
  ・TrueとFalseのチェックボックスを配置してそれぞれ必要なルーチンを作成する。
  ・データ変更/データ参照のフラグを作成。
  ・OnTimer()等でフラグをチェックしてどちらかのチェックボックスを選択する。
   (ShowWindow()だけでもいいかも?)
だと思います。

たとえ、一つのチェックボックスを切替えることが出来てもコードはそれなりに
複雑になってしまうと思います。


返信引用
ぷらす
 ぷらす
(@ぷらす)
ゲスト
結合: 15年前
投稿: 4
Topic starter  

みなさん、お世話になります。

教えて頂いたコードを試してみました。

仲澤@失業者さんのコードはチェックボックスがプッシュボタンに
変わってしまいました。Styleの設定をいくつか変更してみましたが
うまくできませんでした。

maruさんのコードで動作確認ができました。

ただ、頂いたアドバイスを拝見していると、今回質問したことは
アプリケーションのつくりとしてはあまり行儀のよいものではないのかな、
という気持ちになってきました。
もう一度、画面のデザインから見直してみようと思います。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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