// 通过这个方式,在mainframe 去掉menubar,注册类,去掉背景画刷,避免重复刷新,
//
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
cs.hMenu=NULL;
// TODO: 在此处通过修改
// CREATESTRUCT cs 来修改窗口类或样式
// cs.style = WS_OVERLAPPED|WS_SYSMENU|WS_MINIMIZEBOX;
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
//cs.lpszClass = AfxRegisterWndClass(0,0,::CreateSolidBrush(RGB(0,0,0)));
cs.lpszClass = AfxRegisterWndClass(0,0,0);//把背景画刷设置成空,这样缩放窗口的时候,就没有闪烁了
return TRUE;
}
去掉窗口的其他的属性,只是设置成一个白板没有边框的窗口
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
DWORD dwStyle = GetWindowLong(GetSafeHwnd(),GWL_STYLE);
dwStyle &= ~(WS_CAPTION);
dwStyle=WS_VISIBLE;
//dwStyle &= ~(WS_BORDER);
SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle);
在OnNcCalcSize 中圈定非客户区的范围,lpncsp->rgrc[0] 设置客户区的范围
void CMainFrame::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
// 通过增加客户区的大小,调整非客户区的大小
lpncsp->rgrc[0].left+=13;
lpncsp->rgrc[0].top+=13;
lpncsp->rgrc[0].right-=13;
lpncsp->rgrc[0].bottom-=13;
CFrameWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
}
绘制非客户区的边框, cwindowdc 可以绘制客户区和非客户区,
GetWindowRect(rectWindow); 获取窗口相对整个屏幕的rect
ScreenToClient(rectWindow); 转化后,rectwindow 相对客客户区的位置,这个时候 rectwindow.left ==- border.width ,rectwindow.top=-border.height
rectClient.OffsetRect(-rectWindow.left, -rectWindow.top); // rectClient 获取的是以客户区(0,0) 为起点的宽和高的区域,现在调成window 区域的左上角(0,0)为坐标的位置。
dc.ExcludeClipRect(rectClient);// 排除这个区域,免得刷新。
rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top);// 调整成 window 窗口区域的坐标系的位置
void CMainFrame::OnNcPaint()
{
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CFrameWnd::OnNcPaint()
CWindowDC dc(this);
CRect rectClient;
GetClientRect(rectClient);
CRect rectWindow;
GetWindowRect(rectWindow);
ScreenToClient(rectWindow);
rectClient.OffsetRect(-rectWindow.left, -rectWindow.top);
dc.ExcludeClipRect(rectClient);
// 绘制非用户区的边界
rectWindow.OffsetRect(-rectWindow.left, -rectWindow.top);
// DrawBorders(&dc, rectWindow);
CBrush b(RGB(230,29,0));
dc.FillRect(&rectWindow,&b);
}