mfc可变窗口大小 仅供个人使用.docx

上传人:b****5 文档编号:8475078 上传时间:2023-01-31 格式:DOCX 页数:17 大小:51.73KB
下载 相关 举报
mfc可变窗口大小 仅供个人使用.docx_第1页
第1页 / 共17页
mfc可变窗口大小 仅供个人使用.docx_第2页
第2页 / 共17页
mfc可变窗口大小 仅供个人使用.docx_第3页
第3页 / 共17页
mfc可变窗口大小 仅供个人使用.docx_第4页
第4页 / 共17页
mfc可变窗口大小 仅供个人使用.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

mfc可变窗口大小 仅供个人使用.docx

《mfc可变窗口大小 仅供个人使用.docx》由会员分享,可在线阅读,更多相关《mfc可变窗口大小 仅供个人使用.docx(17页珍藏版)》请在冰豆网上搜索。

mfc可变窗口大小 仅供个人使用.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1