《VC中自动改变控件位置和大小的对话框类》使用方法.docx
《《VC中自动改变控件位置和大小的对话框类》使用方法.docx》由会员分享,可在线阅读,更多相关《《VC中自动改变控件位置和大小的对话框类》使用方法.docx(10页珍藏版)》请在冰豆网上搜索。
《VC中自动改变控件位置和大小的对话框类》使用方法
《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
/////////////////////////////////////////////////////////////////////////////////////
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
//////////////////////////////////////////////////////////////////////
#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;
}