MFC CDialog ネタをもいっちょ。前回サンプル作ったので、その続きに実装しちゃいます。
今回のお題は、システムメニューを持たないダイアログに、「タイトルバーをダブルクリックされたら最大化 <-> 元のサイズに戻す」の機能を実装せよと言うもの。当然、最大化、最小化ボタンもありません。
ところで、VB6 でサイズ変更可能な Form を作成して、ControlBox プロパティに False を設定すると、システムメニューも最大化・最小化ボタンないウインドウができますが、ちゃあんとタイトルバーダブルクリックが効くんですよね。Spy++ でメッセージをキャプチャすると、WM_NCLBUTTONDBLCLK nHitTest = HTCAPTION
が落ちてきているのが見えます。そこで、AP 内でもそれを判断させてみることにしてみました。
StatusDialog.cpp 内のメッセージマップ部分に1行追加します。
BEGIN_MESSAGE_MAP(CStatusDialog, CDialog)
ON_WM_SIZE()
ON_WM_NCLBUTTONDBLCLK()
END_MESSAGE_MAP()
CStatusDialog クラスに OnNcLButtonDblClk を追加します。
protected:
virtual BOOL OnInitDialog();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnNcLButtonDblClk (UINT nHitTest, CPoint point);
DECLARE_MESSAGE_MAP()
void CStatusDialog::OnNcLButtonDblClk (UINT nHitTest, CPoint point)
{
if (HTCAPTION == nHitTest)
{
if (IsZoomed ())
{
SendMessage (WM_SYSCOMMAND, SC_RESTORE, 0);
}
else
{
SendMessage (WM_SYSCOMMAND, SC_MAXIMIZE, 0);
}
return;
}
CDialog::OnNcLButtonDblClk (nHitTest, point);
}
実行してみると、なかなか期待したとおりの動き。でもよく見ると、なぜか最大化した時にタスクバーと重なってしまいます。前回ステータスバーを付けてなかったら気付かないかもですが、とにかく、タスクバーのサイズを無視して、デスクトップいっぱいいっぱいまで最大化してしまっているようです。