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

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

图一

用户可以在这个对话框中选择活动窗口、消息框以及文字的颜色和字体。你可以调用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);

(完)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航