MFC
Re:MFC
ちょっと意味がわからないのですが、ダイアログのリソースでボーダーを「サイズ変更枠」にするのではなく、動的にサイズ変更可能にしたいのですか?
*リース作成時に変更可能とする場合
ダイアログのプロパティにボーダー属性があるので、それを「サイズ変更枠」にする
*動的に変更可能とする場合
ModifyStyle で WS_THICKFRAMEを指定
ただし、システムメニューに「サイズ変更」がない状態なので、必要であればメニューに
SC_SIZEを追加する。
ダイアログ内のコントロールを再配置する場合は、WM_SIZE等のメッセージハンドラ内で
コントロールを移動すればよいと思います。
MoveWindow、SetWindowPosなどで
*リース作成時に変更可能とする場合
ダイアログのプロパティにボーダー属性があるので、それを「サイズ変更枠」にする
*動的に変更可能とする場合
ModifyStyle で WS_THICKFRAMEを指定
ただし、システムメニューに「サイズ変更」がない状態なので、必要であればメニューに
SC_SIZEを追加する。
ダイアログ内のコントロールを再配置する場合は、WM_SIZE等のメッセージハンドラ内で
コントロールを移動すればよいと思います。
MoveWindow、SetWindowPosなどで
Re:MFC
あ~、言いたいことが理解できた。
出来るダイアログボックスと、できないダイアログボックスがあるみたい。
http://www.relief.jp/itnote/archives/001030.php
試してないけど、やり方はこれかしら。
http://mcn.oops.jp/wiki/index.php?%B2%B ... A%EE%C0%AE(MFC)
出来るダイアログボックスと、できないダイアログボックスがあるみたい。
http://www.relief.jp/itnote/archives/001030.php
試してないけど、やり方はこれかしら。
http://mcn.oops.jp/wiki/index.php?%B2%B ... A%EE%C0%AE(MFC)
Re:MFC
お二方の意見を参考にしてとあるhpに
フォームのリサイズと同じ比率でコントロールをリサイズします
問題が発生しました。作業を終了します
となります。やり方がおかしいのでしょうか?
※上記のソースはdialogのクラスでWM_SIZEのメッセージを使ってます。
フォームのリサイズと同じ比率でコントロールをリサイズします
bool flg = false;//起動時にイベントが発生してサイズを変えると落ちるため、回避のためのフラグ void CtestDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: この位置にメッセージ ハンドラ用のコードを追加してください if(flg) GetDlgItem(IDC_STATIC)->MoveWindow(cx/10,cy/10, cx/2,cy/2);//動的なサイズの変更 flg = true; }とやり方が載ってました。これかなと思って試した結果サイズを変更しようと端をドラッグすると
問題が発生しました。作業を終了します
となります。やり方がおかしいのでしょうか?
※上記のソースはdialogのクラスでWM_SIZEのメッセージを使ってます。
Re:MFC
とんでもないことに気づきました。そのままパクッて貼り付けたんですがSTATICをダイアログ内で使用してませんでした・・
それでif(flg) GetDlgItem(IDC_STATIC)->MoveWindow(cx/10,cy/10, cx/2,cy/2);//動的なサイズの変更を
if(flg) GetDlgItem(IDC_IDOK)->MoveWindow(cx/10,cy/10, cx/2,cy/2);//動的なサイズの変更
if(flg) GetDlgItem(IDC_CANCEL)->MoveWindow(cx/10,cy/10, cx/2,cy/2);//動的なサイズの変更
if(flg) GetDlgItem(IDC_LIST1)->MoveWindow(cx/10,cy/10, cx/2,cy/2);//動的なサイズの変更
にすると今度はドラッグする前、
詳しくは今SDIベースでメニューのとある欄を押すとダイアログが表示され、そのダイアログをいじくったりの作業を
今しています。それでメニューの所を押した時点で問題が発生しました。作業を終了します
とでます。何が問題なのかさっぱりです。
それでif(flg) GetDlgItem(IDC_STATIC)->MoveWindow(cx/10,cy/10, cx/2,cy/2);//動的なサイズの変更を
if(flg) GetDlgItem(IDC_IDOK)->MoveWindow(cx/10,cy/10, cx/2,cy/2);//動的なサイズの変更
if(flg) GetDlgItem(IDC_CANCEL)->MoveWindow(cx/10,cy/10, cx/2,cy/2);//動的なサイズの変更
if(flg) GetDlgItem(IDC_LIST1)->MoveWindow(cx/10,cy/10, cx/2,cy/2);//動的なサイズの変更
にすると今度はドラッグする前、
詳しくは今SDIベースでメニューのとある欄を押すとダイアログが表示され、そのダイアログをいじくったりの作業を
今しています。それでメニューの所を押した時点で問題が発生しました。作業を終了します
とでます。何が問題なのかさっぱりです。
Re:MFC
勉強のために作られているソフトだったらいいんですけど、完成後他の人に使ってもらうことを考えておられるのであればなるべくレジストリは使わないほうがいいと思います。
(テキストファイルやバイナリファイルで十分な気もします)
理由は
1.レジストリに設定を残す(=レジストリを汚す)ソフトは嫌われる傾向にある
このソフトがレジストリを使用していることの銘記は必要になる
よほどのことがない限り大丈夫と思いますが、レジストリを破壊するようなことがあるとOS再インストールということになる
2.アンインストール時に、レジストリから情報を消す手段が必要になる
アンインストーラが必要になる
レジストリを使用していなければ実行ファイルのフォルダ丸ごと削除だけですむ
3.他のPCで同じソフトを使用したい場合に設定を引き継がせにくい
特にVistaだとUACの影響でレジストリが使えなかったり、仮想化されてXPとは違う動きになったりしますしね。
(テキストファイルやバイナリファイルで十分な気もします)
理由は
1.レジストリに設定を残す(=レジストリを汚す)ソフトは嫌われる傾向にある
このソフトがレジストリを使用していることの銘記は必要になる
よほどのことがない限り大丈夫と思いますが、レジストリを破壊するようなことがあるとOS再インストールということになる
2.アンインストール時に、レジストリから情報を消す手段が必要になる
アンインストーラが必要になる
レジストリを使用していなければ実行ファイルのフォルダ丸ごと削除だけですむ
3.他のPCで同じソフトを使用したい場合に設定を引き継がせにくい
特にVistaだとUACの影響でレジストリが使えなかったり、仮想化されてXPとは違う動きになったりしますしね。
Re:MFC
.iniファイルに保存する形式にしました。まず初期サイズ作ってたんです。
DialongクラスにOnInitDailog関数作ってそこで
CRect WinRect;
WinRect.left=AfxGetApp()->GetProfileInt("memo","left",200);
WinRect.top=AfxGetApp()->GetProfileInt("memo","top",200);
WinRect.left=AfxGetApp()->GetProfileInt("memo","right",622);
WinRect.bottom=AfxGetApp()->GetProfileInt("memo","bottom",310);
MoveWindow(WinRect);
としてたんです。これで初期設定は出来ていました。
それでその後にです。ダイアログが閉じるときにそのサイズを保存しようとして
ダイアログのクラスにOnDestroy関数つくりそこに
CRect WinRect;
WinRect.left=AfxGetApp()->WriteProfileInt("memo","left",WinRect.left);
WinRect.top=AfxGetApp()->WriteProfileInt("memo","top",WinRect.top);
WinRect.left=AfxGetApp()->WriteProfileInt("memo","right",WinRect.right);
WinRect.bottom=AfxGetApp()->WriteProfileInt("memo","bottom",WinRect.bottom);
MoveWindow(WinRect);
としたんです。すると意味不明なことに
メニューから【ダイアログ】←※メニューからダイアログを呼びだす場所
押すとプログラムが動かなく閉じることもできなくなります。再起動してDestroy関数を消去しても同じ結果になり
InitDialogの方消せば動かなくなるのは止まりました。何が悪いのでしょうか?
DialongクラスにOnInitDailog関数作ってそこで
CRect WinRect;
WinRect.left=AfxGetApp()->GetProfileInt("memo","left",200);
WinRect.top=AfxGetApp()->GetProfileInt("memo","top",200);
WinRect.left=AfxGetApp()->GetProfileInt("memo","right",622);
WinRect.bottom=AfxGetApp()->GetProfileInt("memo","bottom",310);
MoveWindow(WinRect);
としてたんです。これで初期設定は出来ていました。
それでその後にです。ダイアログが閉じるときにそのサイズを保存しようとして
ダイアログのクラスにOnDestroy関数つくりそこに
CRect WinRect;
WinRect.left=AfxGetApp()->WriteProfileInt("memo","left",WinRect.left);
WinRect.top=AfxGetApp()->WriteProfileInt("memo","top",WinRect.top);
WinRect.left=AfxGetApp()->WriteProfileInt("memo","right",WinRect.right);
WinRect.bottom=AfxGetApp()->WriteProfileInt("memo","bottom",WinRect.bottom);
MoveWindow(WinRect);
としたんです。すると意味不明なことに
メニューから【ダイアログ】←※メニューからダイアログを呼びだす場所
押すとプログラムが動かなく閉じることもできなくなります。再起動してDestroy関数を消去しても同じ結果になり
InitDialogの方消せば動かなくなるのは止まりました。何が悪いのでしょうか?
Re:MFC
動かなくなるのは私のミスだと思います。ただ間違いはDestoy関数なはずなのに何故消去してもなるのかと・・
>>CRect WinRect;
WinRect.left=AfxGetApp()->WriteProfileInt("memo","left",WinRect.left);
WinRect.top=AfxGetApp()->WriteProfileInt("memo","top",WinRect.top);
WinRect.left=AfxGetApp()->WriteProfileInt("memo","right",WinRect.right);
WinRect.bottom=AfxGetApp()->WriteProfileInt("memo","bottom",WinRect.bottom);
MoveWindow(WinRect);
の部分を
CRect WinRect;
GetWindowRect(&WinRect);
AfxGetApp()->WriteProfileInt("memo","left",WinRect.left);
AfxGetApp()->WriteProfileInt("memo","top",WinRect.top);
AfxGetApp()->WriteProfileInt("memo","right",WinRect.right);
AfxGetApp()->WriteProfileInt("memo","bottom",WinRect.bottom);
にしました。するととりあえずおかしくなることはなくなりました。
>>WinRectに数値は入っているんですよね?
Destroyの中のWinRectの中を見るとちゃんとサイズ変更した値が入っていました。
ちゃんと起動しました。ありがとうございました。
>>CRect WinRect;
WinRect.left=AfxGetApp()->WriteProfileInt("memo","left",WinRect.left);
WinRect.top=AfxGetApp()->WriteProfileInt("memo","top",WinRect.top);
WinRect.left=AfxGetApp()->WriteProfileInt("memo","right",WinRect.right);
WinRect.bottom=AfxGetApp()->WriteProfileInt("memo","bottom",WinRect.bottom);
MoveWindow(WinRect);
の部分を
CRect WinRect;
GetWindowRect(&WinRect);
AfxGetApp()->WriteProfileInt("memo","left",WinRect.left);
AfxGetApp()->WriteProfileInt("memo","top",WinRect.top);
AfxGetApp()->WriteProfileInt("memo","right",WinRect.right);
AfxGetApp()->WriteProfileInt("memo","bottom",WinRect.bottom);
にしました。するととりあえずおかしくなることはなくなりました。
>>WinRectに数値は入っているんですよね?
Destroyの中のWinRectの中を見るとちゃんとサイズ変更した値が入っていました。
ちゃんと起動しました。ありがとうございました。