VC中自动改变控件位置和大小的对话框类Word文件下载.docx
《VC中自动改变控件位置和大小的对话框类Word文件下载.docx》由会员分享,可在线阅读,更多相关《VC中自动改变控件位置和大小的对话框类Word文件下载.docx(10页珍藏版)》请在冰点文库上搜索。
控件在X方向和Y方向同时移动
ELASTICX,
控件在X方向(宽度)改变大小
ELASTICY,
控件在Y方向改(高度)改变大小
ELASTICXY
控件在X方向和Y方向同时改变大小
};
iPercent表示改变值占对话框改变值的百分比。
例如,一个控件的iPercent值为100,iFlag值为MOVEX,那么当对话框的宽度改变100个单位的时候,这个控件就在X方向移动100个单位;
又如,一个控件的iPercent值为100,iFlag值为ELASTICXY,那么当对话框的宽度和高度分别改变100个单位的时候,控件的高度和宽度也相应的改变100个单位。
下面是设置控件信息的函数:
BOOL
SetControlProperty(PDLGCTLINFO
lp,
nElements);
使用起来非常简单,在对话框的OnInitDialog()函数里面添加类似下面的代码就行了:
控件信息数组
static
DLGCTLINFO
dcMenuGroup[]
{IDOK,
MOVEX,
100},
{IDCANCEL,
{IDC_BUTTON1,
50},
{IDC_EDIT1,
{IDC_EDIT2,
{IDC_EDIT3,
{IDC_EDIT4,
{IDC_EDIT5,
{IDC_EDIT6,
设置控件信息
SetControlProperty(dcMenuGroup,
sizeof(dcMenuGroup)/sizeof(DLGCTLINFO));
下面就是使用上面这段代码的对话框改变大小前后的效果图:
对两张截图的比较我们可以很容易的理解上面那段代码。
我还提供了一个函数:
void
ShowSizeIcon(BOOL
bShow
TRUE);
来设置是否显示对话框右下角表示可以改变大小的图标。
这个图标是从系统中读取的,我上面的截图是Windows2000下的,在WindowsXP中就会自动变成XP风格的。
好了,闲话不多说了,下面贴出该对话框类ClxDialog的源代码,里面有详细的注释:
lxDialog.h文件:
//
自动改变控件位置和大小的对话框类
文件名:
lxDialog.h
作者:
StarLee(coolstarlee@)
class
ClxDialog
:
public
CDialog
public:
ClxDialog(UINT
nID,
CWnd*
pParent
NULL);
0,
MOVEY,
MOVEXY,
ELASTICX,
ELASTICY,
ELASTICXY
是否在对话框右下角显示表示可改变大小的图标
protected:
virtual
OnInitDialog();
afx_msg
OnSize(UINT
nType,
cx,
cy);
OnSizing(UINT
nSide,
LPRECT
lpRect);
DECLARE_MESSAGE_MAP()
private:
m_iClientWidth;
对话框client区域的宽度
m_iClientHeight;
对话框client区域的高度
m_iMinWidth;
对话框的最小宽度
m_iMinHeight;
对话框的最小高度
PDLGCTLINFO
m_pControlArray;
控件信息数组指针
m_iControlNumber;
设置控件信息的控件个数
m_bShowSizeIcon;
是否显示表示可改变大小的图标
CStatic
m_wndSizeIcon;
放图标的静态控件
保存图标的bitmap
CBitmap
m_bmpSizeIcon;
BITMAP
m_bitmap;
lxDialog.cpp文件:
lxDialog.cpp
#include
"
stdafx.h"
lxDialog.h"
表示可改变大小的图标ID
#ifndef
OBM_SIZE
#define
OBM_SIZE
32766
#endif
ClxDialog:
/*=NULL*/)
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()
OnInitDialog()
CDialog:
设置对话框为可变大小的
ModifyStyle(0,
WS_SIZEBOX);
以对话框的初始大小作为对话框的宽度和高度的最小值
CRect
rectDlg;
GetWindowRect(rectDlg);
m_iMinWidth
rectDlg.Width();
m_iMinHeight
rectDlg.Height();
得到对话框client区域的大小
rectClient;
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,
m_bitmap.bmWidth,
m_bitmap.bmHeight),
this,
0);
m_wndSizeIcon.SetBitmap(m_bmpSizeIcon);
m_wndSizeIcon.MoveWindow(m_iClientWidth
-
m_bitmap.bmHeight,
m_bitmap.bmHeight);
显示图标
m_wndSizeIcon.ShowWindow(m_bShowSizeIcon);
return
TRUE;
}
cy)
OnSize(nType,
对话框宽度和高度的增量
iIncrementX
cx
iIncrementY
cy
最小化时增量为0
if
(nType
==
SIZE_MINIMIZED)
0;
for
(int
i
<
i++)
CWnd
*pWndCtrl
NULL;
iId
m_pControlArray[i].iId;
iFlag
m_pControlArray[i].iFlag;
iPercent
m_pControlArray[i].iPercent;
无效值
((iPercent
0)
||
(iPercent
>
100))
continue;
得到控件指针
pWndCtrl
GetDlgItem(iId);
((NULL
!
pWndCtrl)
&
IsWindow(pWndCtrl->
GetSafeHwnd()))
rectCtrl;
pWndCtrl->
GetWindowRect(rectCtrl);
ScreenToClient(rectCtrl);
iLeft
rectCtrl.left;
iTop
rectCtrl.top;
iWidth
rectCtrl.Width();
iHeight
rectCtrl.Height();
switch
(iFlag)
case
MOVEX:
X方向移动
+=
(iIncrementX
*
/
100);
break;
MOVEY:
Y方向移动
(iIncrementY
MOVEXY:
X方向和Y方向同时移动
ELASTICX:
X方向改变大小
ELASTICY:
Y方向改变大小
ELASTICXY:
X方向和Y方向同时改变大小
default:
;
把控件移动到新位置
MoveWindow(iLeft,
iTop,
iWidth,
iHeight);
把图标移动到对话框右下角
(IsWindow(m_wndSizeIcon.GetSafeHwnd()))
m_wndSizeIcon.MoveWindow(cx
SIZE_MAXIMIZED)
m_wndSizeIcon.ShowWindow(FALSE);
else
m_wndSizeIcon.ShowWindow(TRUE);
Invalidate();
记录对话框client区域的大小
cx;
cy;
lpRect)
OnSizing(nSide,
对话框不能小于初始大小
lpRect->
right
left;
bottom
top;
(iWidth
m_iMinWidth)
left
+
if(iHeight
m_iMinHeight)
top
nElements)
设置控件数组信息
(NULL
lp)
FALSE;
(nElements
0)
m_pControlArray
lp;
m_iControlNumber
nElements;
/*=TRUE*/)
m_bShowSizeIcon
bShow;