zoukankan      html  css  js  c++  java
  • 5-9 c语言之【初识win32编程】

    ---恢复内容开始---

     今天学习了win32的相关知识,首先win32是指是指可以在32位或以上Windows系统中运行的程序,我学习的主要利用c/c++语言编写的win32程序,

    首先在win32中开始一个项目需要经历 1.窗口设计 2. 注册 3.创建 4.显示 五个部分,其中的难点就在于窗口设计中 lpfnWndProc 消息处理函数的编写,win32的精髓就在于它的消息机制,

    在百度百科中关于消息机制是这样阐述的:

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

    Windows的消息系统是由3个部分组成的:
    ·消息队列。Windows能够为所有的应用程序维护一个消息队列。应用程序必须从消息队列中获取
    消息,然后分派给某个窗口。
    ·消息循环。通过这个循环机制应用程序从消息队列中检索消息,再把它分派给适当的窗口,然
    后继续从消息队列中检索下一条消息,再分派给适当的窗口,依次进行。
    · 窗口过程。每个窗口都有一个窗口过程来接收传递给窗口的消息,它的任务就是获取消息然后
    响应它。窗口过程是一个回调函数;处理了一个消息后,它通常要返回一个值给Windows。
    注意回调函数是程序中的一种函数,它是由Windows或外部模块调用的。
    一个消息从产生到被一个窗口响应,其中有5个步骤:
    1) 系统中发生了某个事件。
    2) Windows把这个事件翻译为消息,然后把它放到消息队列中。
    3)应用程序从消息队列中接收到这个消息,把它存放在TMsg记录中。
    4)应用程序把消息传递给一个适当的窗口的窗口过程。
    5) 窗口过程响应这个消息并进行处理。
    ----------------------------------------------------------------------------------------
    这是一个很全面的一个解释了,就相当于一个比方,在一个屋子里,每个人都拥有自己的桌子,然后此时快递在外面排着队进来,严格遵守排队秩序,然后一个快递来了之后,我们拆开看是否位自己需要的,如果需要的话就接受它,如果不需要的话另行处理(不是销毁)。那么在这段比喻中,每个人都是一个窗口,快递就是消息,这里的消息就是敲击键盘,点击鼠标等一系列外设动作,那么这些消息按照队列的数据结构进行排列,然后通过循环的方式让每个窗口都能找到属于自己的消息,这就是win32的消息机制。
     
    关于一些小概念在这里进行一下解释
    1.  应用实例:应用只有一个,实例可以多个,比如qq一台电脑只能装一个,但可以点开多个窗口,此时多个窗口每个都是应用实例
    2. 句柄:类似于指针,保存的是地址,但是只能看内容,不能对其进行修改;
    3. 在创建窗口的过程中,屏幕的左上角为坐标原点,并且长度的单位,为像素;
    4. 前一个应用实例:比如通过微信打开qq,微信为qq的应用实例(区别于子窗口)
    5. 调用约定:是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数。函数的调用约定就是描述参数是怎么传递和由谁平衡堆栈的,当然还有返回值

    先放上来一个 利用win32创建窗口的程序

     1 #include<Windows.h>
     2 LRESULT CALLBACK MyWNDPROC(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam);
     3 int CALLBACK Winmain(
     4                     HINSTANCE hInstance,
     5                     HINSTANCE hPrevInstance,
     6                     LPSTR lpCmdLine,
     7                     int nCmdShow
     8                     )
     9 {
    10     MSG msg;
    11     HWND hwnd;
    12     WNDCLASSEX ex;
    13     ex.style = CS_HREDRAW | CS_VREDRAW;
    14     ex.cbSize = sizeof(ex);
    15     ex.cbClsExtra = 0;
    16     ex.cbWndExtra = 0;
    17     ex.hInstance = hInstance;
    18     ex.hIcon = NULL;
    19     ex.hCursor = NULL;
    20     ex.hbrBackground = CreateSolidBrush(RGB(0,255,0));
    21     ex.hIconSm = NULL;
    22     ex.lpfnWndProc = &MyWNDPROC;
    23     ex.lpszMenuName = NULL;
    24     ex.lpszClassName = "AA";
    25 
    26     RegisterClassEx(&ex);
    27 
    28     hwnd = CreateWindow(ex.lpszClassName,"你好中国",WS_OVERLAPPEDWINDOW,50,50,100,100,NULL,NULL,hInstance,NULL);
    29 
    30     ShowWindow(hwnd,SW_SHOW);
    31 
    32     while(GetMessage(&msg,NULL,0,0))
    33     {
    34         TranslateMessage(&msg);
    35         DispatchMessage(&msg);
    36     }
    37 
    38 
    39 
    40 
    41     return 0;
    42 }
    43 LRESULT CALLBACK MyWNDPROC(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
    44 {
    45     switch(message)
    46         case WM_CLOSE:
    47             break;
    48     return DefWindowProc(hwnd,message,wparam,lparam);
    49 }

    2019-05-09 23:56:50 编程小菜鸟自我反省,大佬勿喷,谢谢!!!

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Qt 自定义model实现文件系统的文件名排序
  • 原文地址:https://www.cnblogs.com/xgmzhna/p/10841926.html
Copyright © 2011-2022 走看看