VC++でプログラミングしています。
MFC AppWizard(exe) でダイアログベースで造っています。
やりたいことは以下です。
・設定ファイルに表示位置(座標)が書いてあり、ダイアログの初期化時に
設定ファイルを読んで、指定された位置にボタンを表示する。

私の案としては以下のものがあります。
<案1>
予めボタンを貼り付けて造り、EXE起動時に移動させる。
ただし、移動させる関数があるかは不明。
調べましたが、今のところ見つかっていません。

<案2>
CButtonクラスのメンバを使用して、ボタンを表示する。
試しに以下のようなコードでやってみましたが、上手くいきませんでした。
使い方がわからず、試行錯誤しながらやってます。

CButton testButton;

void CTestGamenDlg::OnButton1()
{
RECTRect;

Rect.left = 100;
Rect.top = 100;
Rect.right = 200;
Rect.bottom = 200;

testButton.Create("test", BS_PUSHBUTTON, Rect, this, 100);
}


案1、2についての指摘、アドバイス、その他の案などありましたら
宜しくお願いします。
また、簡単なサンプルコードがあると助かります。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

ボタンは、CWndが基本クラスなのでCWndの関数を使うことができます。


ということで、SetWindowPosを使って位置を移動させることができます。
使い方は、ヘルプを見てください。
それでは、がんばってください。

この回答への補足

アドバイスありがとうございます。
一点、ヘルプを見てもどうしても理解できないことがあります。

SetWindowPos関数はOnInitDialog関数の中でダイアログのサイズを
変更するために以下のように使っています。
SetWindowPos(NULL, 0, 0, 600, 400, SWP_NOZORDER | SWP_SHOWWINDOW);

今回、このダイアログに貼り付けられているボタンのサイズを
変更したいのですが、「このボタンの」という指定がSetWindowPos関数の
どのパラメータで指定するのかがわかりませんでした。

ご迷惑おかけしますが、再度、アドバイス頂けないでしょうか。
よろしくお願いします。

補足日時:2001/06/14 10:41
    • good
    • 0

1.クラスウイザードで、ボタンのメンバ変数(型は、CButton)を追加(メンバ名をm_Btn)します。


2.これで、m_Btn.SetWindowPosという風に使えます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
大変参考になりました。
VCを始めたばかりでクラスについて勉強不足でした。

お礼日時:2001/06/14 14:06

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

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

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

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 型の値をひとつ渡すことができますが、その値...続きを読む

Qfor( ; ti >= 0; ti--, ci++)

C言語のループの表記のことです

for ( ; ti >= 0; ti- -, ci++)
この意味がわかりません
自分なりに解釈すると「;ti >= 0」から始まって「 ci++ 」を繰り返しながら「 ti- - 」になるまで繰り返す、というような感じです

「;ti >= 0」から始まるとはどういう意味でしょうか?
「 ti- - 」になるまでとは???

このソースが書かれているHPです
http://www.rs.kagu.tus.ac.jp/infoserv/j-siken/H12a2/pm11.html
52行目になります


わかる方がいらっしゃったら教えてください、お願いします

Aベストアンサー

for() の 「初期設定式」「継続条件式」「再設定式」の区切りは、; です。
ですからこの場合、
初期設定式:なにもない(特に初期設定不要)
継続条件式: ti >= 0
再設定式: ti--, ci++
です。

さらに、再設定式に出てくる表現は、「コンマ演算子」といいまして、おおざっぱに言えば、コンマで区切られた式を順番に実行という意味です。
(関数の引数に現れるコンマとは別の意味です)

初期設定式のない for() は、すでにあるところから処理を継続する場合によく使われます。たとえば、

s = 0;
for (i = 0; x[i] == 0; i++); // x[i] の先頭部分の0の要素を捨てて
for(; x[i] > 0; i++)
s += x[i]; // 「そのあと」の正の部分が継続する間足し込む
という場合、

また、再設定式は、

for(i = 0, j = 10; src[i] != 0; i++, j--)
dest[j] = src[i];
のように、二つ(以上)のものを変化させたい場合。
この例では、初期設定式も、コンマ演算子を使って、2つの初期化を行っています。

for() の 「初期設定式」「継続条件式」「再設定式」の区切りは、; です。
ですからこの場合、
初期設定式:なにもない(特に初期設定不要)
継続条件式: ti >= 0
再設定式: ti--, ci++
です。

さらに、再設定式に出てくる表現は、「コンマ演算子」といいまして、おおざっぱに言えば、コンマで区切られた式を順番に実行という意味です。
(関数の引数に現れるコンマとは別の意味です)

初期設定式のない for() は、すでにあるところから処理を継続する場合によく使われます。たとえば、

s = 0;
...続きを読む

Qダイアログにあるボタンを指定した順番どおりに、キーボードの矢印ボタンやタブボタンで移動したい

お世話になります。

C++6.0 MFCで開発しております。

現在、ダイアログの上に(1)~(5)のボタンがあるのですが、
キーボードの矢印ボタンやタブボタンで移動すると
(2)→(1)→(5)→(4)→(3)
のように、意図しない順番でボタンがアクティブになってしまいます。
それをきちんと
(1)→(2)→(3)→(4)→(5)
と順番どおりに移動するようにしたいのですが、どのようにすれば
いいのでしょうか?

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

Aベストアンサー

VC6の場合 ダイアログエディタを起動して
Ctrl+Dまたはメニューから レイアウト > タブオーダーを実行します

コントロールの左肩に現在のタブ順が表示されるので
1番から順に指定したいコントロールをクリックしてみましょう
その後実行ファイルの更新(ビルドまたはリビルド)実行すれば
希望通りのタブ順になっているはずですよ ・・・


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報