VC++窗体控件自动放缩

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_40554560/article/details/88992318


在这里插入图片描述
// DialogExAutosize.cpp : 实现文件

// 编者: 贺昌锋
// 最后日期:2019-04-04
// 目的: VC++, MFC, WINDOWS的基本功能
// 功能:窗口放缩,则其内控件自动随之放缩
// 使用:继承该类,例程见后

#include “stdafx.h”
#include “DialogExtAutosize.h”
#include “afxdialogex.h”

// CDialogExtAutosize 对话框

IMPLEMENT_DYNAMIC(CDialogExtAutosize, CDialogEx)

CDialogExtAutosize::CDialogExtAutosize(CWnd* pParent / =NULL/)
CDialogEx(IDD, pParent)
{
}

CDialogExtAutosize::CDialogExtAutosize(UINT IDD, CWnd* pParent) : CDialogEx(IDD, pParent){
};

CDialogExtAutosize::~CDialogExtAutosize()
{
}

BEGIN_MESSAGE_MAP(CDialogExtAutosize, CDialogEx)
ON_WM_SIZE()
ON_WM_CLOSE()
END_MESSAGE_MAP()

// CDialogExtAutosize 消息处理程序
void CDialogExtAutosize::Get_Control_Original_Proportion()
{
// 保存窗口内所有控件的原始位置和大小数据
HWND hwndChild = ::GetWindow(this->GetSafeHwnd(), GW_CHILD);

// 遍历窗口内所有控件
while (hwndChild)
{
	CRect rect;											//获取控件大小
	CRectOfControl m_CtrolRect;

	CWnd* pWnd = FromHandle(hwndChild);					// 获取句柄		
	pWnd->GetWindowRect(&rect);
	// 坐标转换
	ScreenToClient(&rect);								//将控件大小转换为在对话框中的区域坐标

	m_CtrolRect.nId = ::GetDlgCtrlID(hwndChild);		//获得控件的ID;
	m_CtrolRect.rect = rect;
	m_CtrolRect.height = rect.right - rect.left;
	m_CtrolRect.height = rect.bottom - rect.top;

	// 保存控件的位置和大小数据
	m_ListRectOfControl.AddTail(m_CtrolRect);
	hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
}

}

// 窗体大小变化
void CDialogExtAutosize::ReSize(int cx, int cy){
float fRatioX, fRatioY;
CRect m_rectWndNew;

//获取对话框的当前大小
GetClientRect(&m_rectWndNew);

if ((m_rectWndOld.right - m_rectWndOld.left) <= 0) return;
if ((m_rectWndOld.bottom - m_rectWndOld.top) <= 0) return;

// 计算水平和纵向放大比例系数
fRatioX = (float)(m_rectWndNew.right - m_rectWndNew.left) / (float)(m_rectWndOld.right - m_rectWndOld.left);
fRatioY = (float)(m_rectWndNew.bottom - m_rectWndNew.top) / (float)(m_rectWndOld.bottom - m_rectWndOld.top);

CRect rect;

POSITION pos = m_ListRectOfControl.GetHeadPosition();
HWND  hwndChild = ::GetWindow(m_hWnd, GW_CHILD);		
//遍历窗口上的所有控件 
for (int i = 0; i < m_ListRectOfControl.GetCount(); i++)
{
	CRectOfControl m_control = (CRectOfControl)m_ListRectOfControl.GetNext(pos);

	// 更改控件的位置和大小
	rect.left = (long)(fRatioX * (float)m_control.rect.left);
	rect.right = (long)(fRatioX * (float)m_control.rect.right);
	rect.top = (long)(fRatioY * (float)m_control.rect.top);
	rect.bottom = (long)(fRatioY * (float)m_control.rect.bottom);

	GetDlgItem(m_control.nId)->MoveWindow(rect, TRUE);
	hwndChild = ::GetWindow(hwndChild, GW_HWNDNEXT);
}

}

void CDialogExtAutosize::OnSize(UINT nType, int cx, int cy)
{ //判断窗口是不是最小化了,因为窗口最小化之后 ,窗口的长和宽会变成0,当前一次变化的时就会出现除以0的错误操作
if (nType != SIZE_MINIMIZED)
{
ReSize(cx, cy);
}

CDialogEx::OnSize(nType, cx, cy);

}

BOOL CDialogExtAutosize::OnInitDialog()
{
CDialogEx::OnInitDialog();

// 原始窗口大小
GetClientRect(&m_rectWndOld);

// 保存窗口内所有控件的原始位置和大小数据
Get_Control_Original_Proportion();

return TRUE;

}

void CDialogExtAutosize::OnClose()
{
// 清理内存,回收内存
m_ListRectOfControl.RemoveAll();

CDialogEx::OnClose();

}

// DialogExtAutosize.h

#pragma once

// CDialogExtAutosize 对话框

// 保存控件的大小,位置
class CRectOfControl
{
public:
int nId;
int width;
int height;
CRect rect;
};

class CDialogExtAutosize : public CDialogEx
{
DECLARE_DYNAMIC(CDialogExtAutosize)

public:
CDialogExtAutosize(CWnd* pParent = NULL); // 标准构造函数
CDialogExtAutosize(UINT IDD, CWnd* pParent = NULL); // 构造函数

virtual ~CDialogExtAutosize();

// 对话框资源ID(假的)
enum { IDD = 0 };

protected:
CRect m_rectWndOld;

void ChangeSize(UINT nID, int x, int y);
void ReSize(int cx, int cy);

DECLARE_MESSAGE_MAP()

public:
afx_msg void OnSize(UINT nType, int cx, int cy);//窗口自适应大小

virtual BOOL OnInitDialog();

public:
// 保存控件的位置等数据
CList<CRectOfControl, CRectOfControl> m_ListRectOfControl;

void Get_Control_Original_Proportion();
afx_msg void OnClose();

};

///// 使用:继承类CDialogExtAutosize
// SeriveDlg.cpp : 实现文件
//

#include “stdafx.h”
#include “afxdialogex.h”
#include “ServiceDlg.h”
#include “DialogExtAutosize.h”
#include “resource.h”

// CServiceDlg 对话框

IMPLEMENT_DYNAMIC(CServiceDlg, CDialogExtAutosize)

CServiceDlg::CServiceDlg(CWnd* pParent / =NULL/)
CDialogExtAutosize(IDD, pParent)
{

}

CServiceDlg::~CServiceDlg()
{
}

void CServiceDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CServiceDlg, CDialogExtAutosize)
ON_BN_CLICKED(IDC_BUTTON33, &CServiceDlg::OnBnClickedButton33)
END_MESSAGE_MAP()

// CServiceDlg 消息处理程序

void CServiceDlg::OnBnClickedButton33()
{
//CToolStringDlg dlg;

//INT_PTR nResponse = dlg.DoModal();	

}

BOOL CServiceDlg::OnInitDialog()
{
CDialogExtAutosize::OnInitDialog();

m_Menu.LoadMenu(IDR_MENU_SERVICE_SELECT); 

SetMenu(&m_Menu);

return TRUE;  

}

// ServiceDlg.h
#pragma once

#include “DialogExtAutosize.h”
#include “resource.h”

// CServiceDlg 对话框
class CServiceDlg : public CDialogExtAutosize
{
DECLARE_DYNAMIC(CServiceDlg)

public:
CServiceDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CServiceDlg();

// 对话框数据
enum { IDD = IDD_DIALOG_SERVICES };

protected:
CMenu m_Menu;

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

DECLARE_MESSAGE_MAP()

public:
afx_msg void OnBnClickedButton66();
afx_msg void OnBnClickedButton33();

virtual BOOL OnInitDialog();

};

//// Resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 MFCApplication1.rc 使用
//
#define IDR_MAINFRAME 128
#define IDD_DIALOG_SERVICES 140
#define IDR_MENU_SERVICE_SELECT 148
#define IDC_EDIT1 1009
#define IDC_EDIT2 1010
#define IDC_EDIT3 1011
#define IDC_BUTTON11 1016
#define IDC_BUTTON33 1018
#define IDC_RADIO1 1020
#define IDC_RADIO2 1021
#define IDC_BUTTON55 1022
#define IDC_BUTTON66 1023
#define IDC_LIST2 1024
#define IDC_BUTTON77 1025
#define IDC_BUTTON35 1027
#define IDC_BUTTON23 1028
#define IDC_BUTTON45 1029
#define IDC_STATIC1 1037
#define IDC_STATIC2 1038
#define IDC_STATIC3 1039
#define IDC_STATIC4 1040
#define IDC_STATIC01 1041
#define IDC_STATIC12 1042
#define ID_FILE_OPEN32778 32778
#define ID_FILE_SAVE32779 32779
#define ID_FILE_EXIT 32780
#define ID_ADD_DEVICE 32789
#define ID_ADD_SENSOR 32790
#define ID_ADD_CONTROL 32791
#define ID_ADD_TOOL 32792
#define ID_HELP_ABOUT 32793
#define ID_FILE_ABOUT 32794
#define ID_FILE_CLOSEALL 32795
#define ID_ACTION_STOP 32796
#define ID_ACTION_CALIBRATE 32797
#define ID_ACTION_VERIFY 32798
#define ID_Menu32800 32800
#define ID_ACTION_RECORDONTIME 32801
#define ID_ACTION_REPLAY 32802
#define ID_ACTION_INDEPENDENTREPLAY 32803
#define ID_ACTION_DEPTHSHIFT 32804
#define ID_Menu32806 32806
#define ID_ACTION_A 32807
#define ID_ACTION_PREVIEWONTIME 32808
#define ID_ACTION_PLOTCALREPORT32809 32809
#define ID_EDIT_TOOLSTRING 32810
#define ID_EDIT_VARIABLES 32811
#define ID_EDIT_HEADING 32812
#define ID_EDIT_MASTERLOGFORMAT 32813
#define ID_EDIT_PLOTJOB 32814
#define ID_EDIT_SENSORS 32815
#define ID_EDIT_CALIBRATIONS 32816
#define ID_EDIT_FILTERS 32817
#define ID_EDIT_TOOLCONFIGURATION 32818
#define ID_EDIT_CORRECTIONCURVES 32819
#define ID_MONITOR_OUTPUTS 32820
#define ID_MONITOR_S 32821
#define ID_MONITOR_TOOLS 32822
#define ID_MONITOR_DEVICES 32823
#define ID_MONITOR_HOISTMAN 32824

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 130
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

// MFCApplication1.rc
// Microsoft Visual C++ generated resource script.
//
#include “resource.h”

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include “targetver.h”
#endif
#include “afxres.h”
#include “verrsrc.h”

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
“resource.h\0”
END

2 TEXTINCLUDE
BEGIN
“#ifndef APSTUDIO_INVOKED\r\n”
“#include ““targetver.h””\r\n”
“#endif\r\n”
“#include ““afxres.h””\r\n”
“#include ““verrsrc.h””\r\n”
“\0”
END

3 TEXTINCLUDE
BEGIN
“#define _AFX_NO_SPLITTER_RESOURCES\r\n”
“#define _AFX_NO_OLE_RESOURCES\r\n”
“#define _AFX_NO_TRACKER_RESOURCES\r\n”
“#define _AFX_NO_PROPERTY_RESOURCES\r\n”
“\r\n”
“#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n”
“LANGUAGE 4, 2\r\n”
"#include ““res\MFCApplication1.rc2"” // 非 Microsoft Visual C++ 编辑的资源\r\n”
“#include ““l.CHS\afxres.rc”” // 标准组件\r\n”
“#if !defined(_AFXDLL)\r\n”
“#include ““l.CHS\afxribbon.rc”” // MFC 功能区和控制条资源\r\n”
“#endif\r\n”
“#endif\r\n”
“\0”
END

#endif // APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON “res\MFCApplication1.ico”

/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG_SERVICES DIALOGEX 0, 0, 317, 375
STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION “Edit services”
FONT 9, “MS Shell Dlg”, 0, 0, 0x1
BEGIN
PUSHBUTTON “Close(&X)”,IDCANCEL,240,334,47,14
PUSHBUTTON “Add(&A)”,IDC_BUTTON11,179,277,47,14
PUSHBUTTON “Edit(&E)”,IDC_BUTTON33,240,315,47,14
RTEXT “Service name1:”,IDC_STATIC1,7,271,57,11
RTEXT “Factory name:”,IDC_STATIC2,7,291,57,11
RTEXT “Telemetry model:”,IDC_STATIC3,7,312,57,11
EDITTEXT IDC_EDIT1,67,310,93,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT2,67,269,93,14,ES_AUTOHSCROLL
EDITTEXT IDC_EDIT3,67,290,93,14,ES_AUTOHSCROLL
CONTROL “”,IDC_LIST2,“SysListView32”,LVS_LIST | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,15,20,284,235
PUSHBUTTON “Copy(&C)”,IDC_BUTTON55,240,277,47,14
PUSHBUTTON “Paste(&P)”,IDC_BUTTON66,240,296,47,14
PUSHBUTTON “Export(&O)”,IDC_BUTTON77,179,315,47,14
GROUPBOX “Services list”,IDC_STATIC4,7,5,297,257
RTEXT “Useable:”,IDC_STATIC,17,332,47,11
CONTROL “Disable”,IDC_RADIO1,“Button”,BS_AUTORADIOBUTTON,114,332,37,10
CONTROL “False”,IDC_RADIO2,“Button”,BS_AUTORADIOBUTTON,71,332,31,10
GROUPBOX “”,IDC_STATIC01,7,257,157,109
GROUPBOX “”,IDC_STATIC12,163,257,141,109
PUSHBUTTON “Save(&S)”,IDC_BUTTON35,108,346,47,14
PUSHBUTTON “Del(&D)”,IDC_BUTTON23,179,296,47,14
PUSHBUTTON “Import(&I)”,IDC_BUTTON45,179,334,47,14
END

/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK “StringFileInfo”
BEGIN
BLOCK “080404B0”
BEGIN
VALUE “CompanyName”, “TODO: <公司名>”
VALUE “FileDescription”, “MFCApplication1”
VALUE “FileVersion”, “1.0.0.1”
VALUE “InternalName”, “MFCApplication1.exe”
VALUE “LegalCopyright”, “TODO: © <公司名>。 保留所有权利。”
VALUE “OriginalFilename”, “MFCApplication1.exe”
VALUE “ProductName”, “TODO: <产品名>”
VALUE “ProductVersion”, “1.0.0.1”
END
END
BLOCK “VarFileInfo”
BEGIN
VALUE “Translation”, 0x804, 1200
END
END

/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_DIALOG_SERVICES, DIALOG
BEGIN
RIGHTMARGIN, 313
BOTTOMMARGIN, 369
END
END
#endif // APSTUDIO_INVOKED

/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

IDR_MENU_SERVICE_SELECT MENU
BEGIN
POPUP “&File”
BEGIN
MENUITEM “Select Data&set”, ID_FILE_OPEN32778
MENUITEM “Load &Variables”, ID_FILE_SAVE32779
MENUITEM SEPARATOR
MENUITEM “&About”, ID_FILE_ABOUT
MENUITEM SEPARATOR
MENUITEM “E&xit”, ID_FILE_EXIT
MENUITEM “&Close All”, ID_FILE_CLOSEALL
END
MENUITEM “&Service”, 0
POPUP “&Action”
BEGIN
MENUITEM “Po&wer Control”, ID_ADD_DEVICE
MENUITEM “C&aliper Control”, ID_ADD_SENSOR
MENUITEM “Re&lay Control”, ID_ADD_CONTROL
MENUITEM SEPARATOR
MENUITEM “Sto&p”, ID_ACTION_STOP
MENUITEM SEPARATOR
MENUITEM “&Calibrate”, ID_ACTION_CALIBRATE
MENUITEM “&Verify”, ID_ACTION_VERIFY
MENUITEM “Pl&ot Cal Report”, ID_ACTION_PLOTCALREPORT32809
MENUITEM SEPARATOR
MENUITEM “Record &Up”, ID_Menu32800
MENUITEM “Record &Down”, ID_Menu32800
MENUITEM “Record on &Time”, ID_ACTION_RECORDONTIME
MENUITEM SEPARATOR
MENUITEM “&Replay”, ID_ACTION_REPLAY
MENUITEM “&Independent Replay”, ID_ACTION_INDEPENDENTREPLAY
MENUITEM SEPARATOR
MENUITEM “Depth Shi&ft”, ID_ACTION_DEPTHSHIFT
MENUITEM “Auto Correlation Curves”, ID_ACTION_A
MENUITEM SEPARATOR
MENUITEM “Preview Up”, ID_Menu32806
MENUITEM “Preview Down”, ID_ADD_TOOL
MENUITEM “Preview on Time”, ID_ACTION_PREVIEWONTIME
END
POPUP “&Edit”
BEGIN
MENUITEM “&Tool String”, ID_EDIT_TOOLSTRING
MENUITEM “&Variables”, ID_EDIT_VARIABLES
MENUITEM “&Heading”, ID_EDIT_HEADING
MENUITEM “Master &Log Format”, ID_EDIT_MASTERLOGFORMAT
MENUITEM “Plot &Job”, ID_EDIT_PLOTJOB
MENUITEM “&Sensors”, ID_EDIT_SENSORS
MENUITEM “&Calibrations”, ID_EDIT_CALIBRATIONS
MENUITEM “&Filters”, ID_EDIT_FILTERS
MENUITEM “&Tool Configuration”, ID_EDIT_TOOLCONFIGURATION
MENUITEM “&Device Configuration”, ID_EDIT_TOOLCONFIGURATION
MENUITEM “Correction Curves”, ID_EDIT_CORRECTIONCURVES
END
POPUP “&Monitor”
BEGIN
MENUITEM “&Sensors”, ID_HELP_ABOUT
MENUITEM “Outputs”, ID_MONITOR_OUTPUTS
MENUITEM “Sample &Queues”, ID_MONITOR_S
MENUITEM “&Tools”, ID_MONITOR_TOOLS
MENUITEM “&Devices”, ID_MONITOR_DEVICES
MENUITEM “Hoistman’s Display”, ID_MONITOR_HOISTMAN
END
END

#endif // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////

#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE 4, 2
#include “res\MFCApplication1.rc2” // 非 Microsoft Visual C++ 编辑的资源
#include “l.CHS\afxres.rc” // 标准组件
#if !defined(_AFXDLL)
#include “l.CHS\afxribbon.rc” // MFC 功能区和控制条资源
#endif
#endif

/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

猜你喜欢

转载自blog.csdn.net/weixin_40554560/article/details/88992318
今日推荐