VC++学习笔记——Windows程序内部运行原理

 

总体结构

进行
Windows程序设计,实际时在进行一种面向对象的程序设计(OOP)。
最典型的对象就是窗口。对象的代码是窗口过程;数据是窗口过程保存的信息,以及每个窗口系统中那个窗口类保存的信息。
OS调用应用程序(系统调用),是Windows面向对象体系结构的基础。


三大难点

1.系统调用,OS通过窗口过程来给窗口发送消息。
2.进队和不进队消息,进队的消息被发送给消息队列,不今对的消息则发送给窗口过程。进队消息基本上是用户输入的结果,如WM_KEYDOWNWM_CHARWM_TIMERWM_PAINTWM_QUIT等。不进队的消息来自调用特定的Windows函数,如WM_GREATEWM_SIZEWM_COMMAND等。
3.行动迅速


鼠标拖动窗口边框改变窗口大小,应用程序如何知道用户改变了窗口的大小呢?

       
问题的关键在于Windows所使用的体系结构。当用户改变窗口的大小时,OS给程序发送一条消息指出新窗口的大小。然后程序就可以调整窗口中的内容,以反映大小的变化。
     
Windows给窗口发消息”,是指OS调用窗口过程函数WndProc,该函数的参数描述了这个特定消息。


窗口过程函数

       
程序创建的每一个窗口都有相关的窗口过程。窗口过程函数既可以在程序中,也可以在动态链接库中。OS 通过调用窗口过程来给窗口发送消息,窗口过程根据此消息进行处理,然后将控制返回给OS


Windows程序是如何运行的?

       
OS 调用WinMain函数
       
OS 分配实例号作参数
       
OS WinMain第三个命令行参数

       命令行参数设置
 Project Setting Debug Program arguments


如何创建窗口

1. 设计窗口类,就像做填空题,填充 WNDCLASS 结构体。
2. 注册窗口类,应用程序向 OS 注册窗口类。
3. 创建窗口,基于窗口类创建窗口。
4. 显示更新窗口
每一种不同类型的窗口都有自己的窗口类。


    回调函数

1. OS 调用
2. 程序员自己在 WndProc 函数定义中写代码,由 OS 调用 WndProc 执行。
3. 应用程序收到用户发来的消息, WndPro 代码处理消息。


    语句 wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);

       
GetStockObject 函数的返回值强制转换成 HBRUSH 类型,体现了 C/C++ 语言是强类型语言。


while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }

       
1 .应用程序运行时, GetMessage 函数的返回值总为 1 ,故能保证程序一直运行。
       
2 TranslateMessage ,翻译消息的功能。
              如用户点击键盘上字母 A ,将 WM_KEYDOWN WM_KEYUP 消息翻译成        WM_CHAR 消息。
       
3 DispatchMessage ,向 OS 投递消息。


    消息循环机制

       
应用程序开始执行后, OS 为该程序创建一个消息队列,用来存放该程序可能创建的各种不同窗口的消息。应用程序利用“消息循环”,由 GetMessage 函数取出一个消息,由 TranslateMessage 对消息进行翻译,由 DispatchMessage 投递分发给 WndProc OS 调用回调函数 WndProc 响应消息。有些消息直接发送给 WndProc ,不进入消息队列。


    DC与设备驱动程序打交道

HDC hdc;
PAINTSTRUCT ps;
       hdc=BeginPaint(hwnd,&ps);                 hdc=GetDC(hwnd);
    ……                                      ……
       EndPaint(hwnd,&ps);                        ReleaseDC(hwnd,hdc);

     
  注意: 1 .定义 DC 句柄。
                   2 .内存泄漏。获取和释放句柄,两函数要成对出现。
                   3 BeginPaint EndPaint 函数只能用在 WM_PAINT 消息中。


    销毁窗口与退出程序。

     
case WM_CLOSE:    // 销毁窗口
              if (IDYES==MessageBox(hwnd," 是否真的结束? ","weixin",MB_YESNO))
              {
                     DestroyWindow(hwnd);
              }
       break ;
 
case WM_DESTROY:   // 退出程序
              PostQuitMessage(0);
       break;
       
注意: WndProc 响应 WM_DESTROY 消息,调用 PostQuitMessage(0) 给消息队列, GetMessage 得到参数 0 ,结束消息循环,结束 WinMain ,退出程序。


default:

       
对应用程序没有处理的消息作缺省处理,调用 DefWindowProc ,保证每一个消息都被执行。

 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最简单的winmain程序 #include #include LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { HDC hdc; switch(uMsg) { case WM_CHAR: char szChar[20]; sprintf(szChar,"char is %d",wParam); MessageBox(hwnd,szChar,"weixin",0); break; case WM_LBUTTONDOWN: MessageBox(hwnd,"mouse clicked","weixin",0); hdc=GetDC(hwnd); TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训")); ReleaseDC(hwnd,hdc); break; case WM_PAINT: PAINTSTRUCT ps; hdc=BeginPaint(hwnd,&ps); TextOut(hdc,0,0,"维新培训",strlen("维新培训")); EndPaint(hwnd,&ps); break; case WM_CLOSE: if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO)) DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); wndcls.hInstance=hInstance; wndcls.lpfnWndProc=WinSunProc; wndcls.lpszClassName="Weixin2003"; wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); HWND hwnd=CreateWindow("Weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL); DWORD dwStyle=GetWindowLong(hwnd, GWL_STYLE); dwStyle&=~(WS_SIZEBOX|WS_MAXIMIZEBOX|WS_MINIMIZEBOX); SetWindowLong(hwnd, GWL_STYLE, dwStyle); ShowWindow(hwnd,SW_SHOWNORMAL); UpdateWindow(hwnd); MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值