当前位置:编程学习 > C/C++ >>

根据文本串的长度改变窗口的大小

 

 

提出问题:    

    根据文本文件的内容,用CWin的子类对控制进行动态创建。在Create方法中,根据用户在显示属性对话框中选择的消息文本字体,用下列代码创建所有的控制:

NONCLIENTMETRICS ncm;
ncm.cbSize = sizeof(NONCLIENTMETRICS);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);
m_DefaultFont.CreateFontIndirect(&ncm.lfMessageFont);

    获得字体以后,接下来的问题是如何才能确定静态控制的高度与宽度以便显示完整的文本?

首先应该明确的是所谓显示属性对话框即在桌面单击右键,选择“属性”菜单项,再选择“外观”属性页出现的对话框(图一)。

图一

    用户可以在这个对话框中选择活动窗口、消息框以及文字的颜色和字体。你可以调用SystemParametersInfo函数,用SPI_GETNONCLIENTMETRICS作为第一个参数来查出用户选择了什么字体;SystemParametersInfo 函数将你需要的信息填写到NONCLIENTMETRICS 结构中:
// NONCLIENTMETRICS 结构(winuser.h)
//
struct NONCLIENTMETRICS
{
UINT cbSize;
int iBorderWidth;
int iScrollWidth;
int iScrollHeight;
int iCaptionWidth;
int iCaptionHeight;
LOGFONT lfCaptionFont;
int iSmCaptionWidth;
int iSmCaptionHeight;
LOGFONT lfSmCaptionFont;
int iMenuWidth;
int iMenuHeight;
LOGFONT lfMenuFont;
LOGFONT lfStatusFont;
LOGFONT lfMessageFont;
};
这个结构含有用于菜单、消息及其它字体的LOGFONT结构。一旦你有了字体,那如何知道显示给定的文本串需要多大的屏幕空间?这是Windows编程的一个共同问题。所幸的是,Windows中有一个专门的函数,用它可以在屏幕的任何地方显示文本,这个函数就是 DrawText。在Windows中这是一个基本的文本显示函数。它的功能是在指定的屏幕坐标上显示(或者说绘制)文本串。

CDC dc = ...;
CRect rc = ...;
CString str = "Hello";
dc.DrawText(str, &rc, 0);

DrawText 在你指定的矩形框中显示文本-但是如果你不知道这个矩形应该是多大,该怎么办呢?这时有一个很容易的办法来计算矩形大小:

CRect rc(0,0,0,0);
dc.DrawText(str, &rc, DT_CALCRECT);

DrawText实际上并不绘制文本,而是计算出文本需要多少空间。DrawText改变传入矩形的大小以便适应文本的宽度和高度。调用DrawText之后,rc.Widtrh和rc.Height将返回文本的宽度和高度。你可以用希望的左上角坐标初始化CRect,即(rc.left,rc.top)代替(0,0)。然后DrawText将根据文本宽度和高度产生有下脚坐标。
当然,前面的代码段假设字体的设备上下文已经选定。仅仅用LOGFONT怎能行呢?如果你已经有一个DC,因为MFC把它传给你了(例如,当MFC调用视图的CView::OnDraw或宿主绘画项的CWnd::OnDrawItem时),你可以使用提供的DC作为你的设备上下文;否则,你必须调用下面的两个CDC创建函数之一。

// 创建客户DC
CClientDC dc(pMyWnd);
或者
// 创建window DC
CWindowDC dc(pMyWnd);

因为你不想真的画任何东西,所以使用那个设备上下文并不重要。只要你是创建屏幕DC-相对于打印机或者其它的设备而言,调用任何的CDC创建函数都行(除非你想要一个打印机的设备上下文)。
一旦你有了设备上下文,你就得创建字体对象并将它选进DC。这是标准的Windows图形编程。
// 创建字体
CFont font;
font.CreateFontIndirect(&ncm.lfMessageFont);
// 将字体选进DC
CFont* pOldFont = dc.SelectObject(&font);
// 计算文本大小
dc.DrawText(str, rc, DT_CALCRECT);
// 回复旧字体-这是必须的
dc.SelectObject(pOldFont);

 

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,