编码类型
多字节编码:
目前市场主流使用的还是多字节编码字符集。
多字节编码字符集,对于不同的字符集,所使用的内存空间大小不同,英文单词使用一个字节,汉字使用2个或者三个字节表示。
这种情况下很有可能会出现解析的时候错位,导致乱码
unicode编码:
unico编码字符集,把所有的字符都使用2个字节。可以有效避免错位的问题
vs环境中的字符
在vs中有两种字符类型,单字节的char和双字节的wchar_t。
当使用wchar_t的字符串字面值的时候,需要用L在字符串前声明,告知编译器字符串使用unicode编译
wchar_t szText = L"hello";
在vs中提供了char和wchar_t的兼容方法
TCHAR 这是一个条件编译的结果
#ifdef UNICODE
typedef WCHAR TCHAR,*PTCHAR
#define _TEXT(quote) L##quote
#else
tyoedef char TCHAR,*PTCHAR
#define _TEXT(quote) quote
#endif
所以,当程序有对UNICODE宏定义,那么使用TCHAR类型的时候,使用的就是UNICODE编码
反之,当程序没有定义UNICODE,那么TCHAR代表的就是char类型
窗口程序
一个完整的窗口类型,由以下几个部分组成
1、窗口程序的入口函数WinMain
2、消息处理函数
3、注册窗口类
4、创建窗口
5、显示窗口
6、消息循环
7、消息处理(也就是消息处理函数)
按照上述过程,给以给出一个最基本的窗口程序的框架
-------------
#include <windows.h>
HINSTANCE g_hInstance;
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) {
return DefWindowProc(hWnd,message,wParam,lParam);
}
void Register(LPSTR lpClassName) {
WNDCLASSEX wec = { 0 };
wec.cbSize = sizeof(wec);
wec.cbClsExtra = 0;
wec.cbWndExtra = 0;
wec.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wec.hCursor = NULL;
wec.hIcon = NULL;
wec.hIconSm = NULL;
wec.hInstance = g_hInstance;
wec.lpfnWndProc = WndProc;
wec.lpszClassName = lpClassName;
wec.lpszMenuName = NULL;
wec.style = CS_HREDRAW | CS_VREDRAW;
RegisterClassEx(&wec);
}
HWND CreateWind(LPSTR lpClassName,LPSTR lpWindowName) {
HWND hWnd = CreateWindowEx(0, lpClassName, lpWindowName, WS_OVERLAPPEDWINDOW, 100, 100, 700, 500, NULL, NULL, g_hInstance, NULL);
return hWnd;
}
void Display(HWND hWnd) {
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
}
void Message(void) {
MSG nMsg = { 0 };
while (GetMessage(&nMsg, NULL, 0, 0)) {
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);
}
}
int CALLBACK WinMain(HINSTANCE hInstance ,HINSTANCE prevInstance,LPSTR lpCmdLine,int nComShow) {
Register("MyClass");
HWND hWnd = CreateWind("MyClass", "Window");
Display(hWnd);
Message();
return 0;
}
-------------------