フレームワークの使い方
下図に、電子メールのアラートウィンドウ作成に使用したコントロールを示します。
次の作業を実行してください。
- ダイアログテンプレート(境界なし)を作成し、必要に応じてラベルまたはハイパーリンクを表示するためのスタティックコントロールや、ボタン、画像コントロールを追加します。
- ダイアログテンプレートからクラス(
CDialog
から派生したもの)を追加します。 - クラスヘッダーに「AlertDialog.h」をインクルードし、基本クラスを
CDialog
からCAlertDialog
に変更します。 - アラートダイアログに使用するカスタマイズ済みの各コントロール(アラートコントロール)に対して、DDX機能を使用して変数を追加します。例えば、タイトルを表示するラベルに対して、以下を実行します。
- ダイアログクラスのヘッダーに「AlertLabel.h」をインクルードします。
- CAlertLabel型の変数をクラスに追加します。
- 次のように、
DoDataExchange
で変数をコントロールに関連付けます。
CAlertLabel m_ctrlTitle;
void CDemoAlert::DoDataExchange(CDataExchange* pDX) { CAlertDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_STATIC_TITLE, m_ctrlTitle); }
- アラートウィンドウの背景を変更する場合は、
OnInvalidate
をオーバーライドして、すべてのラベル、ハイパーリンク、画像コントロールおよびボタンについてInvalidateCachedBitmap()
を呼び出す必要があります。 - ハイパーリンクまたはボタンがクリックされたときに通知が必要な場合は、「AlertMessages.h」内に定義されている適切なメッセージを処理します。
- クラスにメッセージハンドラを追加します。
- 適切なハンドラをメッセージマップに追加します。
- ハンドラを実装します。通常は、親ウィンドウにメッセージを送信して、特定のボタンまたはコントロールがクリックされたことを通知します。以下のコードでは、アラートウィンドウのみを非表示にします。
afx_msg LRESULT OnHyperlinkedClicked(WPARAM wParam, LPARAM lParam); afx_msg LRESULT OnButtonClicked(WPARAM wParam, LPARAM lParam);
BEGIN_MESSAGE_MAP(CDemoAlert, CAlertDialog) ON_MESSAGE(WMA_HYPERLINKCLICKED, &CDemoAlert::OnHyperlinkedClicked) ON_MESSAGE(WMA_BUTTONCLICKED, &CDemoAlert::OnButtonClicked) END_MESSAGE_MAP()
LRESULT CDemoAlert::OnHyperlinkedClicked(WPARAM wParam, LPARAM lParam) { Hide(); return 0; } LRESULT CDemoAlert::OnButtonClicked(WPARAM wParam, LPARAM lParam) { Hide(); return 0; }
- デフォルトでは、
CAlertDialog
でWM_LBUTTONDOWN
とWM_LBUTTONUP
を処理すると、マウスを使ってウィンドウを移動できます。この動作が不要な場合(例えばユーザーがウィンドウをクリックしたら、ウィンドウを閉じるような場合)は、派生したダイアログクラスでこれらのメッセージを処理し、適切なアクションを実行してください。例については、デモアプリケーションのCWinampAlert
をご覧ください。
void CDemoAlert::OnInvalidate() { m_ctrlTitle.InvalidateCachedBitmap(); }
これらのクラスの使用例については、デモアプリケーションを参照ください。
デモアプリケーション
本稿では、3種類のアラートウィンドウを生成するデモアプリケーションを作成します。それぞれ、電子メール通知、FirefoxライクなアラートおよびWinampライクなアラートです(スクリーンショットは、本稿の最初にあります)。
このデモアプリケーションでは、以下の設定をカスタマイズできます。
- アニメーション時間(表示するときと通常閉じるとき)。ミリ秒単位で指定します。
- 表示時間(表示アニメーションが終了してから閉じるアニメーションが始まるまでの間隔)。ミリ秒単位で指定します。
- 表示アニメーションが終了した後の最大不透明度。0~100のパーセント単位で指定します。100を指定すると、ウィンドウが完全に不透明になります。
- マウスがウィンドウ上にあるときに(不透明でなければ)ウィンドウを完全に不透明にして、マウスがウィンドウから離れるまで表示し続けるかどうか。この場合、マウスがウィンドウから離れると、表示タイマが再開されます。
注意事項
本稿で紹介したコードは、著作権表示を明記する場合に限り、(営利、非営利に関わらず)どのような種類のアプリケーションでも利用、改変または拡張することができます。新たにコントロールや機能を作成して第三者に公開する場合は、既存のコードと統合するときにお気軽にご連絡ください。
謝辞
一部のコードについては、以下の記事と投稿より、コードを引用または参考とさせていただきました。