プロパティシート

[戻る]
まかろに 2004/10/07(木) 20:12:21
プロパティシートの[OK]ボタンとかを全て消したいのですが
どうすればよろしいでしょうか?
アドバイスをお願いします。

REE 2004/10/07(木) 20:22:50
ボタンが不要であれば、プロパティシートを使う必要がないのでは?
自前で一からダイアログを作るというのが、一番近道だと思います。

まかろに 2004/10/07(木) 21:29:47
レスありがとうございます。

子のウィンドウに自分で作ったダイアログを使うというのが
よくわからなくて、タブをつけてスライダーとかいろいろ配置したかったので
プロパティシートを使えばまだ簡単かなと思いまして・・・
もっといい方法があるなら教えていただけるとうれしいです。

すいません。初心者なのでわけわからないことを言ってるかもしれませんが
よろしくお願いします。

tib 2004/10/07(木) 23:15:31
OKボタンのリソースIDは「IDOK」です。
CancelボタンのリソースIDは「IDCANCEL」です。
ApplyボタンのリソースIDは「IDAPPLY」です。

リソースIDが解れば、あとはCWnd::ShowWindow()。

まかろに 2004/10/07(木) 23:51:58
なるほど、ありがとうございます。
さっそく試してみたのですが、エラーが…
下記のコードなのですが、どこが間違っているのか
教えていただけますでしょうか?
本当に素人ですいません…


Cmypsheet      mysheet("プロパティシートテスト");
CWnd      *pWnd;
    
pWnd = mysheet.GetDlgItem(IDOK);
pWnd->ShowWindow(FALSE);

tib 2004/10/08(金) 00:08:00
どういうエラーが出ているのかは解りませんか?

まかろに 2004/10/08(金) 02:25:03
エラーというか、アサートに引っかかってるのでしょうか。

Debug Assertion Failed!

Program:C:\〜.exe
File:winocc.cpp
Line:76

For infomation on how your Program can cause an assertion
failure,see the Visual C++ documentation on asserts

(Press Retry to debug the application)

出てくるウィンドウをそのまま書いてみました。
ここで、中止、再試行、無視と選べるのですが
再試行を選択すると、強制終了になります。

根本的に何か間違っているのでしょうか?
よきアドバイスをお願いします。

monkey 2004/10/08(金) 08:34:19
01 > Cmypsheet      mysheet("プロパティシートテスト");
02 > CWnd      *pWnd;
03 > pWnd = mysheet.GetDlgItem(IDOK);
04 > pWnd->ShowWindow(FALSE);

Cmysheetクラスのオブジェクトは生成されていますが(01)、プロパティシートのウィン
ドウは作成されていません。
したがって、"IDOK"で識別されるコントロール(ウィンドウ)が存在しておらず、
GetDltItem関数は有効なポインタを返さない(03)ので、ShowWindow関数呼び出し(04)の
ところでアサートしたものと思われます。
CPropertySheet::Create関数(モードレス)、または、CPropertySheet::DoModal関数
(モーダル)によって、プロパティシートのウィンドウを作成、表示してください。
これらの使用法は、MSDN MFCライブラリリファレンスを参照してください。

PATIO 2004/10/08(金) 09:48:02
プロパティシートは便利ですけれど、自動化されているので細かい事を言い出すと
ただ使うだけではすまないようになります。色々とカスタマイズするには、
それなりの知識がいりますからその辺の勉強もしないと使いこなせないでしょう。
ボタンを隠すにしてもそれなりに知識が必要です。

どういう状況でプログラミングをされているのかわかりませんけれど、
勉強の為にされているのであれば、自分でダイアログを作成する事から
勉強した方がいいと思いますよ。Tabコントロールの使い方も覚えておけば、
なお良いと思います。
コントロールもダイアログも結局は全てウインドウである事を理解できれば、
どう使えばうまく行くかもわかってくると思います。
ウインドウの制御をきちんとできるのが前提ではありますけれども。
そういう意味ではウインドウの振る舞いとか制御するにはどうするかを
勉強すると良いかもしれませんね。応用がきく知識ですから。

Rrr 2004/10/08(金) 10:24:46
>プロパティシートの[OK]ボタンとかを全て消したいのですが

ダイアログ上にモードレスプロパティシートを置くような形態にするだけで
標準のボタンは全部消えるはずだけど。

まかろに 2004/10/08(金) 18:16:23
たびたびお世話になります。

PATIOさん >
全くおっしゃる通りで、まだまだ勉強が足りません。
さらに精進を続けていこうと思います。
やはり基本はウィンドウですよね。

monkeyさん、Rrrさん >
ご指摘ありがとうございます。
さっそくMSDNのリファレンスを見てみました。

今まではDoModalで表示していたのですが
この関数は何かボタンが押されない限り
それ以降に進まないのですかね?
ちなみにソースは

Cmypsheet     mysheet("プロパティシートテスト");
int       ret;

ret = mysheet.DoModal();

となっているのですが、この関数でウィンドウの作成&表示で
抜けたらウィンドウ破棄ですよね?(こ、この時点で間違ってるのでしょうか?)
てことは、ShowWindow でボタンを消すというコードを
どこにはさめばいいのでしょうか…

さらに、モードレスも試してみたのですが

mysheet.Create();

こちらは、シートが一瞬だけ表示されてすぐに消えてしまいます。
戻り値を見てみると、[OK] が押されたような感じになっています。

という状況でして、さらにこんがらがっております。
本当に恐縮なのですが、救いの手をよろしくお願いします。
長文・駄文、失礼致しました。

Rrr 2004/10/08(金) 19:28:45
私が言った方法は...
新たにダイアログを作って DoModal() で起動し、
そのダイアログの内部に子ウィンドウ(WS_CHILD)としてプロパティシートを
作成するものです。

手順としては、

・新しいダイアログをダイアログエディタで作成し、CDialog派生クラスを作る
・そのダイアログのメンバー変数にプロパティシートを加える
  (例: CMyPropertySheet m_sheet)
・そのダイアログを DoModal() で起動
・OnInitDialog() の中で m_sheet.Create(this, WS_CHILD | WS_VISIBLE) を実行

な感じ。
これで標準ボタンがひとつも無いプロパティシートの出来上がり。

Rrr 2004/10/08(金) 19:52:59
補足。

VC++6.0 なら
[プロジェクト]-[プロジェクトへ追加]-[コンポーネントおよびコントロール]で
「Visual C++ Compornents」の中から「プロパティシート」を選択すれば
モードレスプロパティシートを簡単に作ることができます。
ただし、それだと CMiniFrameWnd の内部にプロパティシートを作るものになりますが、
参考にはなると思います。

#ところで上記のようなコントロールギャラリは VC++.net に見当たらないんですが、
#無くなったんですかね?
#どなたかご存知でしょうか?

まかろに 2004/10/09(土) 10:38:48
Rrrさん >
なるほど、ちょっと勘違いしていました。
早速試してみようと思います。

モードレスの方はよいとして
Modal()で表示した場合のボタンの消し方(どこにコードをはさむか?)も
やっぱり引っかかりますので教えていただけませんでしょうか。

いつまでも引っ張って、申し訳ありません。
どうぞよろしくお願いします。

monkey 2004/10/09(土) 13:33:28
> Modal()で表示した場合のボタンの消し方(どこにコードをはさむか?)

CmypsheetクラスのOnInitDialog関数内ではどうでしょう。

まかろに 2004/10/09(土) 17:57:51
[[解決]]
monkeyさん >
うまくいきました!ありがとうございます。
かなりすっきりしました。

初めてこの掲示板で書き込みさせてもらったのですが
これほど懇切丁寧に教えていただけるとは思いませんでした。
まだまだ修行中の身なのでまた色々と質問させていただくと思いますが
その折はよろしくお願いします。
返答いただいた皆様に感謝です。

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