2012-01-12 7 views
5

こんにちは親愛なる、経験豊富なユーザ、行うには正しいことは何ですかDialogBoxを呼び出します。私はいくつかの時間のために窓にプログラミングされている、と私は<code>What is the right thing to do when creating a user interface?</code></p> <p>はそれがUIにやるですこの質問を持っておく</p> <p>、ダイアログボックスかのcreateWindow

それとも最初WNDCLASS構造を作成するより面倒な方法ですが、フィールド、RegisterClass(& WC)を宣言してのcreateWindowを使用し、最後にその同じ機能だけで初期設定がダイアログボックスに簡単です、あなた緩いabitの制御にクラス。

私はアプリケーションの目的が何であるかを尋ねると思います。スキンアプリについては(それから私はCreateWindowを使用します)、それが単純な電卓アプリケーションの場合はDialogboxに行きます。

しかし、プロの目的は何ですか?

そして、QTやJavaをそのような種類のアプリケーションに使用するかどうかについて議論することはありませんので、win32領域を守ってください。フレームワーク上の私の立場は、不必要なオーバーヘッド、JRE QTの余分なDLLと.NETはこれらのファイルをすべてインストールする必要があります。これらのファイルは20MB以上の領域にあります。私はそれの正当性を見ません。

あなたの答えてくれてありがとう、あなたはいくつかの論理部分から成る複合体としてダイアログボックスを扱うことができ、あなたが私のとりとめ

+2

正しいことは、あなたがやっていることによって異なります。特定の客観的な質問は、Q&A形式に適しています。あなたのブログに馬鹿げた言葉を残してください。P – AJG85

+0

どちらの方法も他の方法よりも「正しい」方法です。私は開発の容易さのためにダイアログボックスを好む。 – Luke

+0

あなたはVCLに遭遇したことはないと思います...... –

答えて

1

を読むためにかかった時間:

  1. の読み込みダイアログ定義リソース;
  2. CreateWindowのいくつかの呼び出しを介して内部的に実行されるダイアログウィンドウを作成します。最初のものはダイアログのためのもので、次にテンプレートのコントロールのものです。
  3. "モダリティ"をサポートし、メッセージポンプを実行する所有者ウィンドウをブロックする:GetMessage - > IsDialogMessageまたはTranslateMessage + DispatchMessage。あなたのプログラムの流れは、ダイアログボックス()関数への単一の呼び出しにその決定をカプセル化し、ユーザーの判断に応じて分岐する必要がある場合に比喩的にこの組み合わせを話す

に便利です。この関数は実際には多くの作業を行い、生のWin32ウィンドウとの非同期性を隠すことでプログラムの理解を容易にします。

しかし、この「高レベル」、特にその中に含まれるメッセージループは、すでにWin32にメッセージループがあり、DialogBoxの呼び出しが特定のメッセージ。したがって、この場合は、ネストされたメッセージループに注意する必要があります。特に、メインのメッセージループでカスタムメッセージ処理を行う場合は注意が必要です。

このような問題を回避するために、CreateDialog関数を使用することもできます。この関数は複雑ですが、パート1とパート2のみです。メッセージループを開始しません。したがって、独自のメッセージ処理手順を提供する必要があります。必要であれば、モダリティにも注意する必要があります。

私の練習では、本当に小さなユーティリティアプリケーションのためにDialogBoxを数回しか使用しませんでした。アプリケーションのメインウィンドウとしてダイアログボックスを使用して

+0

ネストされたメッセージは痛みです。私はWinAPIで経験した人でさえ、機能が静かに「再入力」されて以前のコンテキストデータを上書きしていることに気づいた人はほとんどいませんでした。これは非常に面白い種類のバグにつながる可能性があります。私は、既存のメッセージループの上にメッセージループを追加しないようにしています。 – paercebal

0

は、あなたが新しいプロジェクトを作成するときにVisual Studioが選択肢としてそれが含まれていることをとても便利です。リソースエディタを使用してウィンドウをレイアウトすることができます。ダイアログを作成すると、すべての子ウィンドウが自動的に作成されます。

あなたも、ダイアログのWM_PAINTメッセージに応答することによって、独自のカスタム背景を行うことができます。

ダイアログボックスのデフォルトの動作は、制御フォーカスを変更するTabキーに応答することによって、例えば、便利です。私の経験で

2

、メインウィンドウアプリケーションとしてダイアログボックスを使用すると、最初は簡単なようだが、それはあなたが(代わりにCreateDialog()DialogBox()を使用して対話を行う場合は特に、非常に不快取得します。

  1. あなたがドン」トンスーナー。メッセージループを管理しているか、後であなたは前TranslateMessageの段階、またはアイドル処理、または類似した何かを追加したいと思う。そして、そのためにあなたがあなた自身のメッセージループを記述する必要があります。

  2. あなたはメッセージプロシージャではなくダイアログプロシージャを記述します。かなりの違いがありますが、私が考えることができる最も重要なのは:

    a。戻り値は、メッセージで文書化されているように実際のLRESULTではなく、ごくわずかなダイアログのみのメッセージでほとんど役に立たないBOOLです。

    b。いくつかの重要なメッセージは、ダイアログプロシージャ、特にWM_CREATEに送信されません。

  3. あなたはあなたの窓のTHW WNDCLASSを定義しないので、あなただけの変更はできませんがいくつかあります:デフォルトHBRUSH、デフォルトのHICON、WNDCLASSフラグなどとFindWindowを使用してはPITAになります。

  4. は、ダイアログにメニューを追加することはできません、とツールバーはちょうど奇妙に見えます。

これらの欠点はすべて回避策がありますが、それは重要ではありません。

と見かけの利点について:実際には、アプリケーションのメインウィンドウは、非常に多くのユーザーコントロールを持つべきではない。

  1. 「あなたはダイアログエディタを使って簡単にコントロールをレイアウトすることができます」。あなたのお気に入りのWindowsアプリケーションを考えてください。メインウィンドウにいくつのコントロールがありますか?コントロールをオプションダイアログなどに任せてください。

  2. は「焦点は根本的な対話によって自動的に処理された」:メインウィンドウ内のコントロールを持っていない場合は、この時点では議論の余地があります。また、実際にする必要がある場合は、さらに、フォーカスを処理することは自明です。

私はダイアログベースのアプリケーションを作成することに意味がないと言っているわけではありません。より良い方法があれば、特に自明でない場合には、二度考えなければならないということです。

関連する問題

 関連する問題