您的位置:首页 > 其它

MFC控件大小及控件字体跟随对话框的改变而改变

2015-01-30 14:38 666 查看
1、创建一个基于对话框的windowdemoMFC应用程序。

2、下载并在windowdemoDlg.h添加easysize.h头文件。在类构造函数中添加DECLARE_EASYSIZE、CRect m_rect、CFont m_Font、x、y。

//
#include "easysize.h"
#pragma once

// CwindowdemoDlg 对话框
class CwindowdemoDlg : public CDialogEx
{
<span style="color:#FF0000;"> DECLARE_EASYSIZE
CRect m_rect;
  CFont m_Font;
  int x;         //用于传递窗体的宽
  int y;         //用于传递窗体的高
</span>


3、在OnInitDialog()函数中添加INIT_EASYSIZE;

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

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE);			// 设置大图标
SetIcon(m_hIcon, FALSE);		// 设置小图标

// TODO: 在此添加额外的初始化代码
<span style="color:#FF0000;">INIT_EASYSIZE;</span>
<span style="color:#FF0000;">GetClientRect(&m_rect);//获取初始窗口,用于之后的比较</span>
<span style="color:#FF0000;">GetDlgItem(IDC_EDIT1)->SetWindowText(_T("this is a testdemo"));//在编辑框中显示字符,用于测试是否可以一起改变编辑框内的文字</span>

 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

4、定义两个消息WM_CHANG,WM_CHOOSEALL。代码分别如下:

//根据窗口的变化,选择字体大小
afx_msg LRESULT CwindowdemoDlg::OnChang(WPARAM wParam, LPARAM lParam)
{
num++;//在程序的最开始时定义,并初始化为0;
if(num%2==0)//在程序刚开始运行时不止调用一次的onsize函数,只有再第二次引用时m_rect.Width()才会有数值,第一次引用时为0
if(x!=m_rect.Width()||y!=m_rect.Height())
{
m_Font.DeleteObject();//在不断的创建新字体时应删除上次创建的字体,否则会出错
m_Font.CreateFont( 15*x/m_rect.Width(), 0, 0, 0, 100, FALSE, FALSE, 0,
GB2312_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_MODERN, _T("华文新魏" )) ;
}
return 0;
}


//选中所有窗口内的控件,并设置字体
afx_msg LRESULT CwindowdemoDlg::OnChooseall(WPARAM wParam, LPARAM lParam)
{
CWnd *pWndChild;
pWndChild = GetWindow(GW_CHILD);
while(pWndChild)
{
pWndChild->SetFont(&m_Font);
pWndChild = pWndChild->GetWindow(GW_HWNDNEXT);
SetFont(&m_Font);
}
Invalidate();
UpdateWindow();

return 0;
}


5、添加WM_SIZE消息映射,并在响应函数中添加 如下代码:

x=cx;//获取当前窗口宽
y=cy;//获取当前窗口高
SendMessage(WM_CHANG);//发送设置字体消息
SendMessage(WM_CHOOSEALL); //发送当前所有控件使用新字体消息
UPDATE_EASYSIZE;

6、在windowdemoDlg.cpp的END_MESSAGE_MAP()后添加如下代码:

BEGIN_MESSAGE_MAP(CwindowdemoDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_SIZE()
ON_MESSAGE(WM_CHANG, &CwindowdemoDlg::OnChang)
ON_MESSAGE(WM_CHOOSEALL, &CwindowdemoDlg::OnChooseall)
//    ON_BN_CLICKED(IDCANCEL, &CwindowdemoDlg::OnBnClickedCancel)
END_MESSAGE_MAP()
//用于设定控件的变化
<span style="color:#FF0000;">BEGIN_EASYSIZE_MAP(CwindowdemoDlg)
EASYSIZE(IDC_STATIC,ES_BORDER,ES_BORDER,ES_BORDER,ES_KEEPSIZE,ES_HCENTER)
EASYSIZE(IDC_EDIT1,ES_BORDER,ES_BORDER,ES_KEEPSIZE,ES_KEEPSIZE,0)
EASYSIZE(IDOK,ES_BORDER,ES_BORDER,ES_KEEPSIZE,ES_KEEPSIZE,0)
EASYSIZE(IDCANCEL,ES_BORDER,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0)
END_EASYSIZE_MAP </span>


7、此外还要在windowdemoDlg.h对消息进行宏定义:

// windowdemoDlg.h : 头文件
//

#include "easysize.h"
#pragma once
<span style="color:#FF0000;">#define WM_CHANG 100
#define WM_CHOOSEALL 101</span>


8、测试的效果:

窗体原始大小:



窗体改变后:



可以看出所有控件的字符有改变,控件更改方式可以按照EASYSIZE来修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: