MFCでダイアログを使ったアプリケーションを
作りました。

実行時に、ダイアログで
入力項目が10個くらいあるのですが、
タブキーで移動しようとすると、
カーソルが入力ボックス並びとは全く関係なく、
あっちこっち飛んでしまいます。

どうやら入力ボックスを作った順番に
飛んでいるらしい?のです。

入力ボックスの順にタブキーが移動するように
できる方法がありましたら、
教えてください。

参考HPやヒント、キーワードだけでも
大変助かります。

よろしくお願いします。

A 回答 (2件)

タブオーダーを変更することで対応できます。


変更方法は、以下の通り。

1) メニューの「レイアウト」-「タブオーダー」を選択すると、部品毎に番号が表示されます。これがタブオーダーです。

2) この状態で、任意の部品をマウスでクリックすると、クリックした順に番号が変わります。

3) もう一度、メニューの「レイアウト」-「タブオーダー」を選択すると、タブオーダー変更モードから抜けます。
    • good
    • 0
この回答へのお礼

一発でうまくいきました。
どうもありがとうございました。

お礼日時:2001/12/03 18:37

こんにちは。

itohhといいます。

ダイアログの編集画面を表示したあとに[Ctrl]キーとDキーを同時に押下します。
すると、コントロールに番号が振られていますよね。
ここで、コントロールをマウスでクリックすると番号が1から振られ直すはずです。
    • good
    • 0
この回答へのお礼

早速のレスありがとうございました。
こちらもショートカットでうまく行きました。

本当に、どうもありがとうございました。
今後ともよろしくお願いします。

お礼日時:2001/12/03 19:26

お探しの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ダイアログを継承したダイアログの作成について

お世話になります。
今回お聞きしたいことは、
オリジナルに作成したダイアログを継承したオリジナルのダイアログを作成した際に、オリジナルに作成した基底ダイアログのダイアログ上のコントロールや、そのコントロールの位置を継承することはできますでしょうか?
ということです。
何がしたいかといいますと、4つのダイアログをメインダイアログから呼び出すのですが、その4つのダイアログには共通するコントロールがあり、そのコントロールの動作もその位置も全く同じなのです。
そのため、いちいち4つのダイアログにコントロールの貼り付けや、処理を記入せずに、その共通のコントロールをもった基底ダイアログを作成して、その基底ダイアログの継承としてダイアログが作れたらなと思い、質問させて頂きました。
継承をすると、基底クラスの関数等を使うことができるというのはわかるのですが、ダイアログ上のコントロールの位置までは不可能なのかなと疑問に思いました。
ご回答を宜しくお願い致します。

開発環境は
Windows CE 6.0
Visual Studio 2005
です。

お世話になります。
今回お聞きしたいことは、
オリジナルに作成したダイアログを継承したオリジナルのダイアログを作成した際に、オリジナルに作成した基底ダイアログのダイアログ上のコントロールや、そのコントロールの位置を継承することはできますでしょうか?
ということです。
何がしたいかといいますと、4つのダイアログをメインダイアログから呼び出すのですが、その4つのダイアログには共通するコントロールがあり、そのコントロールの動作もその位置も全く同じなのです。
そのため、いちいち4つの...続きを読む

Aベストアンサー

私、CEの経験がないので厳密なところはわからないのですが、
一般的なMFCであれば、可能です。
ただし、条件により困難さが変わります

1)4つのダイアログが全て同じコントロールのみからなる場合
  コントロールは同じだが、ラベルのキャプションが違うとか
  リストボックスのデータが違うとかいう場合です。

  非常に単純です。普通の派生と全く同じ感じです
  OnInitDialog等適当な関数をオーバーライドするだけです。

2)共通のコントロール以外に独自のコントロールも持つ場合
  多少困難です
  いくつかアプローチが考えられます。
  a) ダイアログ・テンプレートを個別に持つ方法
    リソース内のダイアログ・テンプレートは(共通のコントロールも含め)
    コピー&ペーストなどで独自に作成します(4つ作ります)
それぞれを制御するクラスですが、
    ウィザードのサポートを受けられない
    (ウィザードではCDialog派生にされてしまう)
    ので、既存のCDialog派生クラスを参照して
    自力で希望のCDialog派生からさらに派生させるようにします

    リソースIDとクラスの結びつけ方法などは既存のクラスを
    参考にしてください

  b)リソースも完全に共通化する
    ちょっと難しいかもしれません。
    OnInitDialog等で自力でコントロールをCreateします。
    レイアウトが視覚的にできないので非常に困難ですが、
    隣接するコントロールの位置情報をもとに計算するなどしてください。

    ダイアログの大きさに余裕があり、
    追加するコントロールも小さなもの
    (1行のみのエディット等)であれば、
    最初から場所をstaticコントロールで場所を確保しておき
    非表示にしておいて、
    派生クラスで、そのstaticの位置を取得するとかなり楽ができます。

    派生クラスで、本格的にレイアウトが変わってしまう場合は、
    レイアウトを頭に入れながら、Createし、試行錯誤で
    完成させることになるでしょう。


以上の方法がCEでも通じるのかわかりませんが、
参考になれば幸いです。    

   

私、CEの経験がないので厳密なところはわからないのですが、
一般的なMFCであれば、可能です。
ただし、条件により困難さが変わります

1)4つのダイアログが全て同じコントロールのみからなる場合
  コントロールは同じだが、ラベルのキャプションが違うとか
  リストボックスのデータが違うとかいう場合です。

  非常に単純です。普通の派生と全く同じ感じです
  OnInitDialog等適当な関数をオーバーライドするだけです。

2)共通のコントロール以外に独自のコントロールも持つ場合
 ...続きを読む

Q子ダイアログのデータを親ダイアログで取得するには

VC6.0にてMFCでダイアログベースアプリケーションを作成しています。

親ダイアログ(TestDlg.cpp)のメニューを選択すると、子ダイアログ(SetDlg.cpp)が開き、テキストボックスに文字を入力し、ボタン押下によりテキストボックスの入力数字を確定(グローバル変数(igStatu)に代入)しています。
子ウインドウで入力確定したデータを、親ダイアログにて使用したいのですが、データが受け渡されずに、親ダイアログ側にデータが入りません。
どのようにしたら、子ダイアログで設定したデータを親ダイアログで取得することができるのでしょうか?

C++、MFCともに全然わかっていませんがお願いします。

グローバル変数は、TestDlg.cpp、SetDlg.cppがインクルードしているTest.h内にstatic宣言しています。
static宣言しないとリンクエラー2005になってしまいます。

Aベストアンサー

Test.h内で
extern int igStatu;

TestDlg.cpp内で
int igStatu;

とすればいいのでは?
externについて調べてみてください。

参考URL:http://homepage3.nifty.com/mmgames/c_guide/20-02.html

QMFC ダイアログ→MDI風に変更

ダイアログベースで画面作成をしていたのですが、
MDIのように左右のペインの大きさをドラッグして変更出来るようにしたいのですが、
どんな方法があるでしょうか。
VisualStudioとかでもペインの大きさをドラッグして変更できますよね。
あんな感じです。
MDIだと簡単に出来るのでしょうが、既にダイアログベースにしてしまっています。

宜しくお願い致します。

Aベストアンサー

こんにちは。
VisualStudioのようなドッキングペインではなく、ただ単に左右の大きさを変えたいということであれば方法はいくつかあると思います。
(1)スプリッターウィンドウ(CSplitterWnd)をダイアログ上に貼り付けて使う方法。
スプリッターウィンドウ内の貼り付ける子ウィンドウが 2 枚必要になります。
(2)左右用の子ウィンドウを用意して、ダイアログの上に置いて境目を操作を自前で実装する。

どちらにしても、ダイアログ上に置いたコントロールは、すべて左右用の子ウィンドウに移す必要があります。
メッセージの送信先に注意してください。SetOwnerを有効に使ってください。

スプリッターウィンドウを使う場合は少々癖がありますので注意してください。

Q(MFC)別々のプロジェクト内で作成したダイアログを表示させる方法

VC++2005のMFCにてアプリケーションを作成しています。

一つのソリューション内に二つのプロジェクトA、Bが存在し、
プロジェクトAで発生したあるイベント(例:ボタン押下)にて、
プロジェクトBで作成したダイアログを表示させたいのですが、
実装したところ、下記コンパイルエラーが出てしまいます。
「error C2065: 'IDD_TEST2_DIALOG' : 定義されていない識別子です。」

現在のプロジェクトの設定としては、
・プロジェクトAの依存先をプロジェクトBに設定
・プロジェクトA選択状態で、
 「プロジェクト」→「プロパティ」→「構成プロパティ」
 →「C/C++全般」→「追加のインクルードディレクトリ」にて、プロジェクトBのパスを指定

と設定しているのですが、どこに問題があるのでしょうか?
もし問題があるようでしたら、正しい設定方法、また実装方法について、
お手数おかけしますが、ご教授お願いできませんでしょうか?

また下記にソースコード実装例を記載します。

【プロジェクトA(呼び出し側)】
#include "test2Dlg.h"//プロジェクトBのヘッダファイル
・・・
void Ctest1Dlg::OnBnClickedOk()
{
CDlgTest MyDlg;
MyDlg.DoModal();//プロジェクトBのダイアログ生成
}

【プロジェクトB(呼出され側)】
・リソースビューにて、ダイアログ(IDD_TEST2_DIALOG)の「クラスの追加」で、
 クラス名「CDlgTest」と指定

VC++2005のMFCにてアプリケーションを作成しています。

一つのソリューション内に二つのプロジェクトA、Bが存在し、
プロジェクトAで発生したあるイベント(例:ボタン押下)にて、
プロジェクトBで作成したダイアログを表示させたいのですが、
実装したところ、下記コンパイルエラーが出てしまいます。
「error C2065: 'IDD_TEST2_DIALOG' : 定義されていない識別子です。」

現在のプロジェクトの設定としては、
・プロジェクトAの依存先をプロジェクトBに設定
・プロジェクトA選択状態で、
...続きを読む

Aベストアンサー

その構成には無理があると思います

別EXEのダイアログを表示したいってことですよね

プロジェクトBの中のResource.h で定義された IDD_TEST2_DIALOGが
プロジェクトAの中のどこかで定義されていない限り質問のようなエラーになるでしょう

この問題が解決できたにせよ
今度はプロジェクトBのダイアログ用のリソースが プロジェクトAには
存在しません
したがって CDlgTestのインスタンス MyDlgを初期化しようとした時点で実行時エラーになるでしょう

リソースビューでプロジェクトBのダイアログを選択 編集 > コピー
プロジェクトAを選択 編集 > 貼り付け
でリソースをコピーします

プロジェクトBの CDlgTestクラスのソース および ヘッダーをプロジェクト Aにコピー
として 構築されることをお勧めします

別の方法としては プロジェクトBをDLLとして構築する方法がありますが
ここですべてを説明できるものではありません


人気Q&Aランキング

おすすめ情報