• ベストアンサー

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の中にできてしまうのです。 確かにどう書こうと自由ですけど、腑に落ちないんです。