基于上篇已经解决了富图软件窗口child的效果。这边主要仿照其重绘边框——即活动窗口边框高亮,本文不讲标题栏/border重绘(难度是比Client绘制要难,但是社区也有人做了相应的demo),基于富图考虑,它不要标题栏,我们也用无边框窗口绘制就好了。
1.边框及标题栏绘制
void CDlgFrm::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialogEx::OnPaint()
//画边框
HPEN newPen = CreatePen(PS_SOLID, 2, m_colFrm);
HPEN oPen = (HPEN)dc.SelectObject(newPen);
CRect rc, rc2;
GetClientRect(rc);
rc.left = rc.top = 2;
dc.Rectangle(rc);
dc.SelectObject(oPen);
//画标题栏
oPen = (HPEN)dc.SelectObject(GetStockObject(NULL_PEN));
HBRUSH newBrsh = CreateSolidBrush(RGB(130, 130, 130));
HBRUSH oldBrsh = (HBRUSH)dc.SelectObject(newBrsh);
dc.Rectangle(3, 3, rc.Width()+1, 33);
dc.SelectObject(oldBrsh);
::DeleteObject(newBrsh);
dc.SelectObject(oPen);
//画标题文字
if (m_strTitle.IsEmpty() == FALSE)
{
rc = CRect(0, 0, 100, 30);
dc.SetTextColor(RGB(255, 250, 250));
dc.SetBkMode(TRANSPARENT);
dc.DrawText(m_strTitle, rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
}
}
2.此时还不能move/resize窗口,于是重写OnNcHitTest
LRESULT CDlgFrm::OnNcHitTest(CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
UINT nHitTest = CDialogEx::OnNcHitTest(point);
CPoint pt(0, 0);
ClientToScreen(&pt);
if (nHitTest == HTCLIENT && point.y - pt.y < 32)
{
nHitTest = HTCAPTION;
}
RECT rcWindow;
::GetWind