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

本文介绍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,故能保证程序一直运行。
       
2TranslateMessage,翻译消息的功能。
              如用户点击键盘上字母A,将WM_KEYDOWNWM_KEYUP消息翻译成       WM_CHAR消息。
       
3DispatchMessage,向OS投递消息。


    消息循环机制

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


    DC与设备驱动程序打交道

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

     
 注意:1.定义DC句柄。
                   2.内存泄漏。获取和释放句柄,两函数要成对出现。
                   3BeginPaint 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,保证每一个消息都被执行。

 
 
最简单的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、付费专栏及课程。

余额充值