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 编程小菜鸟自我反省,大佬勿喷,谢谢!!!

  • 相关阅读:
    解决Linux中Too many open files问题
    10个必需的iOS开发工具和资源
    @ModelAttribute跟@SessionAttributes的应用
    7个改变世界的Java项目
    Java序列化与反序列化
    微软推出“IE9梦幻任务栏Pin计划”
    java中replace和replaceAll的区别
    【转】hibernate中annotation方式SchemaExport无法生成表的原因(ORA02261)
    permgen space报错
    em和px
  • 原文地址:https://www.cnblogs.com/xgmzhna/p/10841926.html
Copyright © 2011-2022 走看看