《windows程序设计》第二章学习心得
来源:互联网 发布:文件服务器软件 编辑:程序博客网 时间:2024/05/18 00:10
Unicode简介
Unicode是ASCII字符编码的一个扩展。Unicode用的是16位字符编码,而不是像ASCII那样的7位编码。
---------------------------------------------------------------------------------------------------------------------------------------------
C语言中宽字符是基于wchar_t数据类型的。
typedef unsigned short wchar_t;
wchar_t c = 'A';等同于wchar_t c = L'A';
---------------------------------------------------------------------------------------------------------------------------------------------
wchar_t str[1000] = {0};
wcscpy(str, L"Hello");
wcscpy(str, TEXT("Hello"));
C++标准库函数提供了字符和字符串的操作函数,并提供了其UNICODE版本,如:
char *strcpy(char *strDestination, const char *strSource);
wchar_t *wcscpy(wchar_t *strDestination, const wchar_t *strSource); wcscpy()即为strcpy()的宽字符版本,与_T类似的,Visual C++提供了类似的同名函数:
#ifdef UNICODE
#define _tcscpy wcscpy
#else
#define _tcscpy strcpy
#endif
_tcscpy
在编译时会根据条件被替换,
如果是 非UNICODE 工程,它就被替换为 strcpy
UNICODE 工程被替换为 wcscpy
宽字符的输出问题:
wchar_t str[] = L"qwe123";
C语言输出:wprintf(L"%s\n", str);
C++输出:wcout << str << endl;
相比如果输出汉字的话:
wchar_t str[] = L"哇哈哈";setlocale(LC_ALL, "");wcout << str << endl;wprintf(L"%s\n", str);
需要本地化函数输出。
char
*
setlocale
(
int
category,
const
char
* locale);
category:为locale分类,表达一种locale的领域方面,通常有下面这些预定义常量:LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、LC_MONETARY、LC_NUMERIC、LC_TIME,其中 LC_ALL 表示所有其它locale分类的并集。
locale:为期望设定的locale名称字符串,在Linux/Unix环境下,通常以下面格式表示locale名称:language[_territory][.codeset][@modifier],language 为 ISO 639 中规定的语言代码,territory 为 ISO 3166 中规定的国家/地区代码,codeset 为字符集名称。
C 和 C++ 的标准库分别有自己的 locale 操作方法,C 标准库的 locale 设定函数是 setlocale(),而 C++ 标准库有 locale 类和流对象的 imbue() 方法。
-----------------------------------------------------------------------------------------------------------------------------------------------------
在使用宽字符的时候,字符串的字符长度并没有改变,改变的只是字节的长度。
#include <iostream>#include <cstdlib>using namespace std;int main(){wchar_t str[] = L"12345";cout << "sizeof(str) = " << sizeof(str) << endl;cout << "sizeof(wcslen) = " << wcslen(str) << endl;return 0;}输出:
sizeof(str) = 12
sizeof(wcslen) = 5
请按任意键继续. . .
-------------------------------------------------------------------------------------------------------------------------------------------------------
学习过程中,出现了MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
出现这个的原因是:
我接着使用了先前编辑windowsGUI程序使用的入口还是WinMain,而此时是W32控制台程序,没有进行转化。
解决方案见:http://blog.csdn.net/lgh1992314/article/details/8701358
MessageBox的使用:
VS2010下默认是UNICODE编码,所以进行MessageBox输出的时候得注意编码方式。
1、我们可以强制使用ANSI编码方式,即MessageBoxA。
#include <windows.h>#include <stdio.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){char str[1024] = {0};sprintf(str, "%s","12345");MessageBoxA(NULL, str, str, 0);return 0;}
2、使用UNICODE编码,注意user32.dll里并没有MessageBox的入口点,仅仅是简单的#define MessageBoxW MessageBox
#include <windows.h>#include <stdio.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){wchar_t str[1024] = {0};wsprintf(str, L"%s",L"哇哈啊哈");MessageBox(NULL, str, str, 0);return 0;}-------------------------------------------------------------------------------------------------------------------------------------------
如何定义UNICODE标识符?
UNICODE标识符的定义要在所有源文件之上,当然包括windows.h,加上一句 #define UNICODE
--------------------------------------------------------------------------------------------------------------------------------------------
在windows程序中不能使用cin、cout、scanf等标准输入输出函数。
------------------------------------------------------------------------------------------------------------------------------
格式化的消息框-----显示视频显示器的宽度和高度。
#include <windows.h>#include <stdio.h>#include <tchar.h>int CDECL MessageBoxPrintf(TCHAR *szCaption, TCHAR *szFormat, ...){TCHAR szBuffer [1024];va_list pArgList;va_start(pArgList, szFormat);_vsntprintf(szBuffer, sizeof(szBuffer)/sizeof(TCHAR), szFormat, pArgList);va_end(pArgList);return MessageBox(NULL, LPWSTR(szBuffer), LPWSTR(szCaption), 0);}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE PrevInstance, LPSTR lpCmdLine, int iCmdShow){int cxScreen, cyScreen;cxScreen = GetSystemMetrics(SM_CXSCREEN);cyScreen = GetSystemMetrics(SM_CYSCREEN);MessageBoxPrintf(TEXT("Screen"), TEXT("The screen is %i pixels wide by %i pixels high."), cxScreen, cyScreen);}
显示效果:
- 《windows程序设计》第二章学习心得
- 《windows程序设计》第三章学习心得
- 《windows程序设计》第一章学习心得
- windows 程序设计 第二章 (上)
- windows程序设计第二章学习笔记
- Windows程序设计第二章《Unicode》要点摘要
- 读《Windows程序设计》笔记 第二章
- 《Windows程序设计》第二章 Unicode简介
- [学习笔记]Windows程序设计:第二章 UNICODE
- windows程序设计第二章-Unicode简介
- windows 程序设计 第二章(下)
- windows程序设计:第二章:Unicode简介
- essential C++第二章学习心得
- 发一个《windows程序设计》里面的源程序第二章
- MFC Windows 程序设计 第二章 在窗口中绘图
- Windows程序设计-王艳平.pdf==> 第二章
- 第二章 Shell程序设计
- 第二章 Shell程序设计
- windbg调试心得
- javascript 高亮關鍵字
- 隐藏 XviD Status的窗口
- Hdu 3215 The first place of 2^n (对数)
- Class.isAssignableFrom与 instanceof 区别
- 《windows程序设计》第二章学习心得
- OpenCv与Qt的结合
- 二叉树的非递归遍历-----2013年3月20日
- 何去何从
- 面试100题系列之10关于删除多余空格的再思考
- java 判断类和实例的关系(instanceof,isInstance,isAssignableFrom)
- android手机删除自带的rom软件
- Hibernate的数据库方言错误值
- POJ2140:Herd Sums