none
GUIプログラムの作成法 RRS feed

  • 質問

  • 私は現在、Visual Studio 2008でプログラムの開発を行っています。

    今のプログラムはコンソール画面のもの(CUI)でとても扱いづらく、GUIのものに変更していきたいと考えています。

    GUIといってもWin32やCLRなど、いろんなプログラムの書き方があると思います。

    どの書き方でプログラムを作っていけば、効率よく、また高機能なプログラムになるのでしょうか。

    また、Win32とCLRではどう違い、どのような特徴があるのでしょうか。

    教えて頂けると助かります。

    よろしくお願いします。

    2010年8月7日 16:08

回答

  • MFC も忘れないであげましょう。(ATL でも作れないことはないですが、割愛します)

    Win32
    自分で API を使ってコードで画面を作っていくタイプ。
    ダイアログはリソースエディタである程度配置できるが、CLR と比べると貧相に感じるかも。
    ダイアログに対する処理はプロシージャを書いて、switch で分岐したりするなど必要。

    MFC
    API を(薄く)ラップするクラスライブラリ。
    API を直接使う機会は減るが、ある程度の知識を求められる。
    メッセージ処理はマクロを使って書いておけば、特定のメソッドを呼び出してもらえるなど、プロシージャを直接書かなくても良い部分がある。
    ダイアログはリソースエディタである程度配置できるが、CLR と比べると貧相に感じるかも。

    CLR
    .NET Framework を使えるために拡張された言語。C++/CLI とも呼ばれます。
    本来の意味での C++ ではなくなります。
    C++/CLI ならではの独自のキーワード、文化になじめれば、強力な .NET Framework のクラス群のアシストは大きいかもしれません。
    ダイアログに相当するフォームは、かなりのコントロールがあり、またデザイナからプロパティでいろいろと設定できるため、簡単に画面を作ることができるでしょう。
    ただし、ほかの .NET Framework の言語に比べて、敷居はかなり高いと思います。(2010 では IntelliSense が効かないなど)
    流用するところだけ C++/CLI でラッピングして、画面は C# で作って、参照するような形が楽かもしれません。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2010年8月18日 7:53
    • 回答としてマーク 山本春海 2010年8月30日 8:09
    2010年8月8日 2:59
    モデレータ
  • 処理速度はC++のほうが早いと聞いたことがあるのですが、本当でしょうか。

    何と比べて、C++ の方が速いと書かれているのかわかりません。

    現在開発しているプログラムではリアルタイムに処理するものでなるべく遅延を抑えたいと考えています。
    その面から考えても、どの方法でプログラム(GUI)を書くべきかを教えて頂けないでしょうか。

    どのタイプをとるとしても、通信・処理スレッドは別スレッドにするべきでしょうね。
    UI スレッドでやると、処理の遅延や画面のフリーズ(応答性低下)を招くことになりますので、良くないでしょう。

    一般論としてどれが良いとかは言えなくもないと思いますが、一度検証して頂いた方が良いとは思います。
    学習コスト、作成コスト、実行時の動作コストなど、判断にあたっては複数のパラメータがあるはずです。
    動作コストが最小のものと希望されていますが、学習・作成コストが数ヶ月となったら、許容できませんよね?
    本当にベストを求めるべきなのか、それぞれのパラメータを考慮して、許容できる範囲で選択するべきか、それはあなた方にしか判断できません。
    従って、どれが良いかを一律に言うことは難しいと考えています。

    # 私見:組み方を間違えなければ、よっぽどの性能を要求しない限り、どれも差がつきにくいとは思います、速度面は。
    # ただし、学習・作成コストも馬鹿にはできないので、ざくっとどんなものになるかは見積もっておきましょう。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2010年8月24日 8:09
    • 回答としてマーク 山本春海 2010年8月30日 8:09
    2010年8月8日 3:31
    モデレータ
  • 早いGUIとかC++に統一とか、いろいろ誤解と偏見をお持ちなようで。もう少しそれぞれのキーワードについて調べることをお勧めします。

    • 回答としてマーク 山本春海 2010年8月30日 8:10
    2010年8月9日 7:36
  • 同じ処理を何度も書いているのはC言語を使っているとかC++言語を使っていると言うのとは
    別問題ですよね。それはきちんと処理の設計が出来ているかと言う話なので使用言語とは話が別です。

    C言語を使っていたとしてもきちんと構造化していれば、同じ処理を何度も書くという事にはならないはずです。

    クラスの概念は再利用のしやすさに繋がると言うのがオブジェクト指向の考え方の一つだと思いますが、
    必ずしもクラスを使ったから再利用性があがるとは限りません。結局は設計の仕方の話です。

    CとC++を混ぜて使っていると言う記述も微妙だなあと感じました。
    C++言語で製造していてもグローバルな関数は定義できますから
    もしその事を混ぜて使っているといっているのであれば、
    混ぜて使っているのではなくてC++言語でプログラミングしていると言って良いと思います。
    あえてクラスにする必要がないようなケースであれば、名前空間を使った単なる関数を
    定義する事も珍しい話では有りませんから。

     


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答の候補に設定 山本春海 2010年8月24日 8:10
    • 回答としてマーク 山本春海 2010年8月30日 8:10
    2010年8月18日 9:56

すべての返信

  • MFC も忘れないであげましょう。(ATL でも作れないことはないですが、割愛します)

    Win32
    自分で API を使ってコードで画面を作っていくタイプ。
    ダイアログはリソースエディタである程度配置できるが、CLR と比べると貧相に感じるかも。
    ダイアログに対する処理はプロシージャを書いて、switch で分岐したりするなど必要。

    MFC
    API を(薄く)ラップするクラスライブラリ。
    API を直接使う機会は減るが、ある程度の知識を求められる。
    メッセージ処理はマクロを使って書いておけば、特定のメソッドを呼び出してもらえるなど、プロシージャを直接書かなくても良い部分がある。
    ダイアログはリソースエディタである程度配置できるが、CLR と比べると貧相に感じるかも。

    CLR
    .NET Framework を使えるために拡張された言語。C++/CLI とも呼ばれます。
    本来の意味での C++ ではなくなります。
    C++/CLI ならではの独自のキーワード、文化になじめれば、強力な .NET Framework のクラス群のアシストは大きいかもしれません。
    ダイアログに相当するフォームは、かなりのコントロールがあり、またデザイナからプロパティでいろいろと設定できるため、簡単に画面を作ることができるでしょう。
    ただし、ほかの .NET Framework の言語に比べて、敷居はかなり高いと思います。(2010 では IntelliSense が効かないなど)
    流用するところだけ C++/CLI でラッピングして、画面は C# で作って、参照するような形が楽かもしれません。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2010年8月18日 7:53
    • 回答としてマーク 山本春海 2010年8月30日 8:09
    2010年8月8日 2:59
    モデレータ
  • お返事ありがとうございます。

    処理速度はC++のほうが早いと聞いたことがあるのですが、本当でしょうか。

    現在開発しているプログラムではリアルタイムに処理するものでなるべく遅延を抑えたいと考えています。

    その面から考えても、どの方法でプログラム(GUI)を書くべきかを教えて頂けないでしょうか。

    よろしくお願いいたします。

    2010年8月8日 3:19
  • 処理速度はC++のほうが早いと聞いたことがあるのですが、本当でしょうか。

    何と比べて、C++ の方が速いと書かれているのかわかりません。

    現在開発しているプログラムではリアルタイムに処理するものでなるべく遅延を抑えたいと考えています。
    その面から考えても、どの方法でプログラム(GUI)を書くべきかを教えて頂けないでしょうか。

    どのタイプをとるとしても、通信・処理スレッドは別スレッドにするべきでしょうね。
    UI スレッドでやると、処理の遅延や画面のフリーズ(応答性低下)を招くことになりますので、良くないでしょう。

    一般論としてどれが良いとかは言えなくもないと思いますが、一度検証して頂いた方が良いとは思います。
    学習コスト、作成コスト、実行時の動作コストなど、判断にあたっては複数のパラメータがあるはずです。
    動作コストが最小のものと希望されていますが、学習・作成コストが数ヶ月となったら、許容できませんよね?
    本当にベストを求めるべきなのか、それぞれのパラメータを考慮して、許容できる範囲で選択するべきか、それはあなた方にしか判断できません。
    従って、どれが良いかを一律に言うことは難しいと考えています。

    # 私見:組み方を間違えなければ、よっぽどの性能を要求しない限り、どれも差がつきにくいとは思います、速度面は。
    # ただし、学習・作成コストも馬鹿にはできないので、ざくっとどんなものになるかは見積もっておきましょう。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2010年8月24日 8:09
    • 回答としてマーク 山本春海 2010年8月30日 8:09
    2010年8月8日 3:31
    モデレータ
  • 処理速度はC++のほうが早いと聞いたことがあるのですが、本当でしょうか。

    というのは、C#やJAVA、Basicと比較してという意味でした。

     

    Azuleanさんのおっしゃる通り、判断するにあたっては複数のパラメータがあると思います。

    その中でも、GUIの導入には学習コストがかなり多くかかってしまうと思います。

    しかし、めげずに頑張っていきたいと思います。

     

    現在のプログラムはC++で行っていたので、GUIのプログラムにするのにもC++を使っていきたいと考えています。

    Win32、MFC、CLRは、それぞれC++(クラスなど)で書くことはできるでしょうか。

    2010年8月8日 4:15
  • 現在のプログラムはC++で行っていたので、GUIのプログラムにするのにもC++を使っていきたいと考えています。
    Win32、MFC、CLRは、それぞれC++(クラスなど)で書くことはできるでしょうか。

    それらのキーワードでどういったものか調べてみましたか?
    調べていれば、こういった質問になっていなかったと思いますが、単純に質問として投げかけるだけでなく、自分でも調べてからわからなかったところを質問するようにしましょう。

    1 つ目の私の投稿では、C++ 主体でコードを書きたいという前提においての回答を書いたつもりです。
    ただし、CLR プロジェクトは、C++ をベースにした別の言語と捉えるべきです。
    油断していると、C++ ネイティブコードよりも速度が低下したものができあがることがあります。(コンパイル手法、使うライブラリなどに依存)

    なお、CLR プロジェクトに限らず、クラスライブラリやフレームワークを利用した場合、きちんと知識を持ってコードを書かないと、使い方間違えなどによって速度低下などを招くことはよくあります。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年8月8日 4:59
    モデレータ
  • 一応調べてみたのですが、よくわからかったので質問しました。

    というのも、win32ではどの参考書を見てもC言語でのプログラムとなっており、C++の参考書はありませんでした。

    また、CLRではC++/CLIという言語をつかっていますが、“C++”と入っています。

    なのでこれら、win32、CLRではC++で書くことができるのかわかりませんでした。

    2010年8月8日 6:58
  • というのも、win32ではどの参考書を見てもC言語でのプログラムとなっており、C++の参考書はありませんでした。

    Windows の API が C 言語ベースで提供されていると言えるような状況であるため、C 言語だけでも書けます。
    API を使ったプログラミングを説明・理解するのに、C++ である必要性はないのでそういった参考書はないのでしょう。

    また、CLRではC++/CLIという言語をつかっていますが、“C++”と入っています。

    C++ を拡張したものであって、C++ そのものではありません。
    使う・使わないは何に重きを置くかだと思いますよ。

    ちなみに、C++ の学習のために、C++/CLI を選択するのはちょっと違うと思います。

    なのでこれら、win32、CLRではC++で書くことができるのかわかりませんでした。

    CLR は独自言語なので、”C++ で書く”が意図した範疇にあるかは存じません。
    Win32 は C 言語ベースの関数群を、クラスに隠蔽するなどすれば、”C++ で書く”の範疇に入るかもしれません。

    そもそも、”C++ で書く”ってどういった状態でしょうか?どういったことを期待しているのでしょうか?目指しているのでしょうか?
    正直、何にこだわっているのか見えません。

    C 言語ライクのキャストを使ってはいけない?関数ベースでコードを書いてはいけない?標準 C++ から外れるような構文はすべてだめ?プラットフォーム独自の API の使用可否はどう捉える?


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年8月8日 8:39
    モデレータ
  • 私は、このようなシステムを作ろうとしています。

    http://auris.pu-toyama.ac.jp/PDF/ASJ20070303_3-Q-31.pdf

    このシステムは、同じ処理を多く行って実現しています。

    そのためには、変数と関数を一緒に扱えるクラスを使って書くことが見た目的にも、処理的にも一番いいのではないかと思いました。

    また、違う機能を付け加えたいといった場合も、クラスでならスマートにできると思いました。

    2010年8月8日 13:50
  • 私は、このようなシステムを作ろうとしています。
    http://auris.pu-toyama.ac.jp/PDF/ASJ20070303_3-Q-31.pdf
    このシステムは、同じ処理を多く行って実現しています。

    そこまで具体的な話にすると、アドバイスするためには深入りすることになり、なかなか難しいと思います。
    (私は時間の隙間でコミュニティ投げられる質問に答える努力をするだけの人なので、コンサルタントではありません)

    そのためには、変数と関数を一緒に扱えるクラスを使って書くことが見た目的にも、処理的にも一番いいのではないかと思いました。
    また、違う機能を付け加えたいといった場合も、クラスでならスマートにできると思いました。

    ”「C++ で書く」って何を目指しているのでしょうか?”に対する答えでしょうか。
    GUI を作るにあたっても、クラスによるカプセル化、ポリモーフィズムあたりを盛り込める・活用できる形で、書いていきたいという希望でしょうか?
    それであれば、C++/CLI を排除しなくても良さそうですね。

    さて、Win32 についてもハンドルをクラス内に持つなど、クラスライブラリを自作するようなことになるでしょうが、C++ のクラスでのカプセル化、実装は可能です。
    ただ、既存のクラスライブラリ、フレームワークを頼った方が効率的に作れる可能性が高いとは思います。

    CLR も言語やフレームワークの設計思想を理解すれば、使っていけるでしょう。

    従って、先にも書いたとおり、どれが良いとも正直言いかねます。
    いくつかのコスト、リスクを踏まえて、ご自身で判断するしかないという状態から変わりません。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年8月8日 14:23
    モデレータ
  • >私は現在、Visual Studio 2008でプログラムの開発を行っています。

    >今のプログラムはコンソール画面のもの(CUI)でとても扱いづらく

    すでにCUIでの開発経験はあるようですが、元のプログラムは、何で作られたのでしょうか?

    そのあたりから、ソースの利用ができるものを選べばいいと思います

    2010年8月9日 4:08
  • 現在は、CとC++を混ぜて作っていますが、C++に統一させるために書き直したいと考えています。

    また、同じ処理を何度も書いているためソースも分かりにくいので、クラスという概念を用いたいと考えています。

    2010年8月9日 7:32
  • 早いGUIとかC++に統一とか、いろいろ誤解と偏見をお持ちなようで。もう少しそれぞれのキーワードについて調べることをお勧めします。

    • 回答としてマーク 山本春海 2010年8月30日 8:10
    2010年8月9日 7:36
  • 同じ処理を何度も書いているのはC言語を使っているとかC++言語を使っていると言うのとは
    別問題ですよね。それはきちんと処理の設計が出来ているかと言う話なので使用言語とは話が別です。

    C言語を使っていたとしてもきちんと構造化していれば、同じ処理を何度も書くという事にはならないはずです。

    クラスの概念は再利用のしやすさに繋がると言うのがオブジェクト指向の考え方の一つだと思いますが、
    必ずしもクラスを使ったから再利用性があがるとは限りません。結局は設計の仕方の話です。

    CとC++を混ぜて使っていると言う記述も微妙だなあと感じました。
    C++言語で製造していてもグローバルな関数は定義できますから
    もしその事を混ぜて使っているといっているのであれば、
    混ぜて使っているのではなくてC++言語でプログラミングしていると言って良いと思います。
    あえてクラスにする必要がないようなケースであれば、名前空間を使った単なる関数を
    定義する事も珍しい話では有りませんから。

     


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答の候補に設定 山本春海 2010年8月24日 8:10
    • 回答としてマーク 山本春海 2010年8月30日 8:10
    2010年8月18日 9:56