• ベストアンサー

VS2005 C++ Expでダイアログの変更 と、Form.hについて

VisualStudio2005 C++ Express Editionでプログラムを作成しています。 Unix-C、xviewは少し経験があるのですが、VC++はまだ始めて2ヶ月程度です。 質問ですが、 if(MessageBox::Show("実行します", "Dialog",    MessageBoxButtons::OKCancel) !=    System::Windows::Forms::DialogResult::OK) {    return; } こんな感じで書くと、[OK][Cancel]のボタンがついたダイアログが表示されます。 そこで、ボタンを[Aを実行][Bを実行][Cを実行][Cancel]のように4つ、もしくは何か別のコントロールをレイアウトしたりして、ダイアログボックスのデザインを変更したいのですが、Expressではできない機能なのでしょうか? ヘルプを漁ると、「ダイアログ ボックスの新規作成」というタイトルで 「リソース ビューで .rc ファイルを右クリックし、ショートカット メニューの [リソースの追加] をクリックします。」・・・ みたいな手順でやるのではないかと想像できるのですが、Expressでは.rcファイルが編集できないようなのです。 app.rcのところに「リソースの編集はVisual C++ Express SKUでサポートされていません」と表示されています。 質問1:Expressでは可能?不可能? 質問2:Standard Editionを購入したとして、方法は上記で合っていますか? 質問3:すごく初歩的な質問ですが、クラス以外のソースコードはすべてForm.hに詰め込むという書き方でいいんでしょうか?     C++のクラスがまだよく理解できていないので、Cライクに書いていると     すべてがForm.hに入ってしまい、やたらと見難くなってしまうのですが・・・      よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.7

> 新しいダイアログにボタンを複数つくり、戻った後でどのボタンが > 押されたかをForm1.hで判断するにはどうしたらよいのでしょうか? ref class Form2 : Form { public: int GetSelection() { 押されたボタンが何であったかを返す } ... }; Form2^ form = gcnew Form2(); form->ShowDialog(); switch ( form->GetSelection() ) { case ...

hid_hid_hid
質問者

お礼

あまりクラスのことを理解せずにやっていたので苦労しましたが、 試行錯誤の末やっと希望通りの動作ができました!! ありがとうございました。

その他の回答 (7)

回答No.8

だいたい解決しているようですが、蛇足をひとつ。。。 マイクンロソフトは、.NET2005でマネージコードを見捨てたように見えます。 マネージコードをやるくらいなら、VBにまわってくれ、と、言わぬばかりです。 それについては、色々な人が、色々なところで色々な書いているので、多分、質問者の方も、目にしたことがあると思います。 Expressはネイティブコード(MFCのこと)をカバーしていません。 だから無料で頒布しているということもいえます。 大きなお世話ではあるのですが、アカデミックパックならそれほど高くはないので、誰かに頼むなりして、MFCが使える開発環境を手に入れたほうがいいです。 それでないと、流れに取り残されてしまいます。 現実には、ネイティブがどれほどマネージより高速処理ができるかという問題になると、体感的には、やや疑問ではあるのですが。

hid_hid_hid
質問者

お礼

ご回答ありがとうございます。 (おかしいな・・・この質問は解決して、確か締め切ったはずでしたが、反映されていなかったようですね(^^;)) >それについては、色々な人が、色々なところで色々な書いているので 確かにいろいろ見ていると、時代はVBやC#のような感じですね・・・ 今回のプログラムで(まだ完成してませんが)Expでここまでできるのかということと、ここまでしかできないという限界も両方見えてきました。 今までは10数年前のUnix-Cで動く装置のメンテや改造などをやっていたので、Microsoft系はあまり手をつけていなかったのですが、 やはり新しい技術を学ぶことは大切ですね。 一応今週末には買い物に行けるので、スタンダードを購入する予定です。 (^-^)turukame2005様、またヒントや回答をいただいた皆様に感謝いたします。 ありがとうございました。

  • furyfox
  • ベストアンサー率56% (58/103)
回答No.6

すみません。質問3の回答ですが言語の仕様とは関係ない話です。IDEの仕様のつもりでした。 もちろん手動で書くのには問題ありませんが デザイナがはくコードは全てヘッダに書かれると思います。 (ひょっとするとデザイナの吐くコードを設定によってcppにいれる方法があるのかもしれません。) 質問者様を混乱させるような回答をしてしまい申し訳ないです。 深くお詫び申し上げます。

hid_hid_hid
質問者

お礼

早速のご回答ありがとうございます。 C++/CLIが別物であるということを恥ずかしながら知りませんでした・・・ でもやはり、ヘッダファイルに吐かれてしまうのは仕様なんですね。 早速、お教え通りにWindowsフォームを追加し、Form1.hでのイベント発生時に新しく作ったフォームをモーダルダイアログで表示させ、 ダイアログのボタンクリックでForm1.hに戻ることができました。 しかし新たな質問なのですが、新しいダイアログにボタンを複数つくり、戻った後でどのボタンが押されたかをForm1.hで判断するにはどうしたらよいのでしょうか? 共通に使用できる変数があればいいのですが、どこで宣言すればいいのでしょうか。 度々申し訳ありません。

回答No.5

ANo4> 質問3:「C++/CLI」を使う以上、仕様的にやむをえない部分です。 何の仕様ですか? 「C++/CLIには実装をヘッダに置かなければならない」という制限はありませんが。

hid_hid_hid
質問者

お礼

補足回答ありがとうございました。 がんばって精進します。

  • furyfox
  • ベストアンサー率56% (58/103)
回答No.4

まず貴方が使っている言語の種類は 「C++」ではなく、「C++/CLI」です。 ※C++/CLIはC++で.NET Frameworkを使う為C++の言語仕様を拡張したものです。  つまり別言語です。  具体的にはファイナライザやトラッキング参照等の仕様が追加されています。 質問1:Expressでできるかどうかは関係ありません。MessageBoxの機能というのは Windowsが提供しているAPIです。フレキシブルに色々な事をしたいのなら 自分でメッセージボックス相当のフォームを作ってください。 (ソリューションエクスプローラのノードを右クリック→追加→クラス→Windowsフォーム) 質問2:「C++/CLI」に関して言えばStandard Editionかどうかは関係ないです。 質問3:「C++/CLI」を使う以上、仕様的にやむをえない部分です。 ※C++/CLIは.NET Frameworkを無理やり同居させようとしている為、どうしても仕様的に無理な部分があります。

  • qwertfk
  • ベストアンサー率67% (55/81)
回答No.3

ExpressEditionということなので、CLIということですよね。というかコードを見れば明らかにそうですが。 あまりメッセージボックスをエディットするという話は聞いたことはないので、新しいフォームを作成してそれをモーダルダイアログとして使用するほかないかと思います。 CLIの場合、フォーム作成時にリソースファイルはあまり関係ありません。ソリューションエクスプローラから新しいフォームクラスを生成し、それを操作するという手順になるでしょう。 単純にオブジェクト指向が理解できていなくて、関数ばかりのプログラムになるというのはまずいですが、マネージドなC++のプログラムではヘッダにコードを記述してもいいのではないでしょうか(私はそうしてます)。 フォームデザイナでコードを生成する場合も勝手にヘッダファイルにインラインで生成されてしまいますし、いちいちすべてを.cppファイルに移し変えるのはかなり面倒な気がします。また、スタートアップのインスタンスになるクラス(標準ではForm1クラス)のソースファイル内には、main関数まで記述されていますしね。他の.NET系言語にはヘッダファイルという概念がないのでそれらとの整合性を考えてそのような構造にしているのではないでしょうか。

hid_hid_hid
質問者

お礼

恥ずかしながら、No3様、No4様の回答をいただいて、初めてC++/CLIというものの存在を知りました。。。 なんとなく理解してきました。 MessageBoxはいくつかの雛形があって簡単にYes/Noなどのダイアログが作れるが、複雑なことはできない。 その代わり、Windowsフォームを新規に作成し、それをモーダルダイアログとして表示するわけですね。 早速やってみたのですが、JogDialogというフォームをつくり、Form1.hに JogDialog^ dlg = gcnew JogDialog(); dlg->ShowDialog(); と実行することでモーダルダイアログが表示されました。 そこでもうひとつ質問で恐縮なのですが、JogDialogウインドウでボタンをつくり、押されたボタンがどれであるかをForm1.hの方で判定するにはどうすればいいのでしょうか。。。 グローバル変数かと思い、Form1hの一番上 namespaceのあとに変数を宣言しても、#include"jogdialog.h"はその外にあるのでビルドエラーになりました(当然ですね) メインの.cppのあたま、#include "Form1.h"の前で宣言してもダメでした。

回答No.2

> MessageBoxでは無理ということは、どんなやり方があるのでしょうか? > キーワードだけでも教えていただけませんでしょうか? 新たなフォームをデザインします。 > 確かにどう書こうと自由ですけど、腑に落ちないんです。 …それで?

回答No.1

質問1:Expressでは可能?不可能? 可能です。が、MessageBoxでは無理。 質問2:Standard Editionを購入したとして、方法は上記で合っていますか? MFCあるいはWin32APIによるアプリケーションなら、合っています。 質問3:すごく初歩的な質問ですが、クラス以外のソースコードはすべてForm.hに詰め込むという書き方でいいんでしょうか? ご自由に。 > C++のクラスがまだよく理解できていないので、Cライクに書いていると > すべてがForm.hに入ってしまい、やたらと見難くなってしまうのですが・・ クラス云々とは何の関係もありません。 ヘッダ内に実装を詰め込むのは一般に"避けるべき"スタイルです。

hid_hid_hid
質問者

補足

早速のご回答ありがとうございます。 MessageBoxでは無理ということは、どんなやり方があるのでしょうか? キーワードだけでも教えていただけませんでしょうか? また、ヘッダに実装を詰め込むのは避けるべきスタイルだと言うことは承知しております。 ですが、Microsoftの公式解説書(日経BPソフトプレス VisualC++2005 アプリケーション開発入門)で、サンプルソースを見たら、やはりForm.hに実装しているようにしか見えないのと、 ネットでいろいろ探していたときに 「通常はヘッダーに関数を実装することはタブーなはずだが、Visual2005C++ではそれを堂々と”やれ”と言っているのである」といった内容の批判の記事を読んだのも、疑問がさらに増えた理由です。 (そのページのアドレスを記憶していなかったので再び見つけられなかったのが残念なんですが・・・) VS2005 ExpでWin32のアプリをつくり、デザインフォームで例えばボタンのクリックイベントを作製すると、イベントの部分がForm.hの中にできてしまうのです。 確かにどう書こうと自由ですけど、腑に落ちないんです。

関連するQ&A

  • c++/cli .NET Formアプリケーションの全画面の表示について

    現在visual studio 2008 Express Editionで、c++/cli .NET のFormアプリケーションを作成しています。 Bitmapクラスに格納した画像データを、全画面で背景を黒にして表示させたいのですが、やり方がわかりません。誰か教えてください!!

  • Visual C#でFormに別のクラスからアクセスするには?

    現在Visual C# 2005 Expressで簡単なアプリケーションを作成しています。Formからフォルダを指定して、別のクラス内でFormで指定されたフォルダ内のファイルに対して様々な操作をするといったものです。 そこで質問なのですが、処理するファイルが多いので進行状況をForm上のテキストボックスやステータスバーなりに表示させて意図思い、Formとは別のクラス内に、 Form frm = new Form1(); frm.TextBox1.TEXT = count + "を処理中です。"といったような記述をしても、「静的なメンバが・・・」といったエラーが出てしまいます。 入門者の自分としては、いろいろと調べてみましたが解決できずに困っています。 このような場合、どのようにするとよいのかお力をお貸しください。

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

    初めて質問させていただきます。よろしくお願いします。 当方、VisualStdio2005内のC++2005で、 ダイアログベースにてツールを開発していました。 ある日、ダイアログ上に多くのEditコントロールを作成(追加)することになり、 ダイアログリソースをVC内のリソースエディタにて、 テキスト形式でコントロールを追加していきました。 そのときは、テキストでの変更内容がダイアログにも反映されていたのですが、 その後はダイアログにツールボックスでのコントロールの追加やサイズ変更など、 見た目には反映されてもビルド後に反映されなくなってしまいました。 クリーン後のリビルドでも、問題は解決しません。 原因と対策をご存知の方、いらっしゃいましたらご教授いただけませんでしょうか。 よろしくお願いします。

  • C# form

    Button _Button = (Button)sender; int but = 0; if (_Button.Name == "button1") { but = 1; } if (_Button.Name == "button2") { but = 2; } if (_Button.Name == "button3") { but = 3; }      //Form2クラスのインスタンスを作成する Form2 f2 = new Form2(this); //Form2を表示する //ここではモーダルダイアログボックスとして表示する ////オーナーウィンドウにthisを指定する //f.ShowDialog(this); //フォームが必要なくなったところで、Disposeを呼び出す f2.Show(); 上記のようにボタン配列を作成し,クリックイベントを発生させています.そこで押されたボタンにより butに所定の値を入れてこれを,form2において判断値として使用したいのですが,どのようにすれば 良いでしょうか? 昨日から悩んでいるのですが自分だけでは解らないのでご教示願いたいと思います.

  • resource.hの変更

    質問です resource.hの中のリソースIDの中身を変更したら resource.h このファイルはMicrosoft Developer Studio以外で修正されています。○○.rcを再ロードしますか? とでてきてここで「はい」を選んだらダイアログ画面などが開けなくなってしまいました。 どうしたらよいでしょうか?

  • リソースの編集ができません。リソースビューが開かない

    VC++2005で、以前 .rcや.rc2ファイルをダブルクリックすると、 リソースエディタが開いて、ダイアログボックスの編集をツールボックスを使って設定しておりましたが、現在、ダブルクリックしても何も出てこなくなりました。 メニューの表示 - リソースビューも開きません。 何か設定が変わってしましたのでkしょうか? それともVisualStudioが壊れたのでしょうか?

  • C++/CLIにてForm1の要素に外部から

    C++/CLIにてForm1の要素に外部の関数からアクセスしたいです。 Windows7、Visual Studio2010にてC++/CLIで 簡単なフォームアプリケーションを作成しています。 仮に新規作成し、とりあえずテキストボックスを貼りつけたとします。 この際「Form1.h」が自動的に作成され、Form1クラスの中に textBox1などの要素が自動的に作成されるかと思います。 Form1クラスのメソッドの中からそれにアクセスするには this->textBox1->Text = L"変更"; みたいにするだけで良いですが、 こうしたForm1クラスの要素に対し、 Form1.h以外の場所にある外部の自作の関数から アクセスを行うにはどのようにすれば良いのでしょうか。

  • 【C#】別フォームも同時に閉じるには?

    いつもお世話になります。 C#に関して質問です。 VisualC#2008を使っています。 今、Form1の閉じるボタンを押すと、別フォームのForm2も閉じるようにプログラムを組んでいます。 今のところ、下のようなプログラムを書いているのですが、Form1だけが閉じられるだけでForm2が閉じられません。 どうしたらいいのでしょうか? 誰か解決策を教えてください。 よろしくお願いします。 public Form form1; private void Form2_FormClosing(object sender, FormClosingEventArgs e) { DialogResult result; result = MessageBox.Show("このまま終了すると問題は保存されません。よろしいですか?", "確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2); if (result == DialogResult.OK) { Form form1 = new Form(); form1.Close(); } else if (result == DialogResult.Cancel) { //キャンセル時の処理内容 } }

  • ダイアログとリストコントロールのサイズ変更

    VC++でダイアログベースのプログラミングをしています。 初心者です。 ダイアログの枠をドラッグしてサイズ変更ができるようにしたくて、 先週からネットや本を読み漁っていたのですが、 先日リソースのプロパティで枠の種類を[サイズ変更枠]にすると、 可変にできることがわかりました。 ただ、ダイアログの大きさは変更できるようになったものの、 ダイアログに配置してあるリストコントロールのサイズは固定のままです。 これを、ダイアログの枠のサイズに合わせて可変にすることはできないでしょうか。 また今回の内容に限らず、ダイアログやコントロールを作成する時に、 参考になるような本やサイトでオススメのものがありましたら、 ぜひ教えて頂きたいです。 ちなみに私が今参考にしている本はこの3冊です。 「図解でわかるVisualC++2005 Express Edition」 「VisualC++逆引き大全 500の極意」 「VisualC++.NET 逆引き大全 500の極意」

  • Visual C# Express Edition の機能制限について

    Visual C# Express Edition の機能制限について教えてください Visual C# Express Edition を使ってプロジェクトを作り、そのプロジェクトを保存する為にプロジェクト保存ダイアログを表示させます そのダイアログには 名前 場所 ソリューション名の既定値が表示されていますが、その何れかを変更すると上書き保存釦が消えてしまいます 結局VC#が指定した名前、場所でしか保存出来ません また作ったプログラムの製品情報を編集するアセンブル情報ダイアログボックスも表示出来ません 同じようにソリューションに新しいプロジェクトを追加出来ません これは無償のExpress Editionゆえの制限なんでしょうか? もしそうであるならば制限の一覧を知る方法はありますか?