Win32APIでGUIの作成について質問です。


環境は以下のなります。
言語はC言語 及びC++
IDEはVisual Studio 2010 professional を検討
VC++で作成予定(.NETでは無くネイティブコードで作成したい為)

GUIの作成について分からない点があるので教えてください。
メインウィンドウにボタン等のコントロールを配置する場合や
幅の指定等をプログラムを書いていくのでは無く
C#のフォームデザイナの様にGUI上で操作していく事は出来ますでしょうか。
(必要ならばMFCやATL/WTLの使用も有りです)

ちなみに、上記はダイアログでは無くあくまでメインウィンドウについてです。
.NETは使用せず、ネイティブコードで生成したいのでC++/CLIの使用はしません。

もし可能なら参考になるWEBサイトや書籍等を教えて頂ければ幸いです。
以上、宜しくお願い致します。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/09/16 23:54:00
  • 終了:2011/09/23 23:55:02

ベストアンサー

id:cx20 No.1

cx20回答回数606ベストアンサー獲得回数1072011/09/18 05:23:31

C#のフォームデザイナの様にGUI上で操作していく事は出来ますでしょうか。

VC++ の場合、フォームデザイナに相当するものは、リソースエディタ(ダイアログエディタ)になります。

ただし、VC++ のリソースエディタは、C# のフォームデザイナに比べたら、お世辞にも高機能とは言えません。例えば、コントロールの配置(レイアウト)までは、ダイアログエディタで行えますが、ウィンドウのサイズに合わせて、サイズ変更をするような設定(C# のAnchorプロパティのような設定)は行えません。(動作をプログラミングする必要があります。)


この制限は、ダイアログエディタの制限というより、リソーススクリプト(リソースの仕様)の制限によるものです。

■ リソーススクリプトについて - by AOK

http://homepage3.nifty.com/aokura/tips/rc.html

■ Resource-Definition Statements (Windows) - MSDN

http://msdn.microsoft.com/en-us/library/aa381043.aspx

ちなみに、MFC や WTL にフォーム用のクラスがありますが、結局は、ダイアログを子ウィンドウとして貼り付けたものになります。

また、Win32 ベースのアプリでも、同様に、ダイアログを子ウィンドウに貼り付けることで実現してます。


以下は、Win32 アプリケーションで、ダイアログを貼り付けるサンプルです。

■ 第255章 ダイアログを子ウィンドウとして張り付ける - 猫でもわかるプログラミング

http://www.kumei.ne.jp/c_lang/sdk3/sdk_255.htm

フォームの開発をダイアログベースで行った場合、GUI アプリケーションの開発のし易さとしては、MFC が一番かと思います。

(ただし、クラスライブラリやウィザード等の使い方を知っていることが前提です。)

■ MFC編 - フォームビューの基本

http://www.g-ishihara.com/mfc_sd_05.htm

■ MFC編 - DDXの基本1

http://www.g-ishihara.com/mfc_dx_01.htm

■ MFC編 - DDXの基本2

http://www.g-ishihara.com/mfc_dx_02.htm

デメリットは、

  • MFC に関する書籍が少ない(VC++6.0 の頃は、多くの入門書が出ていたが、最近は殆ど出ていない)
  • ライブラリのサイズが大きい

と言う点でしょうか。

以下は、各種ライブラリ毎のアプリケーションのサイズの参考例※です。

(※アプリケーションの種類は、SDIのアプリケーションで、Release ビルドしたものになります。)

使用ライブラリ使用クラスサイズ
MFC(スタティックリンク)CFormView3,288KB
MFC(共有DLL使用)CFormView115KB
WTLCDialogImpl125KB
Win32-82KB
VC#(Windows Form)Windows.Forms.Form10KB

使用する開発言語やクラスライブラリの決定は、アプリケーションの形態やサポートするプラットフォーム、開発者のスキルや納期と言った要因によって変わってきますので、一概にこれがベストというものはありません。

例えば、業務アプリ等、画面開発の効率が求められるケースであれば、VC#やVB.NET と言った選択肢もあるかと思います。


つまるところ、ネイティブアプリで、

  • 画面開発の効率を求めるのであれば、MFC
  • コンパクトな(ファイルサイズの小さい)アプリケーションを求めるのであれば、ATL/WTL

と言ったところでしょうか。


以下は参考記事です。

  • Win32 プログラミング入門

■ C++ による Windows プログラミングの学習 (Windows)

http://msdn.microsoft.com/ja-jp/library/ff381399.aspx

■ 猫でもわかるプログラミング

http://homepage2.nifty.com/c_lang/

  • WTL プログラミング入門

■ ATL/WTLを利用したVisual C++のWindowsプログラミング:CodeZine(コードジン)

http://codezine.jp/article/corner/45

■ ATL/WTL - ATL/WTL による Windows プログラミング

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

  • MFC プログラミング入門

■【 G.Ishihara流 】Visual C++ (MFC)超入門

http://www.g-ishihara.com/

■ Code Recipe - 連載! とことん VC++ | MSDN

http://msdn.microsoft.com/ja-jp/visualc/hh146885

  • id:suica123
    ご回答ありがとうございました。こんなに詳しく教えて頂けるとは思っていなかったので
    すごく嬉しいです。メインウィンドウについてもダイアログエディタでレイアウトして貼り付ける様に扱うのは、気付かなかったです。教えて頂いたサイトと書籍を参考に頑張ってみます。本当にありがとうございました。
  • id:cx20
    書籍で勉強するのも手ですが、VC++ で、どのような GUI が実現できるかは、
    多くのサンプルコードを実行してみると理解を深めやすいかと思います。
    以下は参考になりそうな URL です。

    ■ Visual C++ Samples and Related Documentation for Visual Studio 2010 - Home
    http://archive.msdn.microsoft.com/vcsamples/Wiki/View.aspx?title=ja-JP
    ■ CodeGuru - Microsoft developers related ideas, articles, tips, tricks, comments, downloads
    http://www.codeguru.com/
     http://www.codeguru.com/cpp/w-d/ … Windows & Dialogs 関連
     http://www.codeguru.com/cpp/controls/ … 各種 Control
    ■ CodeProject - Your Development Resource(ダウンロードは要登録)
    http://www.codeproject.com/
     http://www.codeproject.com/KB/mfc/ … MFC 関連
     http://www.codeproject.com/KB/wtl/ … WTL 関連

    あと、Win32 ベースのアプリケーションがどのような構造になっているか?は「Spy++」というツールを使うことで調査可能です。(CFormView で作成した画面に、ダイアログリソースが貼り付けられていることを確認することができます。)
    また、使ったことは無いですが、.NET ベースのアプリケーションを調査する「Managed Spy」というツールもあるようです。
    ■ 実行中の.NETアプリケーションのオブジェクト構造などを調査/操作するには? - @IT
    http://www.atmarkit.co.jp/fdotnet/dotnettips/605managedspy/managedspy.html

    VC++ での GUI アプリの開発は、覚えることが多くて大変ですが、頑張ってください。
  • id:suica123
    サンプルコードのURL、ありがとうございます。
    色々と参考になりそうなものも有り勉強になります。
    こんなに親切に教えて貰えるとは思っていなかったので、とても感謝してます。
    この度は、本当にありがとうございました。

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

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

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

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