VCで簡単なプログラムを造っています。
ダイアログベースです。
EXE を実行した時に表示されるダイアログを、自分の指定した位置に
表示させる方法はあるでしょうか。
また、そのダイアログから DoModal関数で別のダイアログを表示する場合、
同様に、自分の指定した位置に表示させる方法はあるでしょうか。
デフォルトのままだと、1つ目のダイアログは画面の中央に、
DoModal関数で表示させたダイアログは、1つ目のダイアログの上に
なります。

A 回答 (1件)

表示されるダイアログの方で設定する事で簡単に出来ます。




サンプルコード
 ダイアログの初期化ルーチン内で行います。サンプルコードでは、クライアント領域の中央にでる様にしています。
 ソースを読めば大体何をやっているのか解ると思うので、解説は許して下さいね。

BOOL CHogeHoge::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: この位置に初期化の補足処理を追加してください
RECTlpRect;
intx,y;
GetClientRect(&lpRect);
//
x = m_rect.left - (lpRect.right / 2);
y = m_rect.top - (lpRect.bottom / 2);
SetWindowPos(NULL,x,y,0,0,SWP_NOSIZE | SWP_NOZORDER );
//
return TRUE; // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
// 例外: OCX プロパティ ページの戻り値は FALSE となります
}
    • good
    • 0
この回答へのお礼

ありがとうございました。
解決することができました。

お礼日時:2001/05/18 20:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qダイアログのボタンが押された時に、その「ボタン」のあるダイアログと、すでに表示されている他のダイアログを消したいです

Win2000/MFC/ダイアログベース
で作業しています。初心者です(^^;)

Aというダイアログで「あるボタンa」を押してDoModalでBというダイアログを表示させ、Bダイアログで「あるボタンb」を押してDoModalでCというダイアログを表示させ、Cダイアログで「あるボタンc」を押した時にBダイアログとCダイアログを閉じたい(消したい)のですが
EndDialogで消せません
DoModalの戻り値をret_b,ret_cとした場合
EndDialog(ret_c);
EndDialog(ret_b);
としたのですが。。。

やり方がおかしいのか、よくわかりません・・
初心者でもわかりやすいお返事お待ちしています(^^;)

Aベストアンサー

各ダイアログボックスを CDialog の派生クラスとして次のように定義したとします。

CDlgA --- A というダイアログボックス
CDlgB --- B というダイアログボックス
CDlgC --- C というダイアログボックス

CDlgA のあるメンバ関数から CDlgB::DoModal() でダイアログボックス B を表示させます。 CDlgB のあるメンバ関数で EndDialog() を実行すればダイアログボックス B を閉じることができます。ここで、 CDialog::EndDialog() は引数として INT 型の値をひとつ渡すことができますが、その値が先の CDlgB::DoModal() の戻り値となります。
戻り値がある特定の値だったとき、つまり、質問の例ではダイアログボックス B で EndDialog(ret_b) が実行されたことが特定できたときに CDlgA も EndDialog() を実行すれば連鎖してダイアログボックスを閉じることができます。
ダイアログボックス C についても同様です。

実際のコーディングでは次のようになると思います。
ただし、ダイアログボックス A もモードレスで表示されていると仮定しています。



#define ret_b (-1) // 特定の値
#define ret_c (-1) // ID_OK や ID_CANCEL と重ならないように注意

...

(CDlgA の実装)

void CDlgA::OnButtonA() // あるボタン a が押されたときの処理
{
CDlgB dlg; // ダイアログボックス B

if (dlg.DoModal() == ret_b) // モードレスで表示して、戻り値をチェック
EndDialog(-1); // ダイアログボックス A を閉じる
}

...

(CDlgB の実装)

void CDlgB::OnButtonB() // あるボタン b が押されたときの処理
{
CDlgC dlg; // ダイアログボックス C

if (dlg.DoModal() == ret_c) // モードレスで表示して、戻り値をチェック
EndDialog(ret_b); // ダイアログボックス B を閉じる
}

...

(CDlgC の実装)

void CDlgC::OnButtonC() // あるボタン c が押されたときの処理
{
EndDialog(ret_c); // ダイアログボックス C を閉じる
}

各ダイアログボックスを CDialog の派生クラスとして次のように定義したとします。

CDlgA --- A というダイアログボックス
CDlgB --- B というダイアログボックス
CDlgC --- C というダイアログボックス

CDlgA のあるメンバ関数から CDlgB::DoModal() でダイアログボックス B を表示させます。 CDlgB のあるメンバ関数で EndDialog() を実行すればダイアログボックス B を閉じることができます。ここで、 CDialog::EndDialog() は引数として INT 型の値をひとつ渡すことができますが、その値...続きを読む

Q【VC++2005(CLR)】テキストラベルをダイアログ中央に表示させたい

いつも大変お世話になっております。
VC++初心者です。

早速質問なのですが、
ダイアログ中央に、テキストラベルを表示するには
どのように設定すれば宜しいでしょうか。

また、テキスト内容がそのダイアログの横幅以内に収まらない場合、
折り返して表示をさせるにはどうすれば宜しいでしょうか。

お手数ですが、よろしくお願いします。

Aベストアンサー

#1のサンプルコードに
this->label1->TextAlign = HorizontalAlignment::Center;
を追加。

QMFC・ダイアログベースで、ダイアログの変更内容が反映されない・・・

初めて質問させていただきます。よろしくお願いします。

当方、VisualStdio2005内のC++2005で、
ダイアログベースにてツールを開発していました。

ある日、ダイアログ上に多くのEditコントロールを作成(追加)することになり、
ダイアログリソースをVC内のリソースエディタにて、
テキスト形式でコントロールを追加していきました。

そのときは、テキストでの変更内容がダイアログにも反映されていたのですが、
その後はダイアログにツールボックスでのコントロールの追加やサイズ変更など、
見た目には反映されてもビルド後に反映されなくなってしまいました。

クリーン後のリビルドでも、問題は解決しません。

原因と対策をご存知の方、いらっしゃいましたらご教授いただけませんでしょうか。

よろしくお願いします。

Aベストアンサー

VC2005は初心者です。VC6.0は仕事で使っていました。

私はダイアログリソースをテキスト形式でコントロールを追加したことがないので、基本的にご期待に添える回答ではないと思いますが、ご参考までに。

回答する前に質問ですが、もっと詳しい問題の状況、状態を教えていただけませんか?「ビルド後に反映」とは?実行までおこなっていない、ということですか?

以下、回答です。

ダイアログリソースとダイアログのウィンドウの関連付けは正しいですか?ダイアログIDが間違って指定されていませんか?変更対象のダイアログとビルド後の実行したダイアログが違っているなんてことがあったりします。

上記のような間違いがなければ、Editコントロールを1つだけにしてビルド&実行してみてください。それで問題があれば、Editコントロールの書き方に問題があるかも?(いや、その場合はコンパイルでエラーになるはずだけど)。問題がなければ、Editコントロールを1つずつ増やしてビルド&実行する。ある程度増やしたら、思い切って半分くらい増やしてみたりしてもいいと思います。

VC2005は初心者です。VC6.0は仕事で使っていました。

私はダイアログリソースをテキスト形式でコントロールを追加したことがないので、基本的にご期待に添える回答ではないと思いますが、ご参考までに。

回答する前に質問ですが、もっと詳しい問題の状況、状態を教えていただけませんか?「ビルド後に反映」とは?実行までおこなっていない、ということですか?

以下、回答です。

ダイアログリソースとダイアログのウィンドウの関連付けは正しいですか?ダイアログIDが間違って指定されていませんか?...続きを読む

Qメインダイアログを表示させずにファイル選択ダイアログを表示

VC++2005のMFCダイアログベースでプログラムを作成しています。

自動生成されたプログラムを何も変更しないまま実行すると、
メインのダイアログが表示されますが、
そのダイアログを表示させずに、ファイル選択ダイアログを表示させたいのです。
自分で実装しビルド実行したところ、期待動作をしましたが、
ファイル選択ダイアログを閉じた後に、画像のようなエラーが発生してしまいます。
エラーを発生させず、期待動作をさせる良い実装方法をご存知の方おられましたら、
ご教示お願い致します。

【変更実装(エラー発生)】
BOOL CtestApp::InitInstance()
{

CtestDlg dlg;
m_pMainWnd = &dlg;
//INT_PTR nResponse = dlg.DoModal(); //コメントアウト
dlg.OnBnClickedButton1(); //ファイル選択ダイアログを表示する関数
//if (nResponse == IDOK) //コメントアウト
//else if (nResponse == IDCANCEL) //コメントアウト

}
void CtestDlg::OnBnClickedButton1()
{
CFileDialog ReadDlg( TRUE, NULL, "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST,
"txtファイル(*.txt)", this );

}

VC++2005のMFCダイアログベースでプログラムを作成しています。

自動生成されたプログラムを何も変更しないまま実行すると、
メインのダイアログが表示されますが、
そのダイアログを表示させずに、ファイル選択ダイアログを表示させたいのです。
自分で実装しビルド実行したところ、期待動作をしましたが、
ファイル選択ダイアログを閉じた後に、画像のようなエラーが発生してしまいます。
エラーを発生させず、期待動作をさせる良い実装方法をご存知の方おられましたら、
ご教示お願い致します。

【...続きを読む

Aベストアンサー

ファイルダイアログを出すだけなのなら、

CtestDlgの代わりにCFileDialogにすればいいだけですよ。
CtestDlgクラスそのものがいりません。

Qダイアログの表示位置の保存

MFCのダイアログベースでプロジェクトを作成し、
実行すると雛形のダイアログが画面中央に出現しますが、
このダイアログを任意の位置に動かし、ダイアログを閉じた後、
再実行した際に、前回終了時の位置に表示させるにはどのように実装すれば良いのでしょうか?
なお、座標のデータなどは終了時にiniファイルに書き出しておき、
再起動時にそれを読み出す方法を考えています。
iniファイルへの読書きの方法については理解済みです。
お手数ですがご回答よろしくお願いします。
開発環境:VC++2005

Aベストアンサー

 こんにちは。
 http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_DLGpos.html

 と言う事で、

BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// "バージョン情報..." メニュー項目をシステム メニューへ追加します。

// IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// このダイアログ用のアイコンを設定します。フレームワークはアプリケーションのメイン
// ウィンドウがダイアログでない時は自動的に設定しません。
SetIcon(m_hIcon, TRUE);// 大きいアイコンを設定
SetIcon(m_hIcon, FALSE);// 小さいアイコンを設定

// TODO: 特別な初期化を行う時はこの場所に追加してください。
//此処で読んだ座標を指定
CRect rect(0, 0, 256, 256);
GetWindowRect(&rect);
SetWindowPos(&this->wndTop, 0, 0, rect.right - rect.left, rect.bottom - rect.top, SWP_SHOWWINDOW);

return TRUE; // TRUE を返すとコントロールに設定したフォーカスは失われません。
}

void CTestDlg::::OnDestroy()
{
//サイズを取る
RECT rc;
this->GetWindowRect(&rc);
//此処でiniファイルへrcを記録

CDialog::OnDestroy();

// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
}

 では無いでしょうか。

 こんにちは。
 http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_DLGpos.html

 と言う事で、

BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// "バージョン情報..." メニュー項目をシステム メニューへ追加します。

// IDM_ABOUTBOX はコマンド メニューの範囲でなければなりません。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAbo...続きを読む


人気Q&Aランキング

おすすめ情報