チェックボックスのAutoプロパティについて

[戻る]
ぷらす 2010/01/05(火) 12:14:25
WindowsXP SP2
Visual Studio 2005 MFCです。

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

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

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

aetos 2010/01/05(火) 15:09:52
クリックイベントで CButton::SetCheck すればよいかと。

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

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

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

ぷらす 2010/01/05(火) 16:14:40
aetosさん、maruさん、お世話になります。

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

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


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

aetos 2010/01/05(火) 16:41:12
ああ、勘違い。
チェックを動的にじゃなくて、Auto を動的にですか。
CButton::SetButtonStyle で BS_AUTOCHECKBOX をつけ外ししてやればいいと思います。

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

仲澤@失業者 2010/01/05(火) 16:45:39
>この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 2010/01/05(火) 17:14:00
知識の無さをろていしてしまった。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 2010/01/05(火) 17:40:47
ちょっとコードを変更して、

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

これならOK!

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

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

ぷらす 2010/01/05(火) 19:17:22
[[解決]]
みなさん、お世話になります。

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

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

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

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

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

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