MFC无边框窗体设置窗口圆角,并且绘制边框

//设置窗口圆角,并且绘制边框
BOOL CLogin::OnEraseBkgnd(CDC* pDC)
{
    CRect rect;
    GetClientRect(rect);        //取得窗体窗户区区域
    CRgn myrgn1, myrgn2;
    myrgn1.CreateRoundRectRgn(0, 0, rect.Width(), rect.Height(), 16, 16);//圆角的窗体区域
    //myrgn2.CreateRectRgn(0, 0, rect.Width(), 40);//标准栏区域
    CBrush frameBrush, titlebrush, bgbrush;
    bgbrush.CreateSolidBrush(RGB(255, 255, 255));//主窗体背景色画刷
    frameBrush.CreateSolidBrush(RGB(200, 200, 200));
    //titlebrush.CreateSolidBrush(RGB(80, 80, 80));//标题栏的画刷

    pDC->FillRgn(&myrgn1, &bgbrush);
    //pDC->FillRgn(&myrgn2, &titlebrush);
    pDC->FrameRgn(&myrgn1, &frameBrush, 1, 1);
    pDC->SetBkMode(TRANSPARENT);
    return true;
    return CDialogEx::OnEraseBkgnd(pDC);
}
//无标题窗口鼠标拖动
LRESULT CCRgnTestDlg::OnNcHitTest(CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    UINT nHitTest = CDialog::OnNcHitTest(point);
    return (nHitTest == HTCLIENT) ? HTCAPTION : nHitTest;//

    return CDialogEx::OnNcHitTest(point);
}
 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 MFC边框窗体可以通过以下步骤: 1. 创建一个派生自 CWnd 的类,作为无边框窗口的基类。 2. 重载 OnNcCalcSize 函数,计算非客户区的大小。 3. 重载 OnNcPaint 函数,绘制非客户区的背景和边框。 4. 重载 OnNcLButtonDown 函数,处理鼠标左键按下事件,如果鼠标位于窗口边缘,则将鼠标捕获,并设置窗口大小变化标志。 5. 重载 OnNcLButtonUp 函数,处理鼠标左键释放事件,释放鼠标捕获,并清除窗口大小变化标志。 6. 重载 OnMouseMove 函数,处理鼠标移动事件,如果窗口大小变化标志被设置,则根据鼠标位置改变窗口大小。 下面是一个简单的示例代码: ``` class CMyWnd : public CWnd { public: CMyWnd() { m_bSizing = FALSE; } protected: BOOL m_bSizing; afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp) { lpncsp->rgrc[0].left += 2; lpncsp->rgrc[0].top += 2; lpncsp->rgrc[0].right -= 2; lpncsp->rgrc[0].bottom -= 2; } afx_msg void OnNcPaint() { CWindowDC dc(this); CRect rect; GetWindowRect(rect); rect.OffsetRect(-rect.left, -rect.top); rect.DeflateRect(2, 2); dc.FillSolidRect(rect, RGB(192, 192, 192)); dc.Draw3dRect(rect, RGB(0, 0, 0), RGB(0, 0, 0)); } afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point) { if (nHitTest == HTLEFT || nHitTest == HTRIGHT || nHitTest == HTTOP || nHitTest == HTBOTTOM || nHitTest == HTTOPLEFT || nHitTest == HTTOPRIGHT || nHitTest == HTBOTTOMLEFT || nHitTest == HTBOTTOMRIGHT) { SetCapture(); m_bSizing = TRUE; } else { CWnd::OnNcLButtonDown(nHitTest, point); } } afx_msg void OnNcLButtonUp(UINT nHitTest, CPoint point) { if (m_bSizing) { ReleaseCapture(); m_bSizing = FALSE; } else { CWnd::OnNcLButtonUp(nHitTest, point); } } afx_msg void OnMouseMove(UINT nFlags, CPoint point) { if (m_bSizing) { CRect rect; GetWindowRect(rect); switch (GetHitTest(point)) { case HTLEFT: rect.left = point.x; break; case HTRIGHT: rect.right = point.x; break; case HTTOP: rect.top = point.y; break; case HTBOTTOM: rect.bottom = point.y; break; case HTTOPLEFT: rect.left = point.x; rect.top = point.y; break; case HTTOPRIGHT: rect.right = point.x; rect.top = point.y; break; case HTBOTTOMLEFT: rect.left = point.x; rect.bottom = point.y; break; case HTBOTTOMRIGHT: rect.right = point.x; rect.bottom = point.y; break; } MoveWindow(rect); } else { CWnd::OnMouseMove(nFlags, point); } } int GetHitTest(CPoint point) { CRect rect; GetWindowRect(rect); int cx = rect.Width() / 3; int cy = rect.Height() / 3; if (point.x < rect.left + cx) { if (point.y < rect.top + cy) { return HTTOPLEFT; } else if (point.y > rect.bottom - cy) { return HTBOTTOMLEFT; } else { return HTLEFT; } } else if (point.x > rect.right - cx) { if (point.y < rect.top + cy) { return HTTOPRIGHT; } else if (point.y > rect.bottom - cy) { return HTBOTTOMRIGHT; } else { return HTRIGHT; } } else { if (point.y < rect.top + cy) { return HTTOP; } else if (point.y > rect.bottom - cy) { return HTBOTTOM; } else { return HTCLIENT; } } } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyWnd, CWnd) ON_WM_NCCALCSIZE() ON_WM_NCPAINT() ON_WM_NCLBUTTONDOWN() ON_WM_NCLBUTTONUP() ON_WM_MOUSEMOVE() END_MESSAGE_MAP() ``` 在这个示例代码中,GetHitTest 函数用于确定鼠标位置相对于窗口的位置,以便按照相应的方法改变窗口大小。这个函数是基于窗口分成 9 个区域的思想,每个区域都对应一个鼠标消息。当鼠标位于边缘时,根据鼠标位置判断应该执行哪个消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值