编码、sdk窗口创建、Cmake的使用

编码

ASCII码

  • ASCII 码一共规定了128个字符的编码,比如空格SPACE是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0

ASCII扩展码(多字符集)

  • 英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用 ASCII 码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。

  • 但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0--127表示的符号是一样的,不一样的只是128--255的这一段

  • 所以有另一种编码unicode,可以容纳100多万个符号,任何国家的文字都可以表现

UNICODE编码

  • 如果unicode都使用4字节表示的话那么浪费了很大的空间,所以出现了utf8等等的编码,可以变长表示

  • Unicode 规范定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(zero width no-break space),用FEFF表示。这正好是两个字节,而且FFFE1。如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。

UTF8(UNICODE的一种形式)

UTF-8 的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

下表总结了编码规则,字母x表示可用编码的位。

image.png

窗口创建

image.png


Cmake使用

CMake 入门实战

作业

  • 创建两个窗口同时关闭

#include<windows.h>
HWND hwnd2;
HWND hwnd1;
LRESULT CALLBACK MyWindowProc(
    HWND hwnd,      // handle to window
    UINT uMsg,      // message identifier
    WPARAM wParam,  // first message parameter
    LPARAM lParam   // second message parameter
    )
{
    switch (uMsg)
    {
    case WM_DESTROY:
        DestroyWindow(hwnd1);
        DestroyWindow(hwnd2);
        PostQuitMessage(0);
        break;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(
   HINSTANCE hInstance,// handle to current instance 实例句柄,应用程序加载的地址
    HINSTANCE hPrevInstance,  // handle to previous instance
    LPSTR lpCmdLine,          // command line
    int nCmdShow              // show state
    )  {
    LPCTSTR    lpszClassName=L"mywindows";
    //1.注册窗口类
    WNDCLASSEX   wcx = {0};
    wcx.cbSize = sizeof(WNDCLASSEX);

    wcx.lpfnWndProc = MyWindowProc;
    wcx.lpszClassName = lpszClassName;


    ATOM atom=RegisterClassEx(&wcx);
    //2.创建窗口

     hwnd1 = CreateWindow(lpszClassName, L"CR32", WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, (LPVOID)NULL);
    //显示更新窗口
    ShowWindow(hwnd1, nCmdShow);
    UpdateWindow(hwnd1);



         hwnd2 = CreateWindow(lpszClassName, L"CR31", WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, (LPVOID)NULL);

    ShowWindow(hwnd2, nCmdShow);
    UpdateWindow(hwnd2);

    //消息循环
    MSG msg;

    while (GetMessage(&msg, (HWND)NULL, 0, 0) != 0 && GetMessage(&msg, (HWND)NULL, 0, 0) != -1)
    {

        DispatchMessage(&msg);
    }

}


转载请说明出处
草堂教程网 » 编码、sdk窗口创建、Cmake的使用

发表评论

欢迎 访客 发表评论

一个纯粹的精品教程收录分享站点

查看演示 官网购买