VC++常用函数

上传人:1777****777 文档编号:37225678 上传时间:2021-11-02 格式:DOC 页数:85 大小:333KB
收藏 版权申诉 举报 下载
VC++常用函数_第1页
第1页 / 共85页
VC++常用函数_第2页
第2页 / 共85页
VC++常用函数_第3页
第3页 / 共85页
资源描述:

《VC++常用函数》由会员分享,可在线阅读,更多相关《VC++常用函数(85页珍藏版)》请在装配图网上搜索。

1、itoa(num, str, 10);printf(The number num is %d and the string str is %s. n ,num, str);itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是要写入转换结果的目标字符串,第三个参数是转移数字时所用的基数。在上例中,转换基数为10。10:十进制;2:二进制.CWnd*和HWND差别很大 HWND是SDK 定义的类型,是一个无确切意义的32-bit值,在调用 API 时用于指代窗体。 CWnd*是一个有确切意义的指针,指向一个MFC窗体类CWnd 的实例。因为 MFC对SDK做了封装,大部分调用都可以用

2、CWnd*作为参数,所以很容易混淆。从一个CWnd*获取句柄的方法是 pWnd-GetSafeHwnd(),他比pWnd-m_hWnd 安全,因为前者在 pWnd = NULL 的时候返回 NULL 而后者出现 access violation 从hWnd转换到CWnd * 一个可以使用的方法是 CWnd:FromHandle CWnd *pTempWnd = CWnd:FromHandle(hWnd); / 如果 hWnd存在对应的CWnd*,则返回其指针,否则,创建一个 MFC 临时窗体并返回其指针。 注意这个函数会返回临时窗体的指针,如果需要更安全,调用 CWnd:FromHandleP

3、ermanent ,他在不存在对应的CWnd*时返回NULL。 GetDlgItem CWnd:GetDlgItem 是CWnd的成员函数,如果在CWnd派生的类中使用,可直接使用 CWnd* pWnd = GetDlgItem(ID_XXX); 否则,用SDK函数 HWND GetDlgItem( HWND hDlg, int nIDDlgItem);这样用: HWND hWnd; :GetDlgItem(hWnd,ID_XXX); CWnd* pWnd=CWnd:FromHandle(hWnd);/或创建一个CWnd对象Attach上去CComboBox *myBox1 = (CCombo

4、Box *)GetDlgItem(IDC_COM_PORT);/myBox-SetTopIndex(1);myBox1-SetCurSel(0);CComboBox *myBox2 = (CComboBox *)GetDlgItem(IDC_COM_BAUD);myBox2-SetCurSel(1);CEdit* output;/首先获得CEdit控件的指针, output=(CEdit*) GetDlgItem(IDC_EDIT1); /添加显示内容 output-SetWindowText(m_sShowText);上面就是通过GetDlgItem获得指向Edit控件的指针GetDlgIt

5、emText函数里面的个参数:第一个是句柄API都得通过句柄操作,如果在MFC中,本项可以不写,默认为this第二个为ID,即你想要得到那个控件的ID第三个为TEXT值,你得先定义一个字符串用来获取该值第四个为文本最大长度例如得到IDC_BUTTON1的caption:CStringsCaption;GetDlgItemText(IDC_BUTTON1,sCaption);函数功能:该函数获取对话框中与控制有关的文本或标题。函数原型:UINT GetDlgltemText(HWND hDlg,int nlDDlltem,LPTSTR IpString int nMazCount);参数: hD

6、lg:指向含有控制的对话框的句柄。 nlDDlgltem:指定标题或文本将被检索的控制的标识符。 IpString:指向获取标题或文本的缓冲器的指针。 nMaxCount:指定被复制到lpString参数指向的缓冲区的字符串的最大长度。如果字符串的字符最大长度超过范围,则该字符串被截断。 返回值:如果函数调用成功,则返回值表示被复制缓冲区的字符串的长度,不包括以NULL结尾的字符串。如果函数调用失败,则返回值为零。若想获得更多错误信息,请调用GetLastError函数。 备注: GetDlgltemText函数把一个WM_GETTEXT消息发送到控制。串口通讯中的DCB结构typedef s

7、truct _DCB/ dcb DWORD DCBlength; / sizeof(DCB) DWORD BaudRate; / current baud rate/ 指定当前的波特率 DWORD fBinary: 1; / binary mode, no EOF check/ 指定是否允许二进制模式,/ WINDOWS 95中必须为TRUE DWORD fParity: 1; / enable parity checking/ 指定奇偶校验是否允许 DWORD fOutxCtsFlow:1; / CTS output flow control/ 指定CTS是否用于检测发送控制。/ 当为TRU

8、E是CTS为OFF,发送将被挂起。 DWORD fOutxDsrFlow:1; / DSR output flow control/ 指定CTS是否用于检测发送控制。/ 当为TRUE是CTS为OFF,发送将被挂起。 DWORD fDtrControl:2; / DTR flow control type/ DTR_CONTROL_DISABLE值将DTR置为OFF, DTR_CONTROL_ENABLE值将DTR置为ON, DTR_CONTROL_HANDSHAKE允许DTR握手,DWORD fDsrSensitivity:1; / DSR sensitivity 当该值为TRUE时DSR为O

9、FF时接收的字节被忽略; DWORD fTXContinueOnXoff:1; / XOFF continues Tx/ 指定当接收缓冲区已满,并且驱动程序已经发/ 送出XoffChar字符时发送是否停止。/ TRUE时,在接收缓冲区接收到缓冲区已满的字节XoffLim且驱动程序已经发送出XoffChar字符中止接收字节之后,发送继续进行。/ FALSE时,在接收缓冲区接收到代表缓冲区已空的字节XonChar且驱动程序已经发送出恢复发送的XonChar之后,发送继续进行。 DWORD fOutX: 1; / XON/XOFF out flow control/ TRUE时,接收到XoffCha

10、r之后便停止发送/ 接收到XonChar之后将重新开始 DWORD fInX: 1; / XON/XOFF in flow control/ TRUE时,接收缓冲区接收到代表缓冲区满的XoffLim之后,XoffChar发送出去/ 接收缓冲区接收到代表缓冲区空的XonLim之后,XonChar发送出去 DWORD fErrorChar: 1; / enable error replacement/ 该值为TRUE且fParity为TRUE时,用ErrorChar 成员指定的字符代替奇偶校验错误的接收字符 DWORD fNull: 1; / enable null stripping/ TRUE

11、时,接收时去掉空(0值)字节 DWORD fRtsControl:2; / RTS flow control RTS_CONTROL_DISABLE时,RTS置为OFF RTS_CONTROL_ENABLE时, RTS置为ON RTS_CONTROL_HANDSHAKE时,/ 当接收缓冲区小于半满时RTS为ON/ 当接收缓冲区超过四分之三满时RTS为OFF RTS_CONTROL_TOGGLE时,/ 当接收缓冲区仍有剩余字节时RTS为ON ,否则缺省为OFF DWORD fAbortOnError:1; / abort reads/writes on error/ TRUE时,有错误发生时中止

12、读和写操作 DWORD fDummy2:17; / reserved/ 未使用 WORD wReserved; / not currently used/ 未使用,必须为0 WORD XonLim; / transmit XON thresholdCOMMTIMEOUTSCOMMTIMEOUTS 结构体被用在SetCommTimeouts和GetCommTimeouts 函数中,以便设置和查询通讯设备的超时参数。这个参数决定ReadFile, WriteFile, ReadFileEx, 和WriteFileEx 操作设备的行为。typedef struct _COMMTIMEOUTS DWO

13、RD ReadIntervalTimeout; DWORD ReadTotalTimeoutMultiplier; DWORD ReadTotalTimeoutConstant; DWORD WriteTotalTimeoutMultiplier; DWORDWriteTotalTimeoutConstant; COMMTIMEOUTS, *LPCOMMTIMEOUTS;成员ReadIntervalTimeout 在通讯过程中接收两个字符之间的最长超时时间,按毫秒计算。在ReadFile操作,当接收到第一个字符时,开始一个计时周期。如果接收任意两个字符之间的时隔超过本限制,ReadFile操作

14、将完成并返回任何已缓冲的数据。0代表本参数未设置。 如果设置为MAXDWORD, 并且ReadTotalTimeoutConstant和ReadTotalTimeoutMultiplier成员为0,代表读取操作立即返回那些已接收的数据,即使没有收到任何字符。(两个字符之间的接收间隔)ReadTotalTimeoutMultiplier 乘数用于计算读取操作的总超时时间,按毫秒计算。对于每个读取操作,这个值将乘以要读取的字节数。(读取单个字符的最大超时)ReadTotalTimeoutConstant 一个用于计算对于读取操作的总超时周期的常数,按毫秒计算。对每次读取操作,实际总超时时间为Rea

15、dTotalTimeoutMultiplier 成员与请求的字节数年的乘积加此值。ReadTotalTimeoutMultiplier和ReadTotalTimeoutConstant成员为0代表总读取总超时时间无效(读取所有字节的时间为ReadTotalTimeoutMultiplier*BytesToRead+ReadTotalTimeoutConstant)。WriteTotalTimeoutMultiplier 乘数用来计算写操作的总超时周期,按毫秒计算。对每个写操作,这个值将乘以要写入的字节数。(写单个字符的最大超时) WriteTotalTimeoutConstant 一个用于计算

16、写入操作的总超时周期的常数,按毫秒计算。对于每一次写入操作,实际总超时时间为WriteTotalTimeoutMultiplier 成员与要写入字节的乘积再加此值. WriteTotalTimeoutMultiplier和WriteTotalTimeoutConstant成员为0代表总写入时间无效(写入所有字节的时间为WriteTotalTimeoutMultiplier*BytesToWrite+WriteTotalTimeoutConstant)。备注如果一个应用程序设置ReadIntervalTimeout和ReadTotalTimeoutMultiplier为 MAXDWORD并且设置

17、ReadTotalTimeoutConstant 为一个大于零且小于MAXDWORD的值, 在调用ReadFile时将会发生如下现象: 如果在输入缓冲区中有任何字符,ReadFile 立即返回缓冲区中的内容。 如果在缓冲区中没有任何字符,ReadFile 将等待接收到一个字符并立即返回. 如果在ReadTotalTimeoutConstant指定的时间值内无任何字节返回,ReadFile超时.wsprintf在C语言中格式化字符串可以使用printf,但是在WINDOWS编程设计中却行不通了,但是却有变通的方法,那就是用 wsprintf这个函数 它的格式如下:wsprintf(缓冲区,格式,

18、要格式化的值);第一个参数是字符缓冲区,后面是格式字符串,wsprintf不是将格式化结果写到标准输出,而是将其写入缓冲区中,该函数返回该字符串的长度。比如我们想通过MessageBox来输出一个整形变量的值,可以用以下代码实现:char szBuffer100;ing number=100;wsprintf(szBuffer, “%d”,number);MessgaeBox(NULL,szBrffer,TEXT(“格式化字符串”),0);这个函数除了将内容格式化输出到第一个参数所提供的字符串缓冲区以外,其它功能与printf函数相同wsprintf对应的字符串是宽字符型wchar_t,即一个

19、字符占用2个字节的内存空间.sprintf对应的字符串是字符类型为char,几一个字符占用1个字节的内存空间.sprintf是用于对ASCII码的127个字符进行操作,wsprintf是对UNICODE的多语言字符进行操作.如:sprintf(buffer, ascii);wsprintf(buffer, Lunicode);一、总结UpdateData()函数UpdateData(true);/用于将屏幕上控件中的数据交换到变量中。UpdateData(false);/用于将数据在屏幕中对应控件中显示出来。 当你使用了ClassWizard建立了控件和变量之间的联系后:当你修改了变量的值,而

20、希望对话框控件更新显示,就应该在修改变量后调用UpdateData(FALSE);如果你希望知道用户在对话框中到底输入了什么,就应该在访问变量前调用UpdateData(TRUE)。如何把CString转换为char*?需要使用的是strcpy函数 譬如: char buffer100;/标准的数组 GetDlgItem(IDC_EDIT1)-GetWindowText(buffer, 99); 如果不要求数组的话,可以使用: CString str; GetDlgItem(IDC_EDIT1)-GetWindowText(str); char buf = malloc(strlen(str)

21、 + 1); strcpy(buf, str);memset 原型:extern void *memset(void *buffer, int c, int count); 用法:#include 功能:把buffer所指内存区域的前count个字节设置成字符c。 说明:返回指向buffer的指针。 举例: / memset.c #include #include main() char *s=Golden Global View; clrscr(); memset(s,G,6); printf(%s,s); getchar(); return 0; memset ,memcpy 和strcp

22、y 区别 strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include 功能:把src所指由NULL结束的字符串复制到dest所指的数组中。说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。memcpy 原型:extern void *memcpy(void *dest, void *src, unsigned int count);用法:#include 功能:由src所指内存区域复制count个字节到dest所指内存区域。说明:src和dest所指内存区域

23、不能重叠,函数返回指向dest的指针。memset原型:extern void *memset(void *buffer, int c, int count);用法:#include 功能:把buffer所指内存区域的前count个字节设置成字符c。说明:返回指向buffer的指针。memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为 或0;例:char a100;memset(a, 0, sizeof(a); memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a100,b50; memcpy(b, a, siz

24、eof(b);注意如用sizeof(a),会造成b的内存地址溢出。 strcpy就只能拷贝字符串了,它遇到0就结束拷贝;例:char a100,b50;strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个0之前)是否超过50位,如超过,则会造成b的内存地址溢出。memset可以方便的清空一个结构类型的变量或数组。 如:struct sample_structchar csName16;int iSeq;int iType; 对于变量struct sample_strcut stTest; 一般情况下,清空stTest的方法:stTest.csName0=0;stT

25、est.iSeq=0;stTest.iType=0; 用memset就非常方便:memset(&stTest,0,sizeof(struct sample_struct); 如果是数组:struct sample_struct TEST10;则memset(TEST,0,sizeof(struct sample_struct)*10);怎样把char类型转换成两个bytechar a=a; string s=Convert.ToString(a); byte b=System.Text.Encoding.Unicode.GetBytes(s); m_ShowInfor.SetSel(-1, -

26、1);/选择最末尾。 m_ShowInfor.SetSel(0, -1);/选择全部 下列CWnd或CEdit类的成员函数可用来修改编辑框控件。void SetWindowText( LPCTSTR lpszString );CWnd的成员函数,可用来设置窗口的标题或控件中的正文。参数lpszString可以是一个CString对象,或是一个指向字符串的指针。void SetSel( DWORD dwSelection, BOOL bNoScroll = FALSE );void SetSel( int nStartChar, int nEndChar, BOOL bNoScroll = FA

27、LSE );CEdit的成员函数,用来选择编辑框中的正文。参数dwSelection的低位字说明了选择开始处的字符索引,高位字说明了选择结束处的字符索引。如果低位字为0且高位字节为-1,那么就选择所有的正文,如果低位字节为-1,则取消所有的选择参数bNoScroll的值如果是FALSE,则滚动插入符并使之可见,否则就不滚动参数nStartChar和nEndChar的含义与参数dwSelection的低位字和高位字相同void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo = FALSE );CEdit的成员函数,用来将所选正文替换成指定的正文参数

28、lpszNewText指向用来替换的字符串参数bCanUndo的值为TRUE说明替换是否可以被撤消的在调用上述函数时,如果涉及的是一个多行编辑框,那么除了LineLength和GetLine函数外,都要把回车和换行符考虑在内例如,假设在编辑框中有如下几行正文:abcdefgij那么字母e的字符索引是6而不是4,因为abcd后面还有一对回车换行符调用LineLength(7)会返回第二行的长度3调用LineIndex(2)会得到11调用LineFromChar(8)会返回1如果没有选择任何正文,并且插入符在字母e上,那么调用GetSel返回值的低位和高位字都是6通过分析上述函数,我们可以总结出一

29、些查询和设置编辑框的方法调用CWnd的成员函数GetWindowText和SetWindowText可以查询和设置编辑框的整个正文,在上一章的Register程序中,我们就使用过这两个函数如果想对多行编辑框逐行查询,那么应该先调用GetLineCount获得总行数,然后再调用GetLine来获取每一行的正文下面一段代码演示了如何对多行编辑框进行逐行查询char buf40;int total=MyEdit.GetLineCount();int i,length;for(i=0;ilength=MyEdit.GetLine(i,buf,39);buflength=0; /加字符串结束符. . .

30、 . . .可以利用LineIndex和LineFromChar来在字符索引和字符的行列坐标之间相互转换下列代码演示了在已知字符索引的情况下,如何获得对应的行列坐标:int row,column;row=MyEdit.LineFromChar(charIndex);column=charIndex-MyEdit.LineIndex(row);下列代码演示了在已知字符的行列坐标的情况下,如何获得对应的字符索引:int charIndex;charIndex=MyEdit.LineIndex(row)+column;不难看出字符索引与对应的行列坐标的关系是:字符索引=LineIndex(行坐标)+

31、列坐标对于选择正文的查询和设置,应该利用函数GetSel、SetSel和ReplaceSel可以利用GetSel和SetSel来查询和设置插入符的位置SetSel可以使编辑框滚动到插入符的新位置要获取插入符的行列坐标,可用下面的代码实现:MyEdit.SetSel(-1,0); /取消正文的选择int start,end,row,column;MyEdit.GetSel(start,end); /start或end的值就是插入符的字符索引row=MyEdit.LineFromChar(start); /获取插入符的行坐标column=start-MyEdit.LineIndex(row); /

32、获取插入符的列坐标下面的代码演示了如何把插入符移到指定的行和列:MyEdit.SetSel(-1,0); /取消正文的选择int charIndex=MyEdit.LineIndex(row)+column;MyEdit.SetSel(charIndex,charIndex);可以利用ReplaceSel函数在 插入符处插入正文,典型的代码如下所示:MyEdit.SetSel(-1,0); /取消正文的选择MyEdit.ReplaceSel(“.”);可以利用ReplaceSel清除编辑框中的正文,典型的代码如下所示:MyEdit.SetSel(0,-1); /选择全部正文MyEdit.Rep

33、laceSel(“”);int、char、double与byte相互转换的程序/整数到字节数组的转换public static byte intToByte(int number) int temp = number;byte b=new byte4;for (int i=b.length-1;i-1;i-)bi = new Integer(temp&0xff).bytevalue();/将最高位保存在最低位temp = temp 8; /向右移8位return b; /字节数组到整数的转换public static int byteToInt(byte b) int s = 0;for (i

34、nt i = 0; i = 0)s = s + bi;elses = s + 256 + bi;s = s * 256;if (b3 = 0) /最后一个之所以不乘,是因为可能会溢出s = s + b3;elses = s + 256 + b3;return s; /字符到字节转换public static byte charToByte(char ch)int temp=(int)ch; bitsCN.nET中国网管博客 byte b=new byte2;for (int i=b.length-1;i-1;i-)bi = new Integer(temp&0xff).bytevalue();

35、/将最高位保存在最低位temp = temp 8; /向右移8位return b; /字节到字符转换public static char byteToChar(byte b)int s=0;if(b00)s+=b0;elses+=256+b0;s*=256;if(b10)s+=b1;elses+=256+b1;char ch=(char)s;return ch; /浮点到字节转换public static byte doubleToByte(double d)byte b=new byte8;long l=Double.doubleToLongBits(d);for(int i=0;i8;re

36、turn b; /字节到浮点转换public static double byteToDouble(byte b) 中国网管论坛 long l; l=b0;l&=0xff;l|=(long)b18);l&=0xffff;l|=(long)b216);l&=0xffffff;l|=(long)b324);l&=0xffffffffl;l|=(long)b432);l&=0xffffffffffl; l|=(long)b540);l&=0xffffffffffffl;l|=(long)b648);l|=(long)b756);return Double.longBitsToDouble(l); V

37、C常用数据类型使用转换详解 (加入时间:2001-3-12) 作者:程佩君 刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。 我们先定义一些常见类型变量借以说明 int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username=女侠程佩君; char temp200; char *buf; CString str; _variant_t v1; _bstr_t v2; 一、其它数据类型转换为字符串 短整型(int) itoa(i,temp,10);/将i转换为字符

38、串放入temp中,最后一个数字表示十进制 itoa(i,temp,2); /按二进制方式转换 长整型(long) ltoa(l,temp,10); 二、从其它包含字符串的变量中获取指向该字符串的指针 CString变量 str = 2008北京奥运; buf = (LPSTR)(LPCTSTR)str; BSTR类型的_variant_t变量 v1 = (_bstr_t)程序员; buf = _com_util:ConvertBSTRToString(_bstr_t)v1); 三、字符串转换为其它数据类型 strcpy(temp,123); 短整型(int) i = atoi(temp); 长

39、整型(long) l = atol(temp); 浮点(double) d = atof(temp); 四、其它数据类型转换到CString 使用CString的成员函数Format来转换,例如: 整数(int) str.Format(%d,i); 浮点数(float) str.Format(%f,i); 字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值 str = username; 五、BSTR、_bstr_t与CComBSTR CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。 char *转换到BSTR可以这样: B

40、STR b=_com_util:ConvertStringToBSTR(数据);/使用前需要加上头文件comutil.h 反之可以使用char *p=_com_util:ConvertBSTRToString(b); 六、VARIANT 、_variant_t 与 COleVariant VARIANT的结构可以参考头文件VC98IncludeOAIDL.H中关于结构体tagVARIANT的定义。 对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子: VARIANT va; int a=2001; va.vt=VT_I4;/指明整型数

41、据 va.lVal=a; /赋值 对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系: unsigned char bVal; VT_UI1 short iVal; VT_I2 long lVal; VT_I4 float fltVal; VT_R4 double dblVal; VT_R8 VARIANT_BOOL boolVal; VT_BOOL SCODE scode; VT_ERROR CY cyVal; VT_CY DATE da

42、te; VT_DATE BSTR bstrVal; VT_BSTR IUnknown FAR* punkVal; VT_UNKNOWN IDispatch FAR* pdispVal; VT_DISPATCH SAFEARRAY FAR* parray; VT_ARRAY|* unsigned char FAR* pbVal; VT_BYREF|VT_UI1 short FAR* piVal; VT_BYREF|VT_I2 long FAR* plVal; VT_BYREF|VT_I4 float FAR* pfltVal; VT_BYREF|VT_R4 double FAR* pdblVal

43、; VT_BYREF|VT_R8 VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL SCODE FAR* pscode; VT_BYREF|VT_ERROR CY FAR* pcyVal; VT_BYREF|VT_CY DATE FAR* pdate; VT_BYREF|VT_DATE BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATC

44、H SAFEARRAY FAR* FAR* pparray; VT_ARRAY|* VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT void FAR* byref; VT_BYREF _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。 例如: long l=222; ing i=100; _variant_t lVal(l); lVal = (long)i; COleVariant的使用与_variant_t的方法基本一样,请参考如下例子: COleVariant v3 = 字符串, v4 = (lo

45、ng)1999; CString str =(BSTR)v3.pbstrVal; long i = v4.lVal; 七、其它 对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如: LPARAM lParam; WORD loValue = LOWORD(lParam);/取低16位 WORD hiValue = HIWORD(lParam);/取高16位 对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如: WORD wValue; BYTE loValue = LOBYTE(wValu

46、e);/取低8位 BYTE hiValue = HIBYTE(wValue);/取高8位 后记:本文匆匆写成,错误之处在所难免,欢迎来信指正.多字符串向宽字符的转换(MultiByteToWideChar的示例)char buffer4096 = 0;#ifdef _UNICODE/返回所需的短字符数组空间的个数DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, buffer, -1, NULL, 0);wchar_t *pwText;pwText = new wchar_tdwNum;if(!pwText)delete pwText; return;M

47、ultiByteToWideChar (CP_ACP, 0, buffer, -1, pwText, dwNum);/开始转换AfxMessageBox(pwText);/ 输出delete pwText; /使用完毕当然要记得释放占用的内存:#elseAfxMessageBox(buffer);/ 输出#endifwcsncpy与wcscpy的区别测试代码WCHAR wsBuffer20 = 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19;wcsncpy(wsBuffer,LThis is a test!,sizeof(wsBuffer)/

48、2);执行后,在wsBuffer20中,除开This is a test的所有非字符的字节都被清零了。wcscpy(wsBuffer,LThis is a test!);执行后,在wsBuffer20中除开了This is a test的所有非字符的字节,只有字符串尾有个0,其他的都保持不变。wcsncpy(PWCHAR wsBuffer,const PWCHAR wsString,ULONG ulLength)在不出现内存溢出的情况下,功能等效与memset(wsBuffer,0,ulLength*2);wcscpy(wsBuffer,wsString);CString转换为char *若将

49、CString类转换成char*(LPSTR)类型,常常使用下列三种方法:方法一,使用强制转换。例如:CString theString( This is a test );LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString; 方法二,使用strcpy。例如:CString theString( This is a test );LPTSTR lpsz = new TCHARtheString.GetLength()+1;_tcscpy(lpsz, theString); 需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是

50、const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。方法三,使用CString:GetBuffer。例如:CString s(_T(This is a test );LPTSTR p = s.GetBuffer();/ 在这里添加使用p的代码if(p != NULL) *p = _T(0);s.ReleaseBuffer(); / 使用完后及时释放,以便能使用其它的CString成员函数MultiByteToWideChar和WideCharToMultiByte用法详解1.使用方法详解 在本文开始之处,先简要地说一下何为短字

51、符和宽字符. 所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码.而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE.关于windows下的ASCII和UNICODE的更多信息,可以参考这两本经典著作:windows 程序设计,windows 核心编程.这两本书关于这两种字符都有比较详细的解说. 宽字符转换为多个短字符是一个难点,不过我们只要掌握到其中的要领,便可如鱼得水. 好吧,那就让我们开始吧. 这个是我们需要转化的多字节字符串: char sText20 = 多字节字符串!OK!; 我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们

52、可以直接定义一个20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意. 所幸,我们能够确知所需要的数组空间. 我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数: DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0); 接下来,我们只需要分配响应的数组空间: wchar_t *pwText; pwTex

53、t = new wchar_tdwNum; if(!pwText) delete pwText; 接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子: MultiByteToWideChar (CP_ACP, 0, sText, -1, pwText, dwNum); 最后,使用完毕当然要记得释放占用的内存: delete pwText; 同理,宽字符转为多字节字符的代码如下: wchar_t wText20 = L宽字符转换实例!OK!; DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,wText,-1,NULL,0,NULL,

54、FALSE); char *psText; psText = new chardwNum; if(!psText) delete psText; WideCharToMultiByte (CP_OEMCP,NULL,wText,-1,psText,dwNum,NULL,FALSE); delete psText; 如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢? WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装: /- /Description: / This function maps a character

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!