1997年9月アーカイブ


処理する Windows メッセージがない時を利用してバックグラウンド処理を行うという 手法はよく利用されています。 例えば DirectX などを利用したアプリケーションでバックグラウンド処理で 画像を描画するという場合などです。 MFCを使用する場合フレームワークが CWinApp::OnIdle() を呼び出すので、 こいつをオーバライドしておけばバックグラウンド処理を行うことができます。 ダイアログボックスの場合にはどうすればいいかというと、 CWinApp::OnIdle() を うまく使えばきっとできると思いますが、あまり美しいコーディングにはならないでしょうね。 こういう場合には WM_KICKIDLE を使用すればスッキリとしたコーディングが可能です。

さて、Windowsにはプライベートメッセージがあるというのを御存知だろうか? プライベートメッセージといっても自分で定義する WM_USER + NNN とかではなく、 Microsoft の開発の人たちがこっそり(?)作って公開されていないメッセージのことです。 (afxpriv.h の中に定義されていますが VC++ オンラインヘルプには項目がありません。) ということは将来は使えなくなる可能性もあるが....

最近作成した拙作「SundayFTP」ではこのプライベートメッセージを使用しています。 具体的には SundayFTP の 3Dオブジェクトを描画しているところに使用しています。 処理すべきメッセージが存在する場合にはそのメッセージを処理し、文字列の描画や ウインドウの移動、表示などを行い、何も処理すべきメッセージが存在しない場合には 3Dオブジェクトを描画するというロジックになっています。

プライベートメッセージというのがあるということは、MSJ (何号か忘れましたが) に記事がでていることで知りました。詳細はそちらをご覧ください。

#include <afxpriv.h>

まず、このファイルをインクルードします。

...

BEGIN_MESSAGE_MAP(CMy3DMessageDlg, CDialog)
//{{AFX_MSG_MAP(CMy3DMessageDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
ON_WM_MOVE()
ON_WM_HSCROLL()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_ABORT, OnAbort)

// アイドリング処理(メッセージマップ手動追加)
ON_MESSAGE(WM_KICKIDLE, OnKickIdle)

ON_WM_PALETTECHANGED()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

アイドリングを行う処理をメッセージマップに追加します。

...

LRESULT CMy3DMessageDlg::OnKickIdle(WPARAM, LPARAM)
{
// アイドリング処理
m_p3d->Idling();

return TRUE;
}
ここで、実際のアイドリング処理を行います。

ウェブページ

  • about
Powered by Movable Type 5.2.10

このアーカイブについて

このページには、1997年9月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは1996年10月です。

次のアーカイブは2001年5月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。