MFC—界面设计(控件自适应,添加背景图,Static背景颜色设置)
1、控件随着窗口自适应
首先在类视图里面添加OnSize()函数,然后添加一个ChangeSize()函数,头文件中添加如下
//控件自适应变量POINT old;CRect m_rect;void ChangeSize(UINT nID, int x, int y);afx_msg void OnSize(UINT nType, int cx, int cy);
在OnInitDialog中
//控件自适应GetClientRect(&m_rect);old.x = m_rect.right - m_rect.left;old.y = m_rect.bottom - m_rect.top;
//窗口自适应
void CTestDlg::ChangeSize(UINT nID, int x, int y)
{CWnd *pWnd;pWnd = GetDlgItem(nID);if (pWnd != NULL){CRect rect;pWnd->GetWindowRect(&rec);ScreenToClient(&rec);rect.left = rect.left*x / m_rect.Width();rect.top = rect.top*y / m_rect.Height();rect.bottom = rect.bottom*y / m_rect.Height();rect.right = rect.right*x / m_rect.Width();pWnd->MoveWindow(rec); //伸缩控件}
}//窗口自适应
int count = 0;
void CTestDlg::OnSize(UINT nType, int cx, int cy)
{CDialog::OnSize(nType, cx, cy);// TODO: 在此处添加消息处理程序代码if (nType != SIZE_MINIMIZED){float fsp[2];POINT Newp; //获取现在对话框的大小 CRect recta;GetClientRect(&recta); //取客户区大小 Newp.x = recta.right - recta.left;Newp.y = recta.bottom - recta.top;fsp[0] = (float)Newp.x / old.x;fsp[1] = (float)Newp.y / old.y;CRect Rect;int woc;CPoint OldTLPoint, TLPoint; //左上角 CPoint OldBRPoint, BRPoint; //右下角 HWND hwndChild = ::GetWindow(m_hWnd, GW_CHILD); //列出所有控件 while (hwndChild){woc = ::GetDlgCtrlID(hwndChild);//取得ID GetDlgItem(woc)->GetWindowRect(Rect);ScreenToClient(Rect);OldTLPoint = Rect.TopLeft();TLPoint.x = long(OldTLPoint.x*fsp[0]);TLPoint.y = long(OldTLPoint.y*fsp[1]);OldBRPoint = Rect.BottomRight();BRPoint.x = long(OldBRPoint.x *fsp[0]);BRPoint.y = long(OldBRPoint.y *fsp[1]);Rect.SetRect(TLPoint, BRPoint);GetDlgItem(woc)->MoveWindow(Rect, TRUE);hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);}old = Newp;}//主对话框需要,子对话框不需要if (count!= 0) //用于计数,因为第一次运行的时候,不应该执行以下程序,否则会报错{CRect rectTab;m_tab.GetClientRect(&rectTab); //m_tab是tab控件的变量rectTab.top += 20;rectTab.bottom += 4;rectTab.left += 4;rectTab.right -= 4;a.MoveWindow(&rectTab, TRUE);//tab子界面ab.MoveWindow(&rectTab, TRUE);//tab子界面b}count++;
}
想要使tab控件里面的子对话框跟随对话框自适应,主对话框(即有tab控件的对话框)中的程序是以上程序,而子对话框内的程序只需要去除以上tab那一段程序即可
注意:需要修改对话框中所有Static的ID,修改成不一样的ID即可。
2、给对话框添加背景图片
(1)资源视图右键->添加->资源->Bitmap->导入,将bmp图片放置在工程文件的Res文件夹中,将其导入Bitmap,然后修改其ID为IDB_BITMAP_BACKGROUND
(2)在类视图中添加OnPaint()函数
//添加背景颜色
void CTestDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CRect rect;CPaintDC dc(this);GetClientRect(&rect);dc.FillSolidRect(rect, RGB(141, 182, 205));dc.FillPath();//背景图片 能够自适应窗口GetClientRect(&rect);CDC dcMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAP_BACKGROUND); //IDB_BITMAP_BACKGROUND是你自己的图对应的ID BITMAP bitmap;bmpBackground.GetBitmap(&bitmap);CBitmap *pbmpOld = dcMem.SelectObject(&bmpBackground);dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);//CDialog::OnPaint();}
}
我的背景图片已经包括了那个蓝框框
如果想要自己画蓝色框框,只需要在OnPaint()函数中添加以下程序即可
ScreenToClient(&rect);//转换为对话框上的客户坐标CBrush brush(RGB(161, 224, 247));//中间的蓝色框CRect rect(200, 200, 600, 380); //指定区域大小dc.FillRect(&rect, &brush);
3、使Static背景变化
由于为了自适应改变了Static的ID,所以这里需要对不同的Static进行设置
//设置控件颜色
HBRUSH UserInfoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: 在此更改 DC 的任何特性if ((pWnd->GetDlgCtrlID() == IDC_IDTYPE_STATIC) || (pWnd->GetDlgCtrlID() == IDC_NAME_STATIC)|| (pWnd->GetDlgCtrlID() == IDC_SEX_STATIC) || (pWnd->GetDlgCtrlID() == IDC_BIRTH_STATIC)|| (pWnd->GetDlgCtrlID() == IDC_NATION_STATIC) || (pWnd->GetDlgCtrlID() == IDC_ADDRESS_STATIC)|| (pWnd->GetDlgCtrlID() == IDC_AGENCY_STATIC) || (pWnd->GetDlgCtrlID() == IDC_STARTDATE_STATIC)|| (pWnd->GetDlgCtrlID() == IDC_ENDDATE_STATIC) || (pWnd->GetDlgCtrlID() == IDC_IDNUM_STATIC))//{pDC->SetTextColor(RGB(0, 0, 0));//设置文本色 pDC->SetBkColor(RGB(141, 182, 205));//设置背景色 pDC->SetBkMode(TRANSPARENT);//透明return (HBRUSH)::GetStockObject(NULL_BRUSH);}// TODO: 如果默认的不是所需画笔,则返回另一个画笔return hbr;
}
添加背景和使静态框也变成背景色后的界面
MFC—界面设计(控件自适应,添加背景图,Static背景颜色设置)相关推荐
- 探究MFC之Dialog窗口最大化时控件自适应
探究MFC之Dialog窗口最大化时控件自适应 MFC的Dialog程序,在窗口最大化时,如何所有让子窗口(控件)按比例放大? 启动VisualC++6.0,New->MFC AppWizard ...
- Visual Studio开发MFC项目OCX控件添加使用控件方法
1.在Windows系统中注册OCX控件 在OCX控件目录,右键新建一个文本文档,将文件名和扩展名改为"双击注册.bat",添加如下注册脚本: cd /d %~dp0 RegSvr ...
- 基于PyQt5实现界面控件自适应大小
基于PyQt5实现界面控件自适应大小 界面控件自适应大小,点击窗口放大后,界面控件大小随之发生变化. 实现效果 实例1 点击窗口放大后: 实例2
- 使用MFC开发ActiveX控件
摘要: 本文对COM组件中的ActiveX控件的MFC开发方法进行了介绍,讲述了用户自定义和库存属性.方法以及事件的添加方法和属性页的制作过程.使读者能够掌握基本的MFC ActiveX开发方法. 前 ...
- KFC宅急送点餐系统开发 MFC动态树形控件使用
本文写于该系统开发完成后的第二年,那时候博主大2,有一门名为<程序设计方法学>的课程,老师上课很幽默风趣,也经常给我们带来一些时事新闻.当然,课余也会给我们布置一些作业.其中"K ...
- MFC ActiveX (ocx)控件的开发
前言 ActiveX是Microsoft对于一系列策略性面向对象程序技术和工具的称呼,其中主要的技术是组件对象模型(COM). ActiveX控件是一种实现了一系列特定接口而使其在使用和外观上更象一个 ...
- MFC自绘控件学习总结
前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或 ...
- MFC自绘控件学习总结(1)
前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或 ...
- MFC基础,MFC自绘控件学习总结.---转
前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或 ...
最新文章
- 区块链之智能合约详解
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛 题解(除了C、G之后补)
- mysql的in查询参数限制,多少数据量会造成性能下降?什么时候创建临时表合适?
- 从容稳进,高通正扎实推进5G
- c++运行不出结果_fastjson 不出网利用总结
- 操作系统之进程管理:4、线程与多线程
- 关于在阅读nnUNet代码中的一些小细节的记录(三)
- Android 如何在Eclipse中查看Android API源码 及 support包源码
- QGroundControl源码编译安装
- C++#ifndef/#define/#endif的用法
- 软件项目管理和实施方案
- 绘图杂记【1】Python、R等绘图
- 如何设置Mosek的最大迭代次数?
- 系统讲解一下整站SEO优化都涉及到哪些工作?
- 个人所得税java程序怎么编写_个人所得税Java实现代码
- 剑指 Offer II 009. 乘积小于 K 的子数组
- httpc服务器错误类型大全
- jQuery动画基础讲解(教你玩转jQuery动画)
- BZOJ4735 你的生命已如风中残烛(组合数学)
- 非磺化花菁和磺化花菁有机染料Cyanine dyes的说明应用