问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何更改属性页向导页的字体

发布网友 发布时间:2024-04-29 22:55

我来回答

1个回答

热心网友 时间:2024-10-26 19:37

在 VisualC++ 的版本低于 4.0, MFC 必须自己实现
CPropertySheet。 对于您 CPropertySheet 通过资源编辑器中设置首 CPropertyPage
您对话框资源的字体可能设置字体。 在运行时, 表将使用字体设置并一切根据字体大小。 开头 VisualC++4.0, MFC 使用
Windows 95 PropertySheet 控件。 此控件将始终使用系统字体来表。 这是设计使然。 MFC 还将强制页以用作表相同字体。
这样调用 BuildPropPageArray() 函数中。 因为这是无出处函数, 它可能更改或将来的 MFC 版本中被删除。

CMySheet 将使用的首活动 CPropertyPage 字体来设置字体和 CPropertySheet 和其子窗口大小。 CPropertyPages 与资源编辑器中指定字体显示。

具体步骤:
1、新建类CMySheet,继承自CPropertySheet
2、在.cpp文件中大概实现如下。
3、修改.h文件。
4、使用这个CMySheet,更改资源中的属性页,则程序运行后,设置的字体有效。

#define WM_RESIZEPAGE WM_APP+1

enum { CDF_CENTER, CDF_TOPLEFT, CDF_NONE };

// helper function which sets the font for a window and all its children
// and also resizes everything according to the new font
void ChangeDialogFont(CWnd* pWnd, CFont* pFont, int nFlag)
{
CRect windowRect;

// grab old and new text metrics
TEXTMETRIC tmOld, tmNew;
CDC * pDC = pWnd->GetDC();
CFont * pSavedFont = pDC->SelectObject(pWnd->GetFont());
pDC->GetTextMetrics(&tmOld);
pDC->SelectObject(pFont);
pDC->GetTextMetrics(&tmNew);
pDC->SelectObject(pSavedFont);
pWnd->ReleaseDC(pDC);

long oldHeight = tmOld.tmHeight+tmOld.tmExternalLeading;
long newHeight = tmNew.tmHeight+tmNew.tmExternalLeading;

if (nFlag != CDF_NONE)
{
// calculate new dialog window rectangle
CRect clientRect, newClientRect, newWindowRect;

pWnd->GetWindowRect(windowRect);
pWnd->GetClientRect(clientRect);
long xDiff = windowRect.Width() - clientRect.Width();
long yDiff = windowRect.Height() - clientRect.Height();

newClientRect.left = newClientRect.top = 0;
newClientRect.right = clientRect.right * tmNew.tmAveCharWidth / tmOld.tmAveCharWidth;
newClientRect.bottom = clientRect.bottom * newHeight / oldHeight;

if (nFlag == CDF_TOPLEFT) // resize with origin at top/left of window
{
newWindowRect.left = windowRect.left;
newWindowRect.top = windowRect.top;
newWindowRect.right = windowRect.left + newClientRect.right + xDiff;
newWindowRect.bottom = windowRect.top + newClientRect.bottom + yDiff;
}
else if (nFlag == CDF_CENTER) // resize with origin at center of window
{
newWindowRect.left = windowRect.left -
(newClientRect.right - clientRect.right)/2;
newWindowRect.top = windowRect.top -
(newClientRect.bottom - clientRect.bottom)/2;
newWindowRect.right = newWindowRect.left + newClientRect.right + xDiff;
newWindowRect.bottom = newWindowRect.top + newClientRect.bottom + yDiff;
}
pWnd->MoveWindow(newWindowRect);
}

pWnd->SetFont(pFont);

// iterate through and move all child windows and change their font.
CWnd* pChildWnd = pWnd->GetWindow(GW_CHILD);

while (pChildWnd)
{
pChildWnd->SetFont(pFont);
pChildWnd->GetWindowRect(windowRect);

CString strClass;
::GetClassName(pChildWnd->m_hWnd, strClass.GetBufferSetLength(32), 31);
strClass.MakeUpper();
if(strClass==_T("COMBOBOX"))
{
CRect rect;
pChildWnd->SendMessage(CB_GETDROPPEDCONTROLRECT,0,(LPARAM) &rect);
windowRect.right = rect.right;
windowRect.bottom = rect.bottom;
}

pWnd->ScreenToClient(windowRect);
windowRect.left = windowRect.left * tmNew.tmAveCharWidth / tmOld.tmAveCharWidth;
windowRect.right = windowRect.right * tmNew.tmAveCharWidth / tmOld.tmAveCharWidth;
windowRect.top = windowRect.top * newHeight / oldHeight;
windowRect.bottom = windowRect.bottom * newHeight / oldHeight;
pChildWnd->MoveWindow(windowRect);

pChildWnd = pChildWnd->GetWindow(GW_HWNDNEXT);
}
}
/////////////////////////////////////////////////////////////////////////////
// CMySheet

IMPLEMENT_DYNAMIC(CMySheet, CPropertySheet)

CMySheet::CMySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
}

CMySheet::CMySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
}

CMySheet::~CMySheet()
{
if (m_fntPage.m_hObject)
VERIFY (m_fntPage.DeleteObject ());
}

BEGIN_MESSAGE_MAP(CMySheet, CPropertySheet)
//{{AFX_MSG_MAP(CMySheet)
//}}AFX_MSG_MAP
ON_MESSAGE (WM_RESIZEPAGE, OnResizePage)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMySheet message handlers

void CMySheet::BuildPropPageArray()
{
CPropertySheet::BuildPropPageArray();

// get first page
CPropertyPage* pPage = GetPage (0);
ASSERT (pPage);

// dialog template class in afxpriv.h
CDialogTemplate dlgtemp;
// load the dialog template
VERIFY (dlgtemp.Load (pPage->m_psp.pszTemplate));
// get the font information
CString strFace;
WORD wSize;
VERIFY (dlgtemp.GetFont (strFace, wSize));
if (m_fntPage.m_hObject)
VERIFY (m_fntPage.DeleteObject ());
// create a font using the info from first page
VERIFY (m_fntPage.CreatePointFont (wSize*10, strFace));
}

BOOL CMySheet::OnInitDialog()
{
CPropertySheet::OnInitDialog();

// get the font for the first active page
CPropertyPage* pPage = GetActivePage ();
ASSERT (pPage);

// change the font for the sheet
ChangeDialogFont (this, &m_fntPage, CDF_CENTER);
// change the font for each page
for (int iCntr = 0; iCntr < GetPageCount (); iCntr++)
{
VERIFY (SetActivePage (iCntr));
CPropertyPage* pPage = GetActivePage ();
ASSERT (pPage);
ChangeDialogFont (pPage, &m_fntPage, CDF_CENTER);
}

VERIFY (SetActivePage (pPage));

// set and save the size of the page
CTabCtrl* pTab = GetTabControl ();
ASSERT (pTab);

if (m_psh.dwFlags & PSH_WIZARD)
{
pTab->ShowWindow (SW_HIDE);
GetClientRect (&m_rctPage);

CWnd* pButton = GetDlgItem (ID_WIZBACK);
ASSERT (pButton);
CRect rc;
pButton->GetWindowRect (&rc);
ScreenToClient (&rc);
m_rctPage.bottom = rc.top-2;
}
else
{
pTab->GetWindowRect (&m_rctPage);
ScreenToClient (&m_rctPage);
pTab->AdjustRect (FALSE, &m_rctPage);
}

// resize the page
pPage->MoveWindow (&m_rctPage);

return TRUE;
}

BOOL CMySheet::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
NMHDR* pnmh = (LPNMHDR) lParam;

// the sheet resizes the page whenever it is activated so we need to size it correctly
if (TCN_SELCHANGE == pnmh->code)
PostMessage (WM_RESIZEPAGE);

return CPropertySheet::OnNotify(wParam, lParam, pResult);
}

LONG CMySheet::OnResizePage (UINT, LONG)
{
// resize the page
CPropertyPage* pPage = GetActivePage ();
ASSERT (pPage);
pPage->MoveWindow (&m_rctPage);

return 0;
}

BOOL CMySheet::OnCommand(WPARAM wParam, LPARAM lParam)
{
// the sheet resizes the page whenever the Apply button is clicked so we need to size it correctly
if (ID_APPLY_NOW == wParam ||
ID_WIZNEXT == wParam ||
ID_WIZBACK == wParam)
PostMessage (WM_RESIZEPAGE);

return CPropertySheet::OnCommand(wParam, lParam);
}

posted on 2008-01-25 17:42 浪迹天涯 阅读(3569) 评论(10) 编辑 收藏 引用 所属分类: C++

评论

# re: 如何更改属性页向导页的字体

2008-01-30 09:21

追梦时代

学习了,谢谢楼主 回复 更多评论

# re: 如何更改属性页向导页的字体

2008-07-25 00:02

cuckoo321

写的很不错。请问大侠,如何更改属性页的标题字体和字号? 回复 更多评论

# re: 如何更改属性页向导页的字体

2008-07-28 08:56

浪击天涯

你可以试试这样行吗?

怎样改变标题栏的宽度:

方法一:

NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof( NONCLIENTMETRICS );

::SystemParametersInfo( SPI_GETNONCLIENTMETRICS,
sizeof( NONCLIENTMETRICS ),
&ncm,
0
);

ncm.lfCaptionFont.lfHeight = -300;
::SystemParametersInfo( SPI_SETNONCLIENTMETRICS,
sizeof( NONCLIENTMETRICS ),
&ncm,
SPIF_SENDCHANGE
);
 

方法二:

case WM_NCCALCSIZE:
{
BOOL bSpecial=FALSE;
int nEdgeWidth =3;
int nBarHeight =CAPTIONHEIGHT+3;
int nBottomEdge =3;

if(!(BOOL)wParam)
{
RECT rtSave;
CopyRect(&rtSave,(LPRECT)lParam);
// ::CallWindowProcA(lpwndinfo->pWndProc,hWnd,uMsg,wParam,lParam);

if(lpwndinfo->bIM ==TRUE)
{
int imbarheight =17;
rtSave.left+=nEdgeWidth;
rtSave.top+=imbarheight+3;
rtSave.right-=nEdgeWidth;
rtSave.bottom-=nBottomEdge;
}
else
{
rtSave.left+=nEdgeWidth;
rtSave.top+=nBarHeight;
rtSave.right-=nEdgeWidth;
rtSave.bottom-=nBottomEdge;
}
CopyRect((LPRECT)lParam,&rtSave);

*lResult=0;
::ReleaseDC(hWnd,hDC);
return TRUE;
}
else
{
RECT rtSave;
LPRECT prtClt;
LPNCCALCSIZE_PARAMS pNC;
pNC=(LPNCCALCSIZE_PARAMS)lParam;

prtClt=&(pNC->rgrc[0]);
CopyRect(&rtSave,prtClt);
CopyRect( &(pNC->rgrc[2]), &(pNC->rgrc[1]));

if(bSysDlg)
{
(pNC->rgrc[2]).left +=nEdgeWidth;
(pNC->rgrc[2]).right -=nEdgeWidth;
}
else
{
if(lpwndinfo->bIM ==TRUE)
{
int imbarheight =17;
(pNC->rgrc[2]).left +=nEdgeWidth;
(pNC->rgrc[2]).top +=imbarheight+3;
(pNC->rgrc[2]).right -=nEdgeWidth;
(pNC->rgrc[2]).bottom -=nBottomEdge;

rtSave.left+=nEdgeWidth;
rtSave.top+=imbarheight+3;
rtSave.right-=nEdgeWidth;
rtSave.bottom-=nBottomEdge;
}
else
{
(pNC->rgrc[2]).left+=nEdgeWidth;
(pNC->rgrc[2]).top+=nBarHeight;
(pNC->rgrc[2]).right-=nEdgeWidth;
(pNC->rgrc[2]).bottom-=nBottomEdge;
// Result=::CallWindowProcA(lpwndinfo->pWndProc,hWnd,uMsg,wParam,lParam);
//prtClt=&(pNC->rgrc[0]);
rtSave.left+=nEdgeWidth;
rtSave.top+=nBarHeight;
rtSave.right-=nEdgeWidth;
rtSave.bottom-=nBottomEdge;
}
}
CopyRect(prtClt,&rtSave);
*lResult=0;
::ReleaseDC(hWnd,hDC);
return TRUE;
}
break;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
“笑指旧山归路长”的出处是哪里 PCB为什么要拼板,PCB拼板打样有哪些好处? 绘制紫外吸收光谱时,我发现最大吸收波长是333nm,此时吸光度为4.01 对吸光度测量值有何影响? 陆垚知马俐的歌词是什么? 玫瑰花水中的养殖方法 陈年柚子茶如何做 陈年柚子茶的制作方法 在答题卡上改题号是指那一道题扣分还是整个卷子都没? ...考试时我写到了卷子上,会怎么样?会不会按抄袭 高考时在卷子上不小心画了道怎么办? ...有的时候会胸闷 今天突然心脏疼 鼻子出血,浑身发冷 鼻子总出血浑身上下无力不舒服总冒虚汗 ...头疼牙疼流鼻涕偶尔鼻子里还会出血,身上没劲,易冷,低烧,打了几天吊... 样本容量如何计算? 我这个电脑一度能用多少小时? 途乐和英菲尼迪qx80的区别是什么? 梦见卫生间两个马桶上面的漏气 盐酸酸洗石英砂之后的溶液可以循环使用吗? 色盲色弱能考驾照吗??? 驾驶证C1能开面包车吗 跪求人类的起源有哪几种? 苹果手机怎样才能查看到wifi的密码? 北京市中国医科院肿瘤医院,哪位医生治疗结肠癌肺部(肺部结节)转移比较... 一秒20米等于一小时多少千米? 麻烦智商高的人换算一下。。。感激不尽... 寰球环节在哪 气压减振的轿车停车后底盘下降是怎么回事? 中年人如何治疗老年斑? 湖北省襄阳市谷城县盛康镇有顺丰快递吗 盛康镇有没有顺丰 十进制、二进制、八进制、十六进制、这些进位制数之间的转换关系如何... 安徽安庆到福建宁德有大巴没有?坐动车的话怎么走? 万安桥在哪个城市 湛江到宁德长途汽车有吗? 安溪县到宁德市的长途汽车里程是多少公里 2022年有哪些爆火的网红食物? 有哪些好吃的网红美食分享? 有哪些美味的网红食品值得推荐? 有什么受欢迎的国产矿泉水品牌? 受欢迎的国产矿泉水品牌有哪些? 用左边的三个图形组成一个平行四边形画在右边 ...个图案一直这样画下去 从图的左边一直线画到右边 把下面左边的图形放大到原来面积的2倍,形状不变,画在右边的方格纸中 北京市煤炭矿用机电设备技术开发有限公司怎么样 北京万利浩祥煤炭销售有限公司怎么样? 北京金原煤炭加工有限公司怎么样? 国科绿能(北京)煤炭技术咨询有限公司怎么样? 星际争霸,科技球的技能 有关cod6的emp 万千组词 孔子提问他的学生为什么要叫名字