Windows程序内部运行机制简易分析

来源:互联网 发布:办公软件使用技巧 编辑:程序博客网 时间:2024/05/18 08:19


1.API和DSK

Windows操作系统提供了各种各样的函数,以方便我们开发windows应用程序。这些函数是windows操作系统提供给应用程序编程的接口(Application Programming Interface),就是我们通常所说的API函数。所有主要的windows函数都在windows.h头文件中进行了声明。

SDK的全称是SoftwareDevelopment Kit,中文译名为软件开发包,包括了API函数、帮助文档、微软提供的一些辅助开发工具等。

 

2.窗口和句柄

一个应用程序窗口通常包含标题栏、菜单栏、系统菜单、最小化框、最大化框、可调边框等。窗口按功能又可以分为客户区和非客户区两部分。其中客户区时窗口的主要部分,程序员通常在客户区中完成编辑文字,绘制图形等需要实现的功能;而非客户区主要由windows系统来管理,用户可以根据自己需求做适当的修改。对话框和消息框是两种常见的窗口,在对话框上有很多空间,如:按钮、静态文本框、组框、编辑框、单选按钮、复选框等。

在windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。在具体的应用程序编程时,我们要对某个窗口进行操作,首先就要得到这个窗口的句柄。

 

3.事件驱动机制

Windows程序设计时一种基于事件驱动方式的程序设计模式,主要是基于消息的。每一个windows应用程序开始执行后,系统都会为该程序创建一个消息队列,用来存放该程序创建的窗口消息。Windows将产生的消息依次放到消息队列中,而应用程序通过一个消息循环不断从消息队列中取出消息,并进行响应,这种消息机制就是windows程序运行及机制。

Windows程序中的消息可以分为“进队消息”和“不进队消息”。进队消息由系统放入到应用程序消息队列中,然后由应用程序取出并发送。不进队消息在系统调用窗口过程时直接发送给窗口。

 

4.WinMain函数

当windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数。WinMain函数是windows程序的入口点函数,当WinMain函数结束或返回时,windows应用程序结束。

 

5应用举例

对于一个完整的Win32应用程序,该程序实现的功能时创建一个窗口,并在窗口中响应键盘和鼠标消息,将其具体实现步骤如下:
1)WinMain将函数的定义。

2)窗口的创建。具体又可以分为以下4个步骤:
              ·设计一个窗口类;

              ·注册窗口类;

              ·创建窗口;

·显示及更新窗口 。

3)进行消息循环。

4)编写窗口过程函数,处理发送给窗口的消息。

下面是具体的代码(仅供参考)

#include <windows.h>#include <stdio.h>LRESULT CALLBACK WinSunProc( HWND  hwnd,                             UINT uMsg,                       WPARAM wParam,                     LPARAM lParam );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 = "zmj";wndcls.lpszMenuName = NULL;wndcls.style = CS_HREDRAW | CS_VREDRAW;        //注册窗口类RegisterClass(&wndcls);//创建窗口HWND hwnd;hwnd = CreateWindow("zmj", "http://www.zmj.org",       WS_OVERLAPPEDWINDOW, 0, 0, 600, 400, NULL, NULL, hInstance, NULL);//显示及刷新窗口ShowWindow(hwnd, SW_SHOWNORMAL);UpdateWindow(hwnd);//定义消息结构体,开始消息循环MSG msg;BOOL bRet;while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0){if(bRet == -1)return -1;else{TranslateMessage(&msg);DispatchMessage(&msg);}}return msg.wParam;}//编写窗口过程函数LRESULT CALLBACK WinSunProc( HWND hwnd,      UINT uMsg,     WPARAM wParam,     LPARAM lParam ){switch(uMsg){case WM_CHAR:char szChar[20];sprintf(szChar, "char code is %d", wParam);MessageBox(hwnd, szChar, "char", 0);break;case WM_LBUTTONDOWN:MessageBox(hwnd, "mouse clicked", "message", 0);HDC hdc;hdc = GetDC(hwnd);TextOut(hdc, 0, 50, "Microsoft Visual Studio", strlen("Microsoft Visual Studio"));//ReleaseDC(hwnd, hdc);break;case WM_PAINT:HDC hDC;PAINTSTRUCT ps;hDC = BeginPaint(hwnd, &ps);                TextOut(hDC, 0, 0, "http://www.zmj. org", strlen("http://www.zmj. org"));EndPaint(hwnd, &ps);break;case WM_CLOSE:if(IDYES == MessageBox(hwnd, "Are you sure to exit ?", "message", MB_YESNO))DestroyWindow(hwnd);break;case WM_DESTROY:PostQuitMessage(0);break; default:return DefWindowProc(hwnd, uMsg, wParam, lParam);}return 0;}


0 0
原创粉丝点击