C:\\MFC控件大小随窗体大小而改变

一。大小和位置都改变

1.首先为窗体类添加CRect m_rect,该成员变量用来记录窗体的当前大小。

2.在类向导里面(Ctrl+W),为窗体添加消息WM_SIZE的响应函数OnSize();

注意if(nType==1) return;这一句必须添加,否则最小化恢复的时候会出错。

[cpp]?view plaincopy

  1. void?CPaperManagementDlg::OnSize(UINT?nType,?int?cx,?int?cy)???
  2. {??
  3. ????CDialog::OnSize(nType,?cx,?cy);??
  4. ????if(nType==1)?return;//最小化则什么都不做??
  5. ????//?TODO:?Add?your?message?handler?code?here??
  6. ????CWnd?*pWnd;???
  7. ????pWnd?=?GetDlgItem(IDC_STATIC);??
  8. ????ChangeSize(pWnd,?cx,?cy);??
  9. ????pWnd?=?GetDlgItem(IDC_FILE_TREE);??
  10. ????ChangeSize(pWnd,?cx,?cy);??
  11. ????pWnd?=?GetDlgItem(IDC_EDIT_NAME);??
  12. ????ChangeSize(pWnd,?cx,?cy);??
  13. ????pWnd?=?GetDlgItem(IDC_EDIT_REFERENCE);??
  14. ????ChangeSize(pWnd,?cx,?cy);??
  15. ????pWnd?=?GetDlgItem(IDC_EDIT_SUMMARY);??
  16. ????ChangeSize(pWnd,?cx,?cy);??
  17. ????pWnd?=?GetDlgItem(IDC_EDIT_REMARK);??
  18. ????ChangeSize(pWnd,?cx,?cy);??
  19. ????pWnd?=?GetDlgItem(IDC_BUTTON_UPDATE);??
  20. ????ChangeSize(pWnd,?cx,?cy);??
  21. ????pWnd?=?GetDlgItem(IDC_BUTTON_SAVE);??
  22. ????ChangeSize(pWnd,?cx,?cy);??
  23. ????pWnd?=?GetDlgItem(IDC_STATIC_1);??
  24. ????ChangeSize(pWnd,?cx,?cy);??
  25. ????pWnd?=?GetDlgItem(IDC_STATIC_2);??
  26. ????ChangeSize(pWnd,?cx,?cy);??
  27. ????pWnd?=?GetDlgItem(IDC_STATIC_3);??
  28. ????ChangeSize(pWnd,?cx,?cy);??
  29. ????pWnd?=?GetDlgItem(IDC_STATIC_4);??
  30. ????ChangeSize(pWnd,?cx,?cy);??
  31. ????GetClientRect(&m_rect);//?将变化后的对话框大小设为旧大小?????
  32. }??

其中函数ChangeSize是手动添加的用户函数,步骤如下

3.添加一个改变控件大小的用户函数,void ChangeSize(CWnd *pWnd, int cx, int cy),并编写代码

[plain]?view plaincopy

  1. void?CPaperManagementDlg::ChangeSize(CWnd?*pWnd,?int?cx,?int?cy)??
  2. {??
  3. ????if(pWnd)??//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建???
  4. ????{??
  5. ????????CRect?rect;???//获取控件变化前的大小????
  6. ????????pWnd->GetWindowRect(&rect);??
  7. ????????ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标??
  8. ??
    ?
  9. ????????//????cx/m_rect.Width()为对话框在横向的变化比例??
  10. ????????rect.left=rect.left*cx/m_rect.Width();//调整控件大小??
  11. ????????rect.right=rect.right*cx/m_rect.Width();??
  12. ????????rect.top=rect.top*cy/m_rect.Height();??
  13. ????????rect.bottom=rect.bottom*cy/m_rect.Height();??
  14. ????????pWnd->MoveWindow(rect);//设置控件大小??
  15. ????}??
  16. }??

真正改变控件大小的函数是ChangeSize函数,在OnSize中不断调用ChangeSize函数从而改变窗体中所有控件的大小。

——————————————————————————————————————————————————————

以下内容来自网络:

二、 VC++之根据对话框大小仅调整控件位置
? ? 1、在对话框类中加入成员变量CRect m_rect;用于保存对话框大小变化前的大小;
? ? 2、在对话框的OnInitDialog()函数中获取对话框创建时的大小:?
? ? GetClientRect(&m_rect);
? ? 3、在WM_SIZE的响应函数OnSize()中加入以下代码:
? ? CWnd *pWnd;?
? ? pWnd = GetDlgItem(IDC_BUTTON1); ? ? //获取控件句柄
? ? if(nType==1) return; ? //如果是窗体最小化则什么都不做
? ? if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
? ? {?
? ? CRect rect; ? //获取控件变化前大小
? ? ? LONG cWidth,cHeight; //记录控件的右部到窗体右部的距离,记录控件的底部到窗体底部的距离
? ? ? pWnd->GetWindowRect(&rect);
? ? ?ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
? ? ?cWidth=m_rect.Width()-rect.right;
? ? ?cHeight=m_rect.Height()-rect.bottom;
? ? ?rect.left=cx-rect.Width()-cWidth;
? ? ?rect.right=cx-cWidth; ??
? ? ?rect.top=cy-rect.Height()-cHeight;
? ? ?rect.bottom=cy-cHeight;
? ? ?pWnd->MoveWindow(rect);//设置控件大小
? ? }
? ? GetClientRect(&m_rect);//将变化后的对话框大小设为旧大小

时间: 2024-10-18 00:17:44

C:\\MFC控件大小随窗体大小而改变的相关文章

[改善] dcef3 for Firemonkey 浏览器控件,拉动窗体大小会闪烁的问题

问题:dcef3 for Firemonkey 浏览器控件,拉动窗体大小会闪烁的问题 修改源码:ceffmx.pas 找到 procedure TCustomChromiumFMX.Resize; 修改如下: procedure TCustomChromiumFMX.Resize; var brws: ICefBrowser; b: TBitmap; begin inherited; if not (csDesigning in ComponentState) then begin brws :

WPF随笔之 控件根据设定的显示行数列数填充控件并自适应窗体大小(多绑定MVVM方式实现)

(效果图,如见最下面) 需求:根据设置的行数列数,控制展示控件个数,并且填充的控件们大小刚刚好自适应填充满固定的区域,并且调整窗体大小的时候控件动态自适应窗体大小,即自适应大小并不显示滚动条(比如,设置了1行1列,则第一页显示一个控件,如设置了2行2列,则第一页显示第一行2个控件,第二行2个控件). 解决方案,我总结有3 1.在cs代码里面动态生成Grid控件,根据设定的行列动态生成行列,将控件自适应宽高填充进去 2.固定Grid.使用WrapPanel排序,当Grid实际宽高发生改变时,动态计

winform中,如何控制控件位置随窗体的大小改变而改变

winform中,如何控制控件位置随窗体的大小改变而改变 有如下3种方法: 方法1 [csharp] view plaincopy using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace MarkPrint

MFC控件随对话框大小改变而改变

这也是我项目中碰到的问题,要让对话框中的控件随着对话框大小的变化进行自动调整,一般的做法是在WM_SIZE的响应函数中对所有的控件用MoveWindow()或者SetWindowPos()设置其变化比例. 但是由于需要自己计算,并且还有各种系统引起的情况,比如WIN7里有个选项"拖动时显示窗口内容",选中与不选中导致对话框内容显示完全不一样,选中时错误,不选正确,确实让人头大. 如EasySize是一个很好解决方案,用一些宏封装了内部的实现机制,使用起来方便快捷.原文地址:http:/

C#实现窗体拖动时各个控件同比自动放缩大小

实现方式主要是利用panel控件为主题,对于每个控件的大小位置和字体这几个属性进行记录, 然后根据窗体改变的大小同时放缩. 简要步骤如下: 1 创建C#窗体程序项目. 2  Panel放置到窗体. 3  设置属性dock为fill. 4  注意MinnumSize不能设置为0, 改成大于0都行. public partial class FrmDemo : Form { double dFrmWidth; double dFrmHeight; double dZoomHorizon; doubl

android 控制控件的位置和大小

方法一: Android的界面布局可以用两种方法,一种是在xml中布局,一种是和JAVA中Swing一样在JAVA代码中实现Ui界面的布局,用xml的布局管理器布局是很方便的,但是在一些代码中需要动态的显示界面,这个时候xml就缺少了一种灵活性,使用XML和JAVA代码中布局可以解决这样的问题.在此只对JAVA代码中的LoyoutParams方法进行理解及使用. LoyoutParams类中主要保存的是布局参数,元素或组件可以通过这个类实现对布局参数的设置.在xml中它对应的是元素的"空间位置&

MFC 控件字体样式和颜色设置

因为默认的字体大小比较小,且有时为了美观,MFC控件的字体样式更改有时显得比较重要.这一修改并不是很直观,需要经由代码来完成,代码如下: CFont *m_pFont;//创建新的字体 m_pFont = new CFont; m_pFont->CreateFont(32, // 字体高度 0, // 字体宽度 0, // 字体倾斜角 0, // 字体倾斜角 FW_EXTRALIGHT, // 字体的粗细 FALSE, // 字体是否为斜体 FALSE, // 字体是否有下划线 0, // 字体

MFC控件编程:Tab Control

Tab控件的使用 1 插入Tab控件的数据项(标签) CTabCtrl::InsertItem 2 以Tab控件为父窗口创建对话框 3 调整对话框大小 4 在Tab控件的SELCHANGE消息处理函数中,根据当前选项的索引设置对话框的显示状态. 新建一个基于对话框的工程,拖放一个Tab Control控件,Ctrl+W 为之绑定一个控件变量m_wndTabCtrl 插入两个对话框资源做为标签页面,注意设置它们的样式为:child 和 无边框 双击对话框资源为他们添加相关类,父类使用默认CDial

MFC控件自适应窗口大小类

AutoAdapt.h #pragma once class CAutoAdapt { public: CAutoAdapt(void); virtual ~CAutoAdapt(void); public: void ReSize(HWND m_hWnd); void InitSize(HWND m_hWnd); POINT old; private: }; AutoAdapt.cpp #include "stdafx.h" #include "AutoAdapt.h&qu