上一篇:位图的淡入淡出显示 >>
根据文本串的长度改变窗口的大小
| 根据文本串的长度改变窗口的大小 | |
| 赵湘宁 | |
|
|
|
|
提出问题:
根据文本文件的内容,用CWin的子类对控制进行动态创建。在Create方法中,根据用户在显示属性对话框中选择的消息文本字体,用下列代码创建所有的控制: 首先应该明确的是所谓显示属性对话框即在桌面单击右键,选择“属性”菜单项,再选择“外观”属性页出现的对话框(图一)。 |
|
|
|
|
|
图一 |
|
|
用户可以在这个对话框中选择活动窗口、消息框以及文字的颜色和字体。你可以调用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); |
|
| (完) |
下一篇:UDP轻松应用 >>
相关文章:
- · TCP/IP学习笔记补遗
- · 如何通过Openh323开发自己的H.323协议栈
- · MSComm 控件的 Modem 通讯
- · 通过串口收发短消息(下)
- · 通过串口收发短消息(上)
- · 通过串口实时接收短消息
- · “通过串口收发短消息”的Q&A汇编
- · 使用Win32创建串口通讯程序
- · Windows2000下的Raw TCP/IP库
- · 一个简单的端口扫描程序题
- · 利用RFC868协议编写网络对时程序
- · TCP/IP学习笔记(八)
- · TCP/IP学习笔记(七)
- · TCP/IP学习笔记(六)
- · TCP/IP学习笔记(五)
- · TCP/IP学习笔记(四)
- · TCP/IP学习笔记(三)
- · 如何获取MSN Messenger的联系人列表?
- · TCP/IP学习笔记(二)
- · TCP/IP学习笔记(一)
- · WinSock学习笔记(二)
- · WinSock学习笔记(一)
- · 探测远程主机操作系统指纹的全新技术
- · C/S模式考试程序制作详解
- · 运行于以太网的基础协议
- · 基于IP/UDP协议的 sock 编程
- · 用原始套接字实现网络监听
- · 使用 Http 在线自动升级程序
- · 远程网页的查看
- · 用UDP协议实现广播通信
- · (RFC1929)SOCKS V5的用户名/密码鉴定
- · 不重起Windows直接更改IP地址
- · 实例解析IPv6环境下的网络编程
- · 无进程DLL木马的又一开发思路与实现
- · 浅析三线程程序开发思路与实现
- · Windows下DNS ID欺骗的原理与实现
- · 使用CFtpFileFind和递归算法来遍历ftp目录
- · 使用ICMP实现路由跟踪
