mfc可变窗口大小 仅供个人使用.docx
- 文档编号:8475078
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:17
- 大小:51.73KB
mfc可变窗口大小 仅供个人使用.docx
《mfc可变窗口大小 仅供个人使用.docx》由会员分享,可在线阅读,更多相关《mfc可变窗口大小 仅供个人使用.docx(17页珍藏版)》请在冰豆网上搜索。
mfc可变窗口大小仅供个人使用
在网上有《VC中自动改变控件位置和大小的对话框类》的文章
开始不知道如何使用
我在生成的非模态对话框里研究了一天
已经搞定了
步骤:
1,在非模态对话框类的头文件(.h)顶部加上#include"lxDialog.h",然后把非模态对话框类的基类改成ClxDialog,也就是在头文件里classC******:
publicCDialog改成:
classC******:
publicClxDialog
在非模态对话框类的.cpp函数里,把构造函数
C*****:
:
C*****(CWnd*pParent):
CDialog(C*****:
:
IDD,pParent)
改成:
C*****:
:
C*****(CWnd*pParent):
ClxDialog(C*****:
:
IDD,pParent)
2,用类向导给非模态对话框添加一个OnInitDialog()函数;也就是在双击类向导->MessageMaps->选非模态对话框类;Messages选WM_INITDIALOG双击它,这样在你的非模态对话框的cpp文件里就生成了ON_WM_INITDIALOG和OnInitDialog()函数;
3,在这个OnInitDialog函数里添加代码:
ClxDialog:
:
OnInitDialog();
ClxDialog:
:
ShowSizeIcon(TRUE);//显示可以调整大小的图标
staticDLGCTLINFOdcMenuGroup[]=
{
{IDCANCEL,MOVEX,100},
{IDCANCEL,MOVEY,100},
{IDC_EDIT_RECDSPDLG,ELASTICX,100},
{IDC_EDIT_RECDSPDLG,ELASTICY,100},
};
SetControlProperty(dcMenuGroup,sizeof(dcMenuGroup)/sizeof(DLGCTLINFO));
returnTRUE;
//IDCANCEL是关闭按钮的ID,IDOK按钮我去掉了所以没加,IDC_EDIT_RECDSPDLG是一个EDIT控件
//想让哪个控件调整,就照葫芦画瓢在组里加上
4,再用类向导添加OnSize()函数,也就是双击ON_WM_SIZE,这样就增加了
voidC******:
:
OnSize(UINTnType,intcx,intcy)这个函数,然后在这个函数里添加代码:
ClxDialog:
:
OnSize(nType,cx,cy);
5,别忘了在资源里右键你的非模态对话框,把属性栏Styles里Border选成Resizing。
这样就搞定了
附上网上找的那个类:
《VC中自动改变控件位置和大小的对话框类》
lxDialog.h文件:
/////////////////////////////////////////////////////////////////////////////////////
//自动改变控件位置和大小的对话框类
//文件名:
lxDialog.h
//作者:
StarLee(coolstarlee@)
/////////////////////////////////////////////////////////////////////////////////////
classClxDialog:
publicCDialog
{
public:
ClxDialog(UINTnID,CWnd*pParent=NULL);
typedefstruct_dlgControlTag
{
intiId;
intiFlag;
intiPercent;
}DLGCTLINFO,*PDLGCTLINFO;
enum
{
MOVEX=0,
MOVEY,
MOVEXY,
ELASTICX,
ELASTICY,
ELASTICXY
};
//设置控件信息
BOOLSetControlProperty(PDLGCTLINFOlp,intnElements);
//是否在对话框右下角显示表示可改变大小的图标
voidShowSizeIcon(BOOLbShow=TRUE);
protected:
virtualBOOLOnInitDialog();
afx_msgvoidOnSize(UINTnType,intcx,intcy);
afx_msgvoidOnSizing(UINTnSide,LPRECTlpRect);
DECLARE_MESSAGE_MAP()
private:
intm_iClientWidth;//对话框client区域的宽度
intm_iClientHeight;//对话框client区域的高度
intm_iMinWidth;//对话框的最小宽度
intm_iMinHeight;//对话框的最小高度
PDLGCTLINFOm_pControlArray;//控件信息数组指针
intm_iControlNumber;//设置控件信息的控件个数
BOOLm_bShowSizeIcon;//是否显示表示可改变大小的图标
CStaticm_wndSizeIcon;//放图标的静态控件
//保存图标的bitmap
CBitmapm_bmpSizeIcon;
BITMAPm_bitmap;
};
lxDialog.cpp文件:
//////////////////////////////////////////////////////////////////////
//自动改变控件位置和大小的对话框类
//文件名:
lxDialog.cpp
//作者:
StarLee(coolstarlee@)
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"lxDialog.h"
//表示可改变大小的图标ID
#ifndefOBM_SIZE
#defineOBM_SIZE32766
#endif
ClxDialog:
:
ClxDialog(UINTnID,CWnd*pParent)
:
CDialog(nID,pParent)
m_iClientWidth(0)
m_iClientHeight(0)
m_iMinWidth(0)
m_iMinHeight(0)
m_pControlArray(NULL)
m_iControlNumber(0)
m_bShowSizeIcon(TRUE)
{}
BEGIN_MESSAGE_MAP(ClxDialog,CDialog)
ON_WM_SIZE()
ON_WM_SIZING()
END_MESSAGE_MAP()
BOOLClxDialog:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//设置对话框为可变大小的
ModifyStyle(0,WS_SIZEBOX);
//以对话框的初始大小作为对话框的宽度和高度的最小值
CRectrectDlg;
GetWindowRect(rectDlg);
m_iMinWidth=rectDlg.Width();
m_iMinHeight=rectDlg.Height();
//得到对话框client区域的大小
CRectrectClient;
GetClientRect(rectClient);
m_iClientWidth=rectClient.Width();
m_iClientHeight=rectClient.Height();
//Load图标
m_bmpSizeIcon.LoadOEMBitmap(OBM_SIZE);
m_bmpSizeIcon.GetBitmap(&m_bitmap);
//创建显示图标的静态控件并放在对话框右下角
m_wndSizeIcon.Create(NULL,WS_CHILD|WS_VISIBLE|SS_BITMAP,CRect(0,0,m_bitmap.bmWidth,m_bitmap.bmHeight),this,0);
m_wndSizeIcon.SetBitmap(m_bmpSizeIcon);
m_wndSizeIcon.MoveWindow(m_iClientWidth-m_bitmap.bmWidth,m_iClientHeight-m_bitmap.bmHeight,m_bitmap.bmWidth,m_bitmap.bmHeight);
//显示图标
m_wndSizeIcon.ShowWindow(m_bShowSizeIcon);
returnTRUE;
}
voidClxDialog:
:
OnSize(UINTnType,intcx,intcy)
{
CDialog:
:
OnSize(nType,cx,cy);
//对话框宽度和高度的增量
intiIncrementX=cx-m_iClientWidth;
intiIncrementY=cy-m_iClientHeight;
//最小化时增量为0
if(nType==SIZE_MINIMIZED)
{
iIncrementX=iIncrementY=0;
}
for(inti=0;i { CWnd*pWndCtrl=NULL; intiId=m_pControlArray[i].iId; intiFlag=m_pControlArray[i].iFlag; intiPercent=m_pControlArray[i].iPercent; //无效值 if((iPercent<0)||(iPercent>100)) continue; //得到控件指针 pWndCtrl=GetDlgItem(iId); if((NULL! =pWndCtrl)&&IsWindow(pWndCtrl->GetSafeHwnd())) { CRectrectCtrl; pWndCtrl->GetWindowRect(rectCtrl); ScreenToClient(rectCtrl); intiLeft=rectCtrl.left; intiTop=rectCtrl.top; intiWidth=rectCtrl.Width(); intiHeight=rectCtrl.Height(); switch(iFlag) { caseMOVEX: //X方向移动 iLeft+=(iIncrementX*iPercent/100); break; caseMOVEY: //Y方向移动 iTop+=(iIncrementY*iPercent/100); break; caseMOVEXY: //X方向和Y方向同时移动 iLeft+=(iIncrementX*iPercent/100); iTop+=(iIncrementY*iPercent/100); break; caseELASTICX: //X方向改变大小 iWidth+=(iIncrementX*iPercent/100); break; caseELASTICY: //Y方向改变大小 iHeight+=(iIncrementY*iPercent/100); break; caseELASTICXY: //X方向和Y方向同时改变大小 iWidth+=(iIncrementX*iPercent/100); iHeight+=(iIncrementY*iPercent/100); break; default: ; } //把控件移动到新位置 pWndCtrl->MoveWindow(iLeft,iTop,iWidth,iHeight); } } //把图标移动到对话框右下角 if(IsWindow(m_wndSizeIcon.GetSafeHwnd())) m_wndSizeIcon.MoveWindow(cx-m_bitmap.bmWidth,cy-m_bitmap.bmHeight,m_bitmap.bmWidth,m_bitmap.bmHeight); //记录对话框client区域的大小 if(nType! =SIZE_MINIMIZED) { m_iClientWidth=cx; m_iClientHeight=cy; } } voidClxDialog: : OnSizing(UINTnSide,LPRECTlpRect) { CDialog: : OnSizing(nSide,lpRect); //对话框不能小于初始大小 intiWidth=lpRect->right-lpRect->left; intiHeight=lpRect->bottom-lpRect->top; if(iWidth<=m_iMinWidth) lpRect->right=lpRect->left+m_iMinWidth; if(iHeight<=m_iMinHeight) lpRect->bottom=lpRect->top+m_iMinHeight; } BOOLClxDialog: : SetControlProperty(PDLGCTLINFOlp,intnElements) { //设置控件数组信息 if(NULL==lp) returnFALSE; if(nElements<=0) returnFALSE; m_pControlArray=lp; m_iControlNumber=nElements; returnTRUE; } voidClxDialog: : ShowSizeIcon(BOOLbShow) { m_bShowSizeIcon=bShow; } 主题: softwareFw: 对话框大小相关_在窗口属性中的border在选sizing就可以用手变化窗口了 主题: 对话框大小相关_在窗口属性中的border在选sizing就可以用手变化窗口了 VC++之根据对话框大小调整控件大小 悬赏分: 0-提问时间: 2010年01月19日07时27分 VC++之根据对话框大小调整控件大小 1、在对话框类中加入成员变量CRectm_rect;用于保存对话框大小变化前的大小; 2、在对话框的OnInitDialog()函数中获取对话框创建时的大小: GetClientRect(&m_rect); 3、在WM_SIZE的响应函数OnSize()中加入以下代码: CWnd*pWnd; pWnd=GetDlgItem(IDC_LIST);//获取控件句柄 if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建 { CRectrect;//获取控件变化前大小 pWnd->GetWindowRect(&rect); ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标 //cx/m_rect.Width()为对话框在横向的变化比例 rect.left=rect.left*cx/m_rect.Width();/////调整控件大小 rect.right=rect.right*cx/m_rect.Width(); rect.top=rect.top*cy/m_rect.Height(); rect.bottom=rect.bottom*cy/m_rect.Height(); pWnd->MoveWindow(rect);//设置控件大小 } GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小 以上是我在网上找的,试过,能得到想要的效果! 调试过程中,遇到点问题,还望高手指点! 在对话框属性里,设置最大化,最小化框,运行时,能最大化,最大化后也可以还原;也能最小化,问题就出来了,最小化后,只能右键关闭,不能还原,点它,弹出错误代码,需要调试! 请问是怎么回事? 如何消除! 谢谢了啊! 最小化的时候m_rect的各个量是“0”,所以在管口还原的时候就出现了除0的异常。 如下: rect.left=rect.left*cx/m_rect.Width();/////调整控件大小 怎样在在子对话框中获得父对话框的大小,并设置子对话框的大小,使其正好覆盖父对话框 请问: 怎样在在子对话框中获得父对话框的大小,并设置子对话框的大小,使其正好覆盖父对话框 getparent()或findwindow()得到父窗口, getwindowrect()得到父窗口的位置,大小。 movewindow()或setwindowpos()将子窗口移动到父窗口的位置,并改变大小。 ∙网友: papaya_stone getparent()或findwindow()得到父窗口句柄, getwindowrect()得到父窗口的位置,大小。 movewindow()或setwindowpos()将子窗口移动到父窗口的位置,并改变大小。 MFC对话框大小如何调节? [互联网电脑软件电脑硬件] 悬赏点数101个回答685次浏览 0 LeeTeuk 2008-10-2814: 39: 53172.30.211.*举报 MFC对话框大小如何调节? 回答 窗体顶端 窗体底端 引用: 添加引用: 登录并发表回答 取消 在谷歌搜索MFC对话框大小如何调节? 正在发表回答,请稍候…… 您输入的内容将会在您成功登录之后自动发表。 回答 按时间排序按投票数排序 0 liuyangbmw 2008-10-2815: 27: 11121.29.129.*举报 简单的说可以在OnInitDialog()函数里加上一句: RECTrect; GetClientRect(&rect); MoveWindow(1024-rect.right,0,rect.right,rect.bottom); 以上MoveWindow中的前两个参数就是窗体显示时的左上角坐标, 我假设你的屏幕分辨率为1024*768,所以其横坐标为1024-rect.right; 获得对话框准确像素 悬赏分: 0-解决时间: 2008-11-1711: 02 想在对话框添加背景图片,但不知道如何获得对话框的像素,无法准确设置图片的大小。 请问如何在VC6.0或2005中使图片与对话框配置适当的大小? 提问者: jimoffice-五级 最佳答案 获得WindowRect和ClientRect然后做一些计算//API的实现RECTrw,rc;GetWindowRect(hwnd,&rw);GetClientRect(hwnd,&rc);OffsetRect(&rw,-rw.left,-rw.top);intw=图片宽+rw.right-rc.right;inth=图片高+rw.bottom-rc.bottom;SetWindowPos(hwnd,HWND_TOP,0,0,w,h,SWP_NOMOVE|SWP_NOZORDER); 用GetClientRect(&rect)、GetWindowRect(&rect)、rect.wigth()、rect.height()都能够准确获取窗口大小等 vc中更改对话框大小收藏 vc编程接触很久,但更改对话框大小最近才有点眉目.以前编的MFC程序,窗口大小都是固定的,很死板.前段时间编一个模拟定时器,尝试了更改对话框大小,也不是很难.只要掌握了窍门,对话框大小随你改变. 最近又因为项目的问题,要改变对话框大小.遇到了一个问题就是一个属性框CPropertySheet,里面又有自己从CPropertyPage派生的类.类里又调用了别人写的基于对话框的对象.所以就出现了嵌套改变对话框的问题.还好通过网上找资料,已经解决. 首先要使对话框可以更改大小,要改对话框的属性.在对话框资源上右键-->properties->style 属性页里的border选为resizing.这时当对话框运行时,把鼠标放在边缘上就会出现调节大小的鼠标样式.这时当拉伸对话框时,大小就会变.因为没有写相应的处理函数.若对话框里有控件,控件并不会随对话框大小的改变而做相应的调整. 当对话框变为可调时,每当对话框大小改变时,都会触发OnSIze函数,如果没有这个函数,可以通过Winzard添加wm_size事件即可.如果要更改对话框变化时控件的位置,就要在OnSize函数里做相应的处理.可以通过GetClientRect获得当前对话框的客户区大小.最左上方是(0,0)点.如果要更改某个控件的大小,如果控件有相应的Control对象,直接调用Control对象的MoveWindwo函数即可,参数就是你想让控件去的位置.如果没有控件Control对象可以通过GetDlgItem(id),获得控件句柄,然后调用MoveWindow函数.比较麻烦的是计算相应的位置. 有时后对话框上有自己定义的一些从CWnd派生来的对象,这时首先要写这个对象的OnSize函数.当调用这个对象MoveWindow方法就会触发定义好的OnSize函数. 举一个CPo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mfc可变窗口大小 仅供个人使用 mfc 可变 窗口 大小 个人 使用