在MFC自定义一个对话框类负责调整控件尺寸(全屏状态)

因为需要对所有对话框的控件和尺寸进行公共的操作,因此考虑把公有的代码封装成一个类。

但是自定义类完后,编译时总出问题,最后搞定了。总结过程如下。

1. 建立头文件。

#pragma once \\只编译一次

#include "stdafx.h"  \\必须包含
class ccsize : public CDialogEx    \\从对话框来进行操作。
{
public:

CWnd  *pdlg      \\ 需要调整的对话框的指针。用它来进行操作。

\\主对话框可以用AfxGetMainWnd()找到,其他的可以通过先赋值的办法,找到。或者直接this

public:
CRect GetContr(UINT nID);
void SetSizePosFon(UINT nID, CRect rec_contr, CRect m_rect, int cx, int cy);
void Getcxcy(int *cx, int *cy, CRect *m_rect);

};

2.建立cpp文件。 首先一定右键点击该cpp文件,选择属性,要选中“不预编译头”。然后再敲击相应的代码。

#include "size.h"




void ccsize::Getcxcy(int *cx, int *cy, CRect *m_rect) //返回cx,cy,m_rect
{
HDC hDC = ::GetDC(NULL);//获得屏幕的DC
*cx = ::GetDeviceCaps(hDC, HORZRES) + //获取屏幕的水平尺寸
GetSystemMetrics(SM_CXBORDER);
*cy = ::GetDeviceCaps(hDC, VERTRES) + //获取屏幕的垂直尺寸
GetSystemMetrics(SM_CYBORDER);
::ReleaseDC(NULL, hDC);
pdlg->GetClientRect(m_rect);
}


CRect ccsize:: GetContr(UINT nID)
{
CWnd *pWnd;
CRect rec_contr;  //控件所占矩形
pWnd = pdlg->GetDlgItem(nID);


pWnd->GetWindowRect(&rec_contr); //获取控件变化前的大小
pdlg->ScreenToClient(&rec_contr); //将控件大小转化为在对话框中的区域坐标
return(rec_contr);
}


// 当对话框尺寸改变,动态改变控件大小

void ccsize:: SetSizePosFon(UINT nID, CRect rec_contr, CRect m_rect, int cx, int cy) 

//nID为控件ID,x,y分别为对话框的当前长和宽,rec_contr为控件的原始尺寸,m_rect为原客户区大小

{
rec_contr.left = float(rec_contr.left*cx / m_rect.Width()); //按照比例调整空间的新位置
rec_contr.top = float(rec_contr.top*cy / m_rect.Height());
rec_contr.bottom = float(rec_contr.bottom*cy / m_rect.Height());
rec_contr.right = float(rec_contr.right*cx / m_rect.Width());
pdlg->GetDlgItem(nID)->MoveWindow(rec_contr); //伸缩控件 


//按钮字体大小,字形设置  
CFont * f;
f = new CFont;
f->CreateFont(15 * cy / m_rect.Height(), // nHeight     
10 * cx / m_rect.Width(),  // nWidth     
0, // nEscapement     
0, // nOrientation     
FW_BOLD, // nWeight     
TRUE, // bItalic     
FALSE, // bUnderline     
0, // cStrikeOut     
ANSI_CHARSET, // nCharSet     
OUT_DEFAULT_PRECIS, // nOutPrecision     
CLIP_DEFAULT_PRECIS, // nClipPrecision     
DEFAULT_QUALITY, // nQuality     
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily     
_T("楷体")); // lpszFac     
pdlg->GetDlgItem(nID)->SetFont(f);

}


3. 在使用时,可以用如下代码

   int cx, cy;
ccsize ccc;
ccc.pdlg = AfxGetMainWnd();    //也可以用ccc.pdlg = this; 
ccc.Getcxcy(&cx, &cy, &m_rect);
rect_IDCANCEL = ccc.GetContr(IDCANCEL);
ccc.SetSizePosFon(IDCANCEL, rect_IDCANCEL, m_rect, cx, cy);
rect_IDOK = ccc.GetContr(IDOK);
ccc.SetSizePosFon(IDOK, rect_IDOK, m_rect, cx, cy);
rect_IDCPIC1 = ccc.GetContr(IDC_PIC1);
ccc.SetSizePosFon(IDC_PIC1, rect_IDCPIC1, m_rect, cx, cy);
rect_IDCSTA1 = ccc.GetContr(IDC_STA1);

ccc.SetSizePosFon(IDC_STA1, rect_IDCSTA1, m_rect, cx, cy);

需要特别指出,CFont * f;

f = new CFont;

以后应该要delete f; 但是一旦删除以后,字体更改就失效。在网上找了很多说明,有说不用删的。但是为了保险起见,可以在整个程序

退出的时候,删除。比如在destroy消息中删除,或者oncancel消息中删除。

猜你喜欢

转载自blog.csdn.net/zane_njfu/article/details/80150745