zoukankan      html  css  js  c++  java
  • 《windows程序设计》第二章学习心得

    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);


    需要本地化函数输出。

    charsetlocale(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() 方法。

     locale.h是C程序设计语言标准函数库的一个头文件,声明了C语言本地化函数. 这些函数用于在处理多种自然语言的软件编程设计时,把程序调整到特定的区域设置. 这些区域设置影响到C语言标准库的输入/输出函数.

    -----------------------------------------------------------------------------------------------------------------------------------------------------

    在使用宽字符的时候,字符串的字符长度并没有改变,改变的只是字节的长度。

    #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);
    }
    

    显示效果:



  • 相关阅读:
    liunx centos下tomcat启动 Cannot find ./catalina.sh
    ls -bash: ls: command not found
    Linux CentOS下安装JDK1.7
    查看Linux Centos 系统信息 内核 CPU 系统版本 磁盘 分区 网络配置 进程 命令
    PHP自动捕捉监控致命错误(500错误) error_get_last() 获取最后一次发生错误信息 register_shutdown_function()在脚本停止执行时注册一个回调函数
    CI CodeIgniter 添加公共函数 全局函数 自定义函数
    express框架封装前戏
    怎奈风云多变换,骚完一波还一波,记PHP mongodb驱动的2019年11月用法
    linux ps sample
    利用python pika库实现rabbitmq客户端
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835161.html
Copyright © 2011-2022 走看看