mfc可变窗口大小 仅供个人使用.doc_第1页
mfc可变窗口大小 仅供个人使用.doc_第2页
mfc可变窗口大小 仅供个人使用.doc_第3页
mfc可变窗口大小 仅供个人使用.doc_第4页
mfc可变窗口大小 仅供个人使用.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在网上有VC中自动改变控件位置和大小的对话框类的文章开始不知道如何使用我在生成的非模态对话框里研究了一天已经搞定了步骤:1,在非模态对话框类的头文件(.h)顶部加上#include lxDialog.h,然后把非模态对话框类的基类改成ClxDialog,也就是在头文件里class C* : public CDialog 改成:class C* : public ClxDialog在非模态对话框类的.cpp函数里,把构造函数C*:C*(CWnd* pParent ): CDialog(C*:IDD, pParent)改成:C*:C*(CWnd* pParent ): ClxDialog(C*:IDD, pParent)2,用类向导给非模态对话框添加一个OnInitDialog()函数;也就是在双击类向导-Message Maps- 选非模态对话框类;Messages选WM_INITDIALOG双击它,这样在你的非模态对话框的cpp文件里就生成了ON_WM_INITDIALOG和OnInitDialog()函数;3,在这个OnInitDialog函数里添加代码:ClxDialog:OnInitDialog();ClxDialog:ShowSizeIcon(TRUE);/显示可以调整大小的图标static DLGCTLINFO dcMenuGroup = IDCANCEL, MOVEX, 100, IDCANCEL, MOVEY, 100, IDC_EDIT_RECDSPDLG, ELASTICX, 100, IDC_EDIT_RECDSPDLG, ELASTICY, 100, ;SetControlProperty(dcMenuGroup, sizeof(dcMenuGroup)/sizeof(DLGCTLINFO);return TRUE;/IDCANCEL是关闭按钮的ID,IDOK按钮我去掉了所以没加,IDC_EDIT_RECDSPDLG是一个EDIT控件/想让哪个控件调整,就照葫芦画瓢在组里加上4,再用类向导添加OnSize()函数,也就是双击ON_WM_SIZE,这样就增加了void C*:OnSize(UINT nType, int cx, int cy) 这个函数,然后在这个函数里添加代码:ClxDialog:OnSize(nType, cx, cy);5,别忘了在资源里右键你的非模态对话框,把属性栏Styles里Border选成Resizing。这样就搞定了附上网上找的那个类:VC中自动改变控件位置和大小的对话框类lxDialog.h文件: / 自动改变控件位置和大小的对话框类/ 文件名:lxDialog.h/ 作者:StarLee()/class ClxDialog : public CDialogpublic:ClxDialog(UINT nID, CWnd* pParent = NULL);typedef struct _dlgControlTagint iId;int iFlag;int iPercent; DLGCTLINFO, *PDLGCTLINFO;enumMOVEX = 0,MOVEY,MOVEXY,ELASTICX,ELASTICY,ELASTICXY;/ 设置控件信息BOOL SetControlProperty(PDLGCTLINFO lp, int nElements);/ 是否在对话框右下角显示表示可改变大小的图标void ShowSizeIcon(BOOL bShow = TRUE);protected:virtual BOOL OnInitDialog();afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnSizing(UINT nSide, LPRECT lpRect);DECLARE_MESSAGE_MAP()private:int m_iClientWidth; / 对话框client区域的宽度int m_iClientHeight; / 对话框client区域的高度int m_iMinWidth; / 对话框的最小宽度int m_iMinHeight; / 对话框的最小高度PDLGCTLINFO m_pControlArray; / 控件信息数组指针int m_iControlNumber; / 设置控件信息的控件个数BOOL m_bShowSizeIcon; / 是否显示表示可改变大小的图标CStatic m_wndSizeIcon; / 放图标的静态控件/ 保存图标的bitmapCBitmap m_bmpSizeIcon;BITMAP m_bitmap;lxDialog.cpp文件:/ 自动改变控件位置和大小的对话框类/ 文件名:lxDialog.cpp/ 作者:StarLee()/#include stdafx.h#include lxDialog.h/ 表示可改变大小的图标ID#ifndef OBM_SIZE#define OBM_SIZE 32766#endifClxDialog:ClxDialog(UINT nID, 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()BOOL ClxDialog:OnInitDialog()CDialog:OnInitDialog();/ 设置对话框为可变大小的ModifyStyle(0, WS_SIZEBOX);/ 以对话框的初始大小作为对话框的宽度和高度的最小值CRect rectDlg;GetWindowRect(rectDlg);m_iMinWidth = rectDlg.Width();m_iMinHeight = rectDlg.Height();/ 得到对话框client区域的大小CRect 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, 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);return TRUE;void ClxDialog:OnSize(UINT nType, int cx, int cy)CDialog:OnSize(nType, cx, cy);/ 对话框宽度和高度的增量int iIncrementX = cx - m_iClientWidth;int iIncrementY = cy - m_iClientHeight;/ 最小化时增量为0if (nType = SIZE_MINIMIZED)iIncrementX = iIncrementY = 0;for (int i = 0; i m_iControlNumber; i+)CWnd *pWndCtrl = NULL;int iId = m_pControlArrayi.iId;int iFlag = m_pControlArrayi.iFlag;int iPercent = m_pControlArrayi.iPercent;/ 无效值if (iPercent 100)continue;/ 得到控件指针pWndCtrl = GetDlgItem(iId);if (NULL != pWndCtrl) & IsWindow(pWndCtrl-GetSafeHwnd()CRect rectCtrl;pWndCtrl-GetWindowRect(rectCtrl);ScreenToClient(rectCtrl);int iLeft = rectCtrl.left;int iTop = rectCtrl.top;int iWidth = rectCtrl.Width();int iHeight = rectCtrl.Height();switch (iFlag)case MOVEX: / X方向移动iLeft += (iIncrementX * iPercent / 100);break;case MOVEY: / Y方向移动iTop += (iIncrementY * iPercent / 100);break;case MOVEXY: / X方向和Y方向同时移动iLeft += (iIncrementX * iPercent / 100);iTop += (iIncrementY * iPercent / 100);break;case ELASTICX: / X方向改变大小iWidth += (iIncrementX * iPercent / 100);break;case ELASTICY: / Y方向改变大小iHeight += (iIncrementY * iPercent / 100);break;case ELASTICXY: / 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;void ClxDialog:OnSizing(UINT nSide, LPRECT lpRect)CDialog:OnSizing(nSide, lpRect);/ 对话框不能小于初始大小int iWidth = lpRect-right - lpRect-left;int iHeight = lpRect-bottom - lpRect-top;if (iWidth right = lpRect-left + m_iMinWidth;if(iHeight bottom = lpRect-top + m_iMinHeight;BOOL ClxDialog:SetControlProperty(PDLGCTLINFO lp, int nElements)/ 设置控件数组信息if (NULL = lp)return FALSE;if (nElements 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对话框大小如何调节? 互联网 电脑软件 电脑硬件悬赏点数 10 1个回答 685次浏览0LeeTeuk 2008-10-28 14:39:53 172.30.211.* 举报MFC对话框大小如何调节?回答窗体顶端窗体底端引用:添加引用:登录并发表回答取消在谷歌搜索MFC对话框大小如何调节?正在发表回答,请稍候您输入的内容将会在您成功登录之后自动发表。回答按时间排序 按投票数排序0liuyangbmw 2008-10-28 15:27:11 121.29.129.* 举报简单的说可以在OnInitDialog()函数里加上一句:RECT rect;GetClientRect(&rect);MoveWindow(1024-rect.right,0,rect.right,rect.bottom);以上MoveWindow中的前两个参数就是窗体显示时的左上角坐标,我假设你的屏幕分辨率为1024*768,所以其横坐标为1024-rect.right;获得对话框准确像素 悬赏分:0 - 解决时间:2008-11-17 11:02想在对话框添加背景图片,但不知道如何获得对话框的像素,无法准确设置图片的大小。请问如何在VC6.0或2005中使图片与对话框配置适当的大小?提问者: jimoffice - 五级最佳答案获得WindowRect和ClientRect 然后做一些计算 /API的实现 RECT rw, rc; GetWindowRect(hwnd, &rw); GetClientRect(hwnd, &rc); OffsetRect(&rw, -rw.left, -rw.top); int w = 图片宽 + rw.right - rc.right; int h = 图片高 + 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函数.举一个CPopertySheet的例子几个对象CPropertySheetm_sheet;CLogPropertyPagem_LogSystem;/SystemLog;CLogPropertyPagem_LogClientOne;/LogaboutClientOne;CLogPropertyPagem_LogClientTwo;/LogaboutClientTwo;CLogPropertyPagem_LogTimer;/Logabouttimer;m_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);RECTrect;this-GetWindowRect(&rect);intwidth=rect.right-rect.left;intheight=rect.bottom-rect.top;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函数.VC中用MFC新建了一个对话框应用程序,想获得客户区(不包括标题栏)的矩形大小,用哪个函数获得?悬赏分:5 解决时间:2009-04-06 01:32VC中用MFC新建了一个对话框应用程序,想获得客户区(不包括标题栏)的矩形大小,用哪个函数获得?最佳答案 coldplay328_644 - 二副 十一级在Dlg类中用this->GetClientRect可以获得当前客户区的大小,this->GetWindowRect可以获得在屏幕的位置,当然互相可以转换ScreenToClient这些函数 VC中自动改变控件位置和大小的对话框类2006-07-19 16:33作者:StarLee出处:blog责任编辑:方舟在用VC开发应用程序时,经常会要做一些可以改变大小的对话框,而这个时候就要求对话框上的控件会随着对话框大小的改变而改变自己的位置和大小。如果控件比较少,那可以在对话框的OnSize()事件里面添加代码,通过计算来调整各个控件的位置和大小;但是,如果对话框上的控件比较多的话,那这将是一件非常痛苦的事情!要是程序中又有很多可以改变大小的对话框,那一个一个的OnSize()写下来,那会使程序员崩溃的!为了解决这个问题,我写了一个自动改变控件位置和大小的对话框类ClxDialog。从这个类继承的对话框类,只要在OnInitDialog()里对控件做一些简单的设置,对话框上的控件就会随着对话框大小的改变而改变自己的位置和大小。为了保存控件信息,我定义了一个结构:typedef struct _dlgControlTagint iId; / 控件IDint iFlag; / 标志,表示怎样改变控件的位置或者大小int iPercent; / 改变值占对话框改变值的百分比 DLGCTLINFO, *PDLGCTLINFO;这里要对结构中的iFlag和iPercent进行一些解释。其中iFlag是下面的枚举值:enumMOVEX = 0, / 控件在X方向(左右)移动MOV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论