用什么函数能够得到Unicode字符串的宽度(我是指以象素为单位)?

d4fan 2001-08-01 12:46:04
先谢了
...全文
414 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cmpp 2002-01-17
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/TopicView.asp?id=477598
xiaoxiaohan 2001-12-27
  • 打赏
  • 举报
回复
Unicode :宽字节字符集
1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数?
可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。
调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。
2. 如何对DBCS(双字节字符集)字符串进行操作?
函数 描述
PTSTR CharNext ( LPCTSTR ); 返回字符串中下一个字符的地址
PTSTR CharPrev ( LPCTSTR, LPCTSTR ); 返回字符串中上一个字符的地址
BOOL IsDBCSLeadByte( BYTE ); 如果该字节是DBCS字符的第一个字节,则返回非0值
3. 为什么要使用Unicode?
(1) 可以很容易地在不同语言之间进行数据交换。
(2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。
(3) 提高应用程序的运行效率。
Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。
Windows CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI Windows函数
Windows 98 只支持ANSI,只能为ANSI开发应用程序。
Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串。
4. 如何编写Unicode源代码?
Microsoft公司为Unicode设计了WindowsAPI,这样,可以尽量减少代码的影响。实际上,可以编写单个源代码文件,以便使用或者不使用Unicode来对它进行编译。只需要定义两个宏(UNICODE和_UNICODE),就可以修改然后重新编译该源文件。
_UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。
5. Windows定义的Unicode数据类型有哪些?
数据类型 说明
WCHAR Unicode字符
PWSTR 指向Unicode字符串的指针
PCWSTR 指向一个恒定的Unicode字符串的指针
对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。
6. 如何对Unicode进行操作?
字符集 特性 实例
ANSI 操作函数以str开头 strcpy
Unicode 操作函数以wcs开头 wcscpy
MBCS 操作函数以_mbs开头 _mbscpy
ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)
ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)
所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。Windows会如下定义:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
7. 如何表示Unicode字符串常量?
字符集 实例
ANSI “string”
Unicode L“string”
ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J’) ){ }
8. 为什么应当尽量使用操作系统函数?
这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。由于这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入RAM。
如:StrCat,StrChr,StrCmp和StrCpy等。
9. 如何编写符合ANSI和Unicode的应用程序?
(1) 将文本串视为字符数组,而不是chars数组或字节数组。
(2) 将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串。
(3) 将显式数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存。
(4) 将TEXT宏用于原义字符和字符串。
(5) 执行全局性替换(例如用PTSTR替换PSTR)。
(6) 修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小,而不是字节。这意味着不应该传递sizeof(szBuffer),而应该传递(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来分配内存。这就是说,应该调用malloc(nCharacters *sizeof(TCHAR)),而不是调用malloc(nCharacters)。
10. 如何对字符串进行有选择的比较?
通过调用CompareString来实现。
标志 含义
NORM_IGNORECASE 忽略字母的大小写
NORM_IGNOREKANATYPE 不区分平假名与片假名字符
NORM_IGNORENONSPACE 忽略无间隔字符
NORM_IGNORESYMBOLS 忽略符号
NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字符
SORT_STRINGSORT 将标点符号作为普通符号来处理
11. 如何判断一个文本文件是ANSI还是Unicode?
判断如果文本文件的开头两个字节是0xFF和0xFE,那么就是Unicode,否则是ANSI。
12. 如何判断一段字符串是ANSI还是Unicode?
用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此 IsTextUnicode有可能返回不正确的结果。
13. 如何在Unicode与ANSI之间转换字符串?
Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。
d4fan 2001-08-01
  • 打赏
  • 举报
回复
BOOL GetTextExtentExPoint(
HDC hdc, // handle to DC
LPCTSTR lpszStr, // character string
int cchString, // number of characters
int nMaxExtent, // maximum width of formatted string
LPINT lpnFit, // maximum number of characters
LPINT alpDx, // array of partial string widths
LPSIZE lpSize // string dimensions
);
我用的时候,lpnFit和alpDx返回的值都不对,我不知为什么?
谁能给个例子看看。

我定义了一个TCHAR类型的变量,其中含有中文,
如果用GetTextExtentPoint32的话,
其中的参数cbString,是应该怎么计算。
linjian19810625 2001-08-01
  • 打赏
  • 举报
回复
GetTextExtentExPoint
linjian19810625 2001-08-01
  • 打赏
  • 举报
回复
SysStringLen好想可以
wcslen你都试试
vcsongs 2001-08-01
  • 打赏
  • 举报
回复
在这方面MFC只是给API做一个简单的warpper...

看看 DrawText 指定DT_CALCRECT
相关的:GetOutputTextExtend...
d4fan 2001-08-01
  • 打赏
  • 举报
回复
不用mfc行不行?
Semigod 2001-08-01
  • 打赏
  • 举报
回复
CDC中就有一个测量要显示字符的宽度的函数
6、Java源程序在转换为机器语言执行过程中既有编译也有解释。 ( ) 7、// 是java的多行注释符。 ( ) 面向对象 3.Java 仅支持类间的单重继承。 ( ) 17.方法可以没有返回值,或有一个返回值,也可以有多个返回值。( ) 5.一个类的定义包括定义类头和定义类体两个部分。( ) 7.类的私有属性和私有方法可以被其子类访问。( ) 13.子类不能继承父类的构造函数。( ) 14.重载的方法可以通过它们的返回值类型的不同来区分。( ) 16.在 Applet 的坐标系中,(0,0) 代表输出窗口左上角的象素点。( ) 18.构造函数的方法名可由编程人员任意命名。( ) 19.构造函数能继承,也能被重载。( ) 20.类的构造函数名必须和类名相同。( ) 1、Java中所有的类都是java.lang.Object类的直接或间接子类。 ( ) 5、只有抽象类或接口中才能包含抽象方法。 ( ) 9、两个类同在一个包中,那么在一个类可以访问另一个类的private成员变量。 ( ) 10、方法形式参数的作用域是该方法的方法体。 ( ) 8、两个类同在一个包中,那么在一个类可以访问另一个类的private成员变量。( ) 10、方法形式参数的作用域是该方法的方法体。 ( ) 1、String abc[ ];是合法的Java语句。 ( ) 2、在Java里,允许多重继承。 ( ) 3、在Java语言里,do-while语句是先执行循环体,然后再判断的循环条件。 ( ) 4、只有抽象类或接口中才能包含抽象方法。       ( ) 其他 8、StringBuffer类的对象包含的字符串不可以被修改。 ( ) 8.字符串 ”\’a\’” 的长度是5。( ) 9.Java 支持多线程机制。( ) 填空题 17.Java中的的字符使用( )编码unicode 18. 在Java语言中,将源代码翻译成____________时产生的错误称为编译错误,而将程序在运行中产生的错误称为运行错误。字节码 13. Java语言中的浮点型数据根据数据存储长度和数值精度的不同,进一步分为哪两种具体类型,各占二进制的多少位? 16.字符串 ”\’a\’” 的长度是( )3 13. float 32位、double 64位 24.表达式2*5/2.5、1.0/2*5、1/2*3、5/3的计算结果分别是_________。 25.当整型变量n的值不能被13除尽时,其值为 false 的Java语言表达式是_______ 。 26.执行以下程序段后:x = ________, y = ________ 。 int x = 5, y=5; y = ++x * - -y; 29. 关系运算的运算结果应是( )类型 30. 逻辑运算的运算对象应是( )类型,运算结果应是( )类型 33.下面的语句是声明一个逻辑变量并赋值,请将它补充完整: ______ b1=5!=6; 逻辑变量b1的取值是______。 34.下面的语句是声明某类型变量s,并通过三目条件运算符的结果给变量s赋值,请将该语句补充完整,s的初值是什么? ______ s=(9999%2= =1) ? ”奇数” : ”偶数”; 24. 4.0; 2.5; 0; 1 25. (n%13= =0 26. 6 ;24 29. boolean型30. boolean型;boolean型 31. 略 33. boolean true 34. String ”奇数” 18.阅读下面的程序段,回答问题。 if ( x < 5 ) System.out.print(" one "); else { if ( y < 5 ) System.out.print(" two "); else System.out.println(" three "); } 问题: 1)若执行前 x=6, y=8,该程序段输出是什么? 2)若执行前 x=1, y=8,该程序段输出是什么? 18. 1)three 2)one 25.下面是一个java应用程序(Application),它的功能是在屏幕上输出26个小写英文字母,其中每个字母相隔一个制表符,请完成程序填空。 public _____ Class1 { public static void main( String args[] ) { char c='a'; for (int i=1;i<=26;i++) { System.out.print(______); } } } 26.下面是一个java应用程序(Application),它的功能是计算 s=1+2+3+...+10 ,请完成程序填空。 public _____ Class1 { public static void main( String args[] ) { int s=0; for (int i=1;i<=10;i++) { s+=______; } System.out.println("s="+s); } } 27.下面是一个java Application 的主类的定义,其功能是输出乘法口诀表第一列,请完成程序填空。 import java.io.*; public class MyClass { public static void main(String[] args) { int j=1; for(int i=1; _______; i++) { System.out.println(i+"*"+j+"="+_______); } } } 25. class (c++)+"\t" 26. class i 27. i<=9 j*i 1.结构化程序设计的三种基本流程控制结构是:_______、_______、________。 10.下面程序的功能是求2 到100 之间的素数,请将程序补充完整。 public class Class1 { public static void main( String args[] ) { Label1: for(int i=2;i<100;i++) { for(int j=2;j

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧