MFC 自画界面的总结

 

// 通过这个方式,在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);
  

}

 

 

 

MFC自定义界面HUI,高效简单,含详细注释和示例。 HUI包括基本控件、按钮、标签、编辑框、表格、悬停提示等,可组合出更多功能。资源占用少,效率高,能在低端机上运行,流畅不闪烁,完全满足工控等各种专业软件实现个性化要求。 本资源是“http://download.youkuaiyun.com/detail/hhhh63/6961889”的正式发布版。包括3个项目,Hui、HuiDemo1和HuiDemo2。 一、Hui项目 本项目是DLL项目,包括完整的界面库,使用双缓存,局部重画等技术,性能优异。为保证在不同的MFC版本中使用,本次上传提供了这部分的源码,一般不要对其改动。 二、HuiDemo1 简单的应用示例,包括窗口分割,控制面板和主显示区等,展示控件各方向停靠、自动充满、全屏切换、记忆窗口位置和大小、选项设置和保存注册表等功能,用户可直接以此为基础开发新项目。如需扩展其它功能,可从HuiDemo2查找复制相应代码。 三、HuiDemo2 除HuiDemo1的所有功能外,还包括界面库的全部功能和其它实用扩展功能,左中右三栏式分布,左右固定宽度,中间栏大小可变。 1、左边是属性栏,固定宽度,上边是时钟,下边是鼠标信息,当鼠标移到中间的图像区时显示鼠标位置和图像值。 2、中间是图像区,演示如何动态生存索引图像,从下向上移动,自适应大小,长宽比不变,点右边的调色板按钮改变颜色,点保存按钮把当前图像保存到桌面。 3、右边上边是控制栏,在中间的图像区中画各种几何图形,并计算几何图形包围的图像数据的最大值,最小值和平均值。 4、右边下边是表格演示,显示Windows文件夹下的文件列表,自动充满窗口区,随窗口大小改变显示项数,保证界面美观,最下面是搜索和定位功能。 四、运行环境,VC2010或更高版本。 欢迎大家下载并提意见,本资源版权归作者所有,分享供大家研究学心,不得用于商业用途,如有特殊要求请与本人联系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值