创建对话框的MFC程序后,如果改变显示器分辨率怎么调后,这个窗口大小也会改变吗?

作为一个mfc的初学者,难免会遇到这样的问题,窗口可以改变大小,而其中的控件大小也随之改变,那怎么样去做呢。
1.对应窗口的属性Maximize Box和Minimize Box设置为true,从而能够使窗口最大化和最小化,Border属性设置为Resizing从而可以改变窗口的大小。
2.在消息有个WM_SIZE,添加函数OnSize,这样可以在函数内调整控件的大小,特别说明很多代码中利用当前控件比值与窗口大小比值再乘上当前窗口大小来改变控件大小,但是由于精度的问题,调整多次就会出问题,那么这里可以利用一个结构体保存每个控件与原窗口的比值。
先创建结构体:
typedef struct Rect
double scale[4];Rect(){
scale[0]=0;
scale[1]=0;
scale[2]=0;
scale[3]=0;}Rect(const Rect& c){
其中Id用来保存控件的Id,但是这里初始化为-2代表着里面没有控件,所以你要注意你的控件中没有宏定义Id为-2的,这里算是一个不完善点。
然后在类的成员变量中添加变量
CRect m_//获取最开始的窗口大小
control m_control[10];//最多10个控件,这里代码可移植性没那么强,但是作者能力比较低,直接用数字代表,也没有用宏定义
然后就可以在OnSize中添加方法了
//控制控件大小,使得随窗口大小变化而变化
void CChangeDBToolDlg::OnSize(UINT nType, int cx, int cy)
{CDialog::OnSize(nType, cx, cy);
//获取控件得到大小以及原大小,方便进行比例调整CWnd *pW
//列出所有控件
hwndChild=::GetWindow(m_hWnd,GW_CHILD);
//判定是否为最小状态,是的话就不进行重绘if(!cx||!cy)
}else{while(hwndChild){
woc=::GetDlgCtrlID(hwndChild);//获得控件的ID
pWnd= GetDlgItem(woc); //获取ID为woc的空间的句柄
//获取当前窗口的大小
pWnd-&GetWindowRect(&rect);
ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
for( i=0;i&10;i++)
if(m_control[i].Id==woc)//如果保存的有该控件与窗口比值,直接乘上当前窗口大小
rect.left = m_control[i].scale[0] *
rect.right = m_control[i].scale[1] *
rect.top = m_control[i].scale[2] *
rect.bottom = m_control[i].scale[3] *
for(i=0;i&10;i++)
if(m_control[i].Id==-2)//没有找到控件的比值,则选择一个没有数据的空间进行保存
m_control[i].Id=
m_control[i].scale[0] = (double)rect.left/m_rect.Width();//注意类型转换,不然保存成long型就直接为0了
m_control[i].scale[1] = (double)rect.right/m_rect.Width();
m_control[i].scale[2] = (double)rect.top/m_rect.Height();
m_control[i].scale[3] = (double)rect.bottom/m_rect.Height();
/////调整控件大小
rect.left = m_control[i].scale[0] *
rect.right = m_control[i].scale[1] *
rect.top = m_control[i].scale[2] *
rect.bottom = m_control[i].scale[3] *
pWnd-&MoveWindow(rect);//设置控件大小
} hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT); }GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小}// TODO: 在此处添加消息处理程序代码
其实网上有很多这种代码,但是很多都没有保存比值,导致多次变化后其位置会改变,但是代码还有不足之处是一些字体控件等不能改变大小,我还在调一些东西,学会了后面发。
MFC 界面部件大小位置自适应 EasySize的使用
[MFC] 控件大小跟随对话框大小比例变化 [大三TJB_708]
VS2013 MFC 对话框控件大小随窗口大小改变而改变
在MFC中怎么样让控件的大小随着主窗体大小改变而改变
MFC 所有控件随窗口大小自适应
MFC控件自适应窗口大小类
没有更多推荐了,改变MFC对话框背景色、控件内的字体颜色和背景色
关于如何改变对话框背景颜色的问题,可能还有很多种不同方法可以实现,笔者在这仅举出四种常见 的方法。其中方法三的编程似乎有点不太规范,方法四则要比方法三正统些,笔者这样的对比举例是为了 拓宽VC编程爱好者特别是初学者的编程思路,读者可以根据实际情况选用其中
C 设置 Dialog, Group Box, Static Text, Check Box, Edit Ctrl(disabled), Combo Box(disabled), Radio Button等背景色
编写WM_CTLCOLOR消息的映射函数OnCtlColor(CDC *pDC, CWnd pWnd, UINT nCtlColor)
加入如下代码:
COLORREF backColor = RGB(216, 231, 252) //office 2003背景色
pDC-&SetBkMode(TRANSPARENT);&&&&&&&&&&&&&&&& //设置控件背景透明
return CreateSolidBrush(backColor);&&&&&&&&&&&& //创建背景刷子
一个基于对话框的MFC AppWizard应用程序中,如何改变对话框的背景颜色呢?对于这个问题,其实可以 由几种不同的方法来实现,具体如下(粗斜体代码为增添的):
---- 方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。
&&---- 其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对话 框设置为蓝色背景和红色文本,步骤如下:
---- ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。
---- ② 在CExampleDlgApp ::InitInstance()中添加如下代码:
&BOOL CExampleDlgApp: : InitInstance ( )
CExampleDlgD
m_pMainWnd = &
&//先于DoModal()调用,将对话框设置为蓝色背景、红色文本
&SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));
&int nResponse = dlg.DoModal();
编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的是:在调用DoModal()之前必须 先调用SetDialogBkColor,且此方法是将改变应用程序中所有的对话框颜色,并不能针对某一个指定的对 话框。
---- 方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准):
void CExampleDlgDlg::OnPaint()
&&& if (IsIconic())
&&&&&&& CR
&&&&&&& CPaintDC dc(this);
&&&&&&& GetClientRect(rect);
&&&&&&& dc.FillSolidRect(rect,RGB(0,255,0)); //设置为绿色背景
&&&&&&& CDialog::OnPaint();
---- 方法三:重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具体 步骤如下(以上例工程为准):
---- ①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量:
class CExampleDlgDlg : public CDialog
protected:
---- ②在OnInitDialog()函数中添加如下代码:
BOOL CExampleDlgDlg::OnInitDialog()
// TODO: Add extra initialization here
m_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一绿色刷子
---- ③利用ClassWizard重载OnCtlColor(&),即WM_CTLCOLOR消息:
HBRUSH CExampleDlgDlg::OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
return m_&& //返加绿色刷子
---- 方法四:还是重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。 具体步骤如下(以上例工程为准):
---- 步骤①、②同上方法三中的步骤①、②。
---- 步骤③利用ClassWizard重载OnCtlColor(&)(即WM_CTLCOLOR消息)时则有些不同:
HBRUSH CExampleDlgDlg::OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
//在这加一条是否为对话框的判断语句
if(nCtlColor ==CTLCOLOR_DLG)
return m_&& //返加绿色刷子
---- 编译并运行即可。
---- 关于如何改变对话框背景颜色的问题,可能还有很多种不同方法可以实现,笔者在这仅举出四种常见 的方法。其中方法三的编程似乎有点不太规范,方法四则要比方法三正统些,笔者这样的对比举例是为了 拓宽VC编程爱好者特别是初学者的编程思路,读者可以根据实际情况选用其中的一种。如果再结合《软件 报》2000年第5期中改变对话框上的控件颜色,相信会使您的MFC应用程序&增色&不少。
另外一种就是用
BOOL CBPCALLView::OnEraseBkgnd(CDC* pDC)
//可以背景图,画刷等
//return CScrollView::OnEraseBkgnd(pDC);
BOOL CHardwaremessage::OnEraseBkgnd(CDC* pDC)
// TODO: 在此添加消息处理程序代码和/或调用默认值
&&& CBrush&&
&&& CRect&&
&&& COLORREF&& rgbBackGnd&& =&& RGB(210,210,210);
&&& GetClientRect(&rect);
&&& brush.CreateSolidBrush(rgbBackGnd);
&&& pDC-& FillRect(rect,&brush);
&&& return&& TRUE;
return CDialog::OnEraseBkgnd(pDC);
MFC改变控件内的字体颜色和背景色
在MFC类库提供了CWnd::OnCtlColor函数,在工作框架的子窗口被重画时将调用该成员函数.因此可以重载WM_CTLCOLOR消息的响应函数.此函数的原型:
&&afx_msg HBRUSH OnCtlColor(CDC *pDC,CWnd *pWnd,UINT nCtlColor);
&&&&&&&&&& 参数nCtlColor用于指定控件的类型,可以是:
&&&&&&&&&& .CTLCOLOR_BTN&&&&&&&&&&&&&&& 按钮控件
&&&&&&&&&& .CTLCOLOR_DLG&&&&&&&&&&&&&&& 对话框
&&&&&&&&&& .CTLCOLOR_EDIT&&&&&&&&&&&&&& 编辑框
&&&&&&&&&& .CTLCOLOR_LISTBOX&&&&&&&&&&& 列表控件
&&&&&&&&&& .CTLCOLOR_MSGBOX&&&&&&&&&&&& 消息控件
&&&&&&&&&& .CTLCOLOR_SCROLLBAR 滚动条控件
&&&&&&&&&& .CTLCOLOR_STATIC&&&&&&&&&&&& 静态控件
[程序实现]
&&&&&&&&&& 假设你已有了名为My的对话框工程.你有了一个STATIC的控件,ID为IDC_STATIC1.
&&HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
&&&&&&&&&& {
&&&&&&&&HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
&&&&&&& // TODO: Change any attributes of the DC here
&&&&&&&&&&&if (nCtlColor==CTLCOLOR_STATIC)
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& pDC-&SetTextColor(RGB(255,0,0));&&//字体颜色
&&&&&&&&&&&&&&&&&&& pDC-&SetBkColor(RGB(0, 0, 255));&&&//字体背景色&&
&&&&&&&&&&&&&&& }
&&&&&&& // TODO: Return a different brush if the default is not desired
&&&&&&&&return
&&&&&&&&&& }
如果要指定某个特定控件可以这样写:ID为IDC_STATIC1
if (pWnd-&GetDlgCtrlID()==IDC_STATIC1)
&&&&&& pDC-&SetTextColor(RGB(255,0,0));&&//设置字体颜色
&&&&&& pDC-&SetBkMode(TRANSPARENT); //设置字体背景为透明
// TODO: Return a different brush if the default is not desired
&&return (HBRUSH)::GetStockObject(BLACK_BRUSH);&&// 设置背景色
BLACK_BRUSH:黑色
WHITE_BRUSH:白色
GRAY_BRUSH:灰色
NULL_BRUSH:透明
HOLLOW_BRUSH :透明
(中天数字)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 []
本文出处:新浪博客 作者:中天数字
------分隔线----------------------------
将本文分享到微信
WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,...
今天在csdn上看到一朋友问如何响应动态添加的控件的事件,搜索...
因为release版本来就少了很多调试信息,更何况一般都是发布出去...
原理是一样的,利用重定义的new和__LINE__,__FILE__这两个宏, 每次...
有没有什么方法可以让程序在崩溃的时候体面的退出呢?答案是...
关于内存泄漏检测,有一个Visual Leak Detector ,按照它的介绍的确很...properties->style 属性页里的border选为resizing.这时当对话框运行时,把鼠标放在边缘上就会出现调节大小的鼠标样式.这时当拉伸对话框时,大小就会变.因为没有写相应的处理函数.若对话框里有控件,控件并不会随对话框大小的改变而做相应的调整.当对话框变为可调时,每当对话框大小改变时,都会触发OnSIze函数,如果没有这个函数,可以通过Winzard添加wm_size事件即可.如果要更改对话框变化时控件的位置,就要在OnSize函数里做相应的处理.可以通过GetClientRect获得当前对话框的客户区大小.最左上方是(0,0)点.如果要更改某个控件的大小,如果控件有相应的Control对象,直接调用Control对象的MoveWindwo函数即可,参数就是你想让控件去的位置.如果没有控件Control对象可以通过GetDlgItem(id),获得控件句柄,然后调用MoveWindow函数.比较麻烦的是计算相应的位置.有时后对话框上有自己定义的一些从CWnd派生来的对象,这时首先要写这个对象的OnSize函数.当调用这个对象MoveWindow方法就会触发定义好的OnSize函数.举一个CPopertySheet的例子几个对象 CPropertySheet m_ CLogPropertyPage m_LogS  //System L  CLogPropertyPage m_LogClientO // Log about ClientO  CLogPropertyPage m_LogClientT //Log about ClientT CLogPropertyPage m_LogT//Lm_sheet.AddPage(&m_LogSystem); m_sheet.AddPage(&m_LogTimer); m_sheet.AddPage(&m_LogClientOne); m_sheet.AddPage(&m_LogClientTwo);  m_sheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT); RECT this->GetWindowRect(&rect); int width =rect.right-rect. int height = rect.bottom - rect. m_sheet.MoveWindow(0,125,width,height);OnSize函数里m_sheet.MoveWindow( margin,ctrlheight+margin*2,  rt.Width()-margin*2,   rt.Height()-ctrlheight-margin*2  );   CTabCtrl*   ptab   =m_sheet.GetTabControl();      ptab->MoveWindow( 0,0, rt.Width()-margin*2, rt.Height()-ctrlheight-margin*2);         第二句话就会调用m_LogSystem的OnSize函数.
[转]&[转]&
喜欢该文的人也喜欢MFC对话框如何同时修改多个控件的位置_百度知道
MFC对话框如何同时修改多个控件的位置
如图1,我现在这个程序是在19寸的台式机大屏幕上做的,对话框中各控件的位置都正好,但是当运行在14寸的笔记本屏幕上时,会变成图2中的情况。我想将对话框中所有控件的横向位置都按照...
如图1,我现在这个程序是在19寸的台式机大屏幕上做的,对话框中各控件的位置都正好,但是当运行在14寸的笔记本屏幕上时,会变成图2中的情况。我想将对话框中所有控件的横向位置都按照图1所示的相对位置排放,即使是在不同的分辨率下,请问如何能最简单的修改它们的位置?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:1713
获赞数:1499
是要你窗体上整个内容居中吗?
对,让所有控件整体上是居中的
有个简单的方法, 在窗体上加一个group box控件, 把它当成一个容器,再在group box中画你的控件并置父. 在WM_SIZE消息中让group box居中即可, GetDlgItem(IDC_GROUP)-&CenterWindow();
好,麻烦问下如何将group box置父啊
比如group box容器中有个button1按钮,GetDleItem(IDC_BUTTON1)-&SetParent(GetDlgItem(IDC_GROUP));
用group box并设为父窗口了,居中group
box后里边的控件都没了是什么原因
跪求程序看看
全局变量 bool flag=在OnInitDialog()中:flag = GetDlgItem(IDC_BUTTON1)-&SetParent(GetDlgItem(IDC_GP)); GetDlgItem(IDC_EDIT1)-&SetParent(GetDlgItem(IDC_GP)); GetDlgItem(IDC_EDIT2)-&SetParent(GetDlgItem(IDC_GP)); GetDlgItem(IDC_EDIT3)-&SetParent(GetDlgItem(IDC_GP)); GetDlgItem(IDC_LIST1)-&SetParent(GetDlgItem(IDC_GP));GetDlgItem(IDC_GP)-&CenterWindow();主窗体增加WM_SIZE消息处理在OnSize(。。。)中if (flag) {
GetDlgItem(IDC_GP)-&CenterWindow(); }
采纳数:1480
获赞数:1201
1.根据计算来重新定位所有的控件,这样比较麻烦,2.建议使用一个子对话框来放所有控件,然后根据屏幕分辨率来调整子对话框在主对话框上的位置即可,
本回答被网友采纳
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 对话框分辨率低 的文章

 

随机推荐