VC++6(MFC)について質問です。

ダイアログのタイトル
(青い帯の部分)の文字列を
変数の値によって変更したいと思います。
テキストボックスの場合は
CEdit型でGetDlgItemして、
得られたポインタからSetWindowsTxtで設定すればできますが、
ダイアログのタイトルはどのようにすれば変更できますでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/06/03 15:51:20
  • 終了:2007/06/05 16:57:37

ベストアンサー

id:jack_sonic No.2

じゃっくそにっく回答回数123ベストアンサー獲得回数252007/06/03 19:13:41

ポイント100pt

1の回答者です。

メインダイアログ(主画面)ではなくて、サブ画面の

新しいダイアログに対してなんですね。

ちょっと詳しいファイル/クラス/呼び出しの

構成がわからないのですが、

名前から察するに、cwndIconAlphaSetDlgは、

class cwndIconAlphaSetDlg public CDialog

で宣言されたクラスでしょうか?

クラスとするなら、それは""であって、"実体"ではない

(インスタンスではない)ので、

cwndIconAlphaSetDlg->SetWindowText()

は失敗します。

SetWindowText()は、実体(インスタンス)

に対して実行しなければ効果がありません。

仮定

ここで想定する仮定として、

①"cwndIconAlphaSetDlg"という名前のCDialogを継承したダイアログクラスがある。

②そのクラス(cwndIconAlphaSetDlg)の"実体"変数(インスタンス/オブジェクト)

が、メインダイアログに確保されている。

③メインダイアログから、②の実体変数のDoModalでダイアログを呼び出し、

呼び出された側のcwndIconAlphaSetDlg::OnInitDialogでタイトルを変更する。

ということでしょうか??

条件が違ったら教えてください。

①~③を仮定すると、

まず、①のために、

cwndIconAlphaSetDlg.h,cwndIconAlhpaSetDlg.cpp というファイルがあり、

それをメインダイアログのファイルの先頭で、

クラスヘッダファイルがインクルードしていますよね。

#include "cwndIconAlphaSetDlg.h"

それで、メインダイアログのファイル内のどこかで、

cwndIconAlphaSetDlgクラスの実体の定義をしているはずです。

(というかそれが必要になります)

以下の例では、IconAlphaSetDlgという名前で、cwndIconAlphaSetDlgクラスの

実体を確保しています。

	// クラスの実体を宣言
	cwndIconAlphaSetDlg IconAlhaSetDlg;

(ポインタでやっているかもしれませんが、要は実体が必要です。)

そして、③で実体のメソッドとしてDoModalを呼び出しますよね。

	// DoModal
	IconAlhaSetDlg.DoModal();

これはたとえばですが、メインダイアログのクラス名が"CDiagTestDlg"だとして、ボタンが1個あり、それのハンドラ

OnButton1を設置して、そこでダイアログを出すとしたら、

void CDiagTestDlg::OnButton1() 
{
	// ダイアログの実体宣言
	cwndIconAlphaSetDlg IconAlhaSetDlg;

	//DoModal
	IconAlhaSetDlg.DoModal();
}

ていうような感じになりますよね。

そして、呼び出されたほうの、IconAlphaSetDlgのクラス、

cwndIconAlphaSetDlgのOnInitDialogメソッドが呼び出され、

その中でダイアログのタイトルを変えるなら、

	this->SetWindowText("テキスト");

ということになります。

OnInitDialogで自分自身を初期化しているときに、

自分自身のタイトルを変えるため。

例:

BOOL cwndIconAlphaSetDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	// ダイアログ初期化時 自分のタイトルを変更
	this->SetWindowText("テスト");
	return TRUE;
}

構成や条件が違っていたり、

疑問点があれば詳細をお願いします。

あと、質問のコメント機能を開いておいていただけると助かります。

http://q.hatena.ne.jp

id:harunoharuno

回答ありがとうございます。

また、私が書かなかったダイアログの呼び出し方法まで推測し

回答していただき感謝いたします。

ダイアログの呼び出し方は、考えていただいたものと完璧に一致しております。

さっそく教えていただいた情報を元に

thisポインタで、自らのクラスを指定し、

SetWindowText("title");

としたところ無事にタイトルバーの内容を変更することができました。

実は、ダイアログを呼び出す前に

ダイアログ名.SetWindowText("title");

ダイアログ名.Domodal();

とかも試していたのですが、これは失敗でした。

ダイアログの初期化はやはりOnInitDialogでやった

方がよさそうですね。

大変丁寧に教えていただき助かりました。

2007/06/03 20:17:38

その他の回答(1件)

id:jack_sonic No.1

じゃっくそにっく回答回数123ベストアンサー獲得回数252007/06/03 17:13:15

ポイント50pt

こんにちは。

MFCのウィンドウアプリケーションで

ウィンドウのウィンドウタイトルを変える場合は、

ウィンドウ->SetWindowText(テキスト)

です。

メインウィンドウなら、

AfxGetMainWnd()または

AfxGetAPp()のGetMainWnd()

で取得できます。

AfxGetMainWnd()->SetWindowText("テキスト");

エディットからとするとこんな感じでしょうか。

CEdit *pEdit =(CEdit*) GetDlgItem(IDC_EDIT1);
CString str;
pEdit->GetWindowText(str);
AfxGetMainWnd()->SetWindowText(str);
//または AfxGetApp()->GetMainWnd()->SetWindowText(str);

参考

http://home.att.ne.jp/banana/akatsuki/doc/mfc/mfc12/index.html

id:harunoharuno

回答ありがとうございます。

しかし、なぜか出来ませんでした。

主画面から新しいダイアログをDomodalする際に、

OnInitDialogで

CWnd* cwndIconAlphaSetDlg=AfxGetMainWnd();

cwndIconAlphaSetDlg->SetWindowText("aaa");とコーディングしたのですが、

タイトル名は変わりませんでした。

やり方に不備とうありましたら

それについてもご指摘いただきたく宜しくお願いします。

それとやや体調不良でへたっていますので

理解力が低下しご迷惑をおかけします。

2007/06/03 18:59:10
id:jack_sonic No.2

じゃっくそにっく回答回数123ベストアンサー獲得回数252007/06/03 19:13:41ここでベストアンサー

ポイント100pt

1の回答者です。

メインダイアログ(主画面)ではなくて、サブ画面の

新しいダイアログに対してなんですね。

ちょっと詳しいファイル/クラス/呼び出しの

構成がわからないのですが、

名前から察するに、cwndIconAlphaSetDlgは、

class cwndIconAlphaSetDlg public CDialog

で宣言されたクラスでしょうか?

クラスとするなら、それは""であって、"実体"ではない

(インスタンスではない)ので、

cwndIconAlphaSetDlg->SetWindowText()

は失敗します。

SetWindowText()は、実体(インスタンス)

に対して実行しなければ効果がありません。

仮定

ここで想定する仮定として、

①"cwndIconAlphaSetDlg"という名前のCDialogを継承したダイアログクラスがある。

②そのクラス(cwndIconAlphaSetDlg)の"実体"変数(インスタンス/オブジェクト)

が、メインダイアログに確保されている。

③メインダイアログから、②の実体変数のDoModalでダイアログを呼び出し、

呼び出された側のcwndIconAlphaSetDlg::OnInitDialogでタイトルを変更する。

ということでしょうか??

条件が違ったら教えてください。

①~③を仮定すると、

まず、①のために、

cwndIconAlphaSetDlg.h,cwndIconAlhpaSetDlg.cpp というファイルがあり、

それをメインダイアログのファイルの先頭で、

クラスヘッダファイルがインクルードしていますよね。

#include "cwndIconAlphaSetDlg.h"

それで、メインダイアログのファイル内のどこかで、

cwndIconAlphaSetDlgクラスの実体の定義をしているはずです。

(というかそれが必要になります)

以下の例では、IconAlphaSetDlgという名前で、cwndIconAlphaSetDlgクラスの

実体を確保しています。

	// クラスの実体を宣言
	cwndIconAlphaSetDlg IconAlhaSetDlg;

(ポインタでやっているかもしれませんが、要は実体が必要です。)

そして、③で実体のメソッドとしてDoModalを呼び出しますよね。

	// DoModal
	IconAlhaSetDlg.DoModal();

これはたとえばですが、メインダイアログのクラス名が"CDiagTestDlg"だとして、ボタンが1個あり、それのハンドラ

OnButton1を設置して、そこでダイアログを出すとしたら、

void CDiagTestDlg::OnButton1() 
{
	// ダイアログの実体宣言
	cwndIconAlphaSetDlg IconAlhaSetDlg;

	//DoModal
	IconAlhaSetDlg.DoModal();
}

ていうような感じになりますよね。

そして、呼び出されたほうの、IconAlphaSetDlgのクラス、

cwndIconAlphaSetDlgのOnInitDialogメソッドが呼び出され、

その中でダイアログのタイトルを変えるなら、

	this->SetWindowText("テキスト");

ということになります。

OnInitDialogで自分自身を初期化しているときに、

自分自身のタイトルを変えるため。

例:

BOOL cwndIconAlphaSetDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	// ダイアログ初期化時 自分のタイトルを変更
	this->SetWindowText("テスト");
	return TRUE;
}

構成や条件が違っていたり、

疑問点があれば詳細をお願いします。

あと、質問のコメント機能を開いておいていただけると助かります。

http://q.hatena.ne.jp

id:harunoharuno

回答ありがとうございます。

また、私が書かなかったダイアログの呼び出し方法まで推測し

回答していただき感謝いたします。

ダイアログの呼び出し方は、考えていただいたものと完璧に一致しております。

さっそく教えていただいた情報を元に

thisポインタで、自らのクラスを指定し、

SetWindowText("title");

としたところ無事にタイトルバーの内容を変更することができました。

実は、ダイアログを呼び出す前に

ダイアログ名.SetWindowText("title");

ダイアログ名.Domodal();

とかも試していたのですが、これは失敗でした。

ダイアログの初期化はやはりOnInitDialogでやった

方がよさそうですね。

大変丁寧に教えていただき助かりました。

2007/06/03 20:17:38

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません