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

2 篇文章 0 订阅


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值