2
私はCPropertySheet
から派生したクラスを持っており、ダイアログの右下に「グリッパー」を挿入したいと思います。
私のダイアログは既にサイズ変更可能です。グリッパーを挿入することはできません。PropertySheetにグリッパを追加するにはどうすればよいですか?
私はCPropertySheet
から派生したクラスを持っており、ダイアログの右下に「グリッパー」を挿入したいと思います。
私のダイアログは既にサイズ変更可能です。グリッパーを挿入することはできません。PropertySheetにグリッパを追加するにはどうすればよいですか?
これを行うための特別なAPIがあるかどうかわかりません。 1つの方法は、手動で描画し、グリッパの位置をON_WM_NCHITTEST
に上書きし、HTBOTTOMRIGHT
を返します。たとえば:
void CMyDialog::OnPaint()
{
CPaintDC dc(this);
CRect rc;
GetClientRect();
rc.left = rc.right - ::GetSystemMetrics(SM_CXHSCROLL);
rc.top = rc.bottom - ::GetSystemMetrics(SM_CYVSCROLL);
HTHEME ht = OpenThemeData(m_hWnd, L"STATUS");
if (ht)
{
DrawThemeBackground(ht, dc, SP_GRIPPER, 0, &rc, 0);
CloseThemeData(ht);
}
else
{
dc.DrawFrameControl(rc, DFC_SCROLL, DFCS_SCROLLSIZEGRIP);
}
}
LRESULT CMyDialog::OnNcHitTest(CPoint point)
{
CRect rc;
GetWindowRect(rc);
rc.left = rc.right - ::GetSystemMetrics(SM_CXHSCROLL);
rc.top = rc.bottom - ::GetSystemMetrics(SM_CYVSCROLL);
if (rc.PtInRect(point))
return HTBOTTOMRIGHT;
return CDialog::OnNcHitTest(point);
}
void CMyDialog::OnSize(UINT type, int cx, int cy)
{
CDialog::OnSize(type, cx, cy);
Invalidate(TRUE);
}
は、メッセージマップに追加します。
ON_WM_PAINT()
ON_WM_NCHITTEST()
ON_WM_SIZE()
おかげでその作業を。私は最初のif(Linkerの問題)をコメントしました。なぜ最初のものが必要なのですか? – Penachia
はい、 'OpenThemeData'やその他のテーマ関数を削除することができます。 2つの方法は、グリッパ画像をわずかに異なるように描画します。 'DrawThemeBackground'は、ビジュアルスタイルが有効なときに見られるように、メモ帳のグリッパーと同じ方法で描画します。 –