Windows程序运行过程

Windows应用程序:

WinMain函数(入口函数):

1。设计窗口类,注册窗口类;WNDCLASS

2。创建窗口,显示及更新窗口;

3。消息循环;

窗口过程函数(回调函数):WindowProc

PS:Dos程序入口函数为main,Windows程序入口为WinMain,都是由系统直接调用。

windows程序运行过程

#include<windows.h>
#include<stdio.h>

LRESULT CALLBACK WinSunProc(     //窗口过程函数(回调函数)声明
	HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
);

int WINAPI WinMain(            //WinMain函数,windows应用程序的入口
	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 = "hepengtao";
	wndcls.lpszMenuName = NULL;
	wndcls.style = CS_HREDRAW | CS_VREDRAW;

	RegisterClass(&wndcls);  //注册窗口类

	HWND hwnd;
	hwnd = CreateWindow("hepengtao","窗口标题",WS_OVERLAPPEDWINDOW,  //创建窗口
		0,0,600,400,NULL,NULL,hInstance,NULL);

	ShowWindow(hwnd,SW_SHOWNORMAL);  //显示窗口
	UpdateWindow(hwnd);             //更新窗口

	MSG msg;
	while(GetMessage(&msg,NULL,0,0)) //从消息队列中取出消息,当得到 WM_QUIT 消息时返回0
	{
		TranslateMessage(&msg);//按下键盘按键时,系统得到 WM_KEYDOWN 和 WM_KEYUP 消息,经过该函数转变为 WM_CHAR 消息
		DispatchMessage(&msg); //将得到的消息传递给回调函数
	}
	return 0;
}

LRESULT CALLBACK WinSunProc(		//定义窗口过程函数(回调函数)
	HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
)
{
	switch(uMsg)
	{
	case WM_CHAR:  //键盘按下字母后,发送 WM_CHAR 消息
		char szChar[20];
		sprintf(szChar,"char is %d",wParam);
		MessageBox(hwnd,szChar,"弹窗标题",0);
		break;
	case WM_LBUTTONDOWN:  //鼠标左键按下后,发送 WM_LBUTTONDOWN 消息
		MessageBox(hwnd,"mouse clicked","弹窗标题",0);
		HDC hdc;
		hdc = GetDC(hwnd);
		TextOut(hdc,0,50,"I am hepengtao.",strlen("I am hepengtao."));
		ReleaseDC(hwnd,hdc);
		break;
	case WM_PAINT:   //窗口重绘时,发送 WM_PAINT 消息
		HDC hDC;
		PAINTSTRUCT ps;
		hDC = BeginPaint(hwnd,&ps);
		TextOut(hDC,0,0,"Hello,world!",strlen("Hello,world!"));
		EndPaint(hwnd,&ps);
		break;
	case WM_CLOSE:  //关闭按钮按下后,发送 WM_CLOSE 消息
		if(IDYES == MessageBox(hwnd,"确定要关闭窗口?" ,"弹窗标题",MB_YESNO))
		{
			DestroyWindow(hwnd); //销毁窗口,并发送 WM_DESTORY 消息
		}
		break;
	case WM_DESTROY: //执行DestoryWindow()函数时,发送 WM_DESTORY 消息
		PostQuitMessage(0); //程序请求退出,发送 WM_QUIT 消息
		break;
	default:
		return DefWindowProc(hwnd,uMsg,wParam,lParam); //用户不关心的消息,由操作系统缺省处理
	}
	return 0;
}
时间: 2024-11-12 02:51:38

Windows程序运行过程的相关文章

Windows程序运行原理

Windows程序运行原理 1.应用程序,操作系统,硬件之间的关系 这里涉及到消息及消息队列, 操作系统是通过消息机制(Message)来将感知到的事件传递给应用程序的. 操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序. 操作系统对事件做出反应的过程就叫做消息响应 typedef struct tagMSG { // msg HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt

Windows程序执行过程

Windows应用程序: WinMain函数(入口函数): 1. 设计窗体类,注冊窗体类.WNDCLASS 2. 创建窗体,显示及更新窗体. 3. 消息循环. 窗体过程函数(回调函数):WindowProc PS:Dos程序入口函数为main,Windows程序入口为WinMain,都是由系统直接调用. windows程序执行过程 #include<windows.h> #include<stdio.h> LRESULT CALLBACK WinSunProc( //窗体过程函数(

在程序运行过程中,对象所占的空间是不能随时释放的

使用类名定义的对象(请查看:C++类的声明和对象的定义)都是静态的,在程序运行过程中,对象所占的空间是不能随时释放的.但有时人们希望在需要用到对象时才建立对象,在不需要用该对象时就撤销它,释放它所占的内存空间以供别的数据使用.这样可提高内存空间的利用率. 在C++中,可以使用new运算符动态地分配内存,用delete运算符释放这些内存空间(请查看:C++动态分配内存(new)和撤销内存(delete)).这也适用于对象,可以用new运算符动态建立对象,用delete运算符撤销对象. 如果已经定义

Java内存管理-程序运行过程(一)

勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine(Java虚拟机)!本系列会开启对JVM相关的知识的探索和总结,让我们一起踏入JVM的学习之旅中,去了解和发现更加精彩的Java世界! 正如奥古斯特·罗丹 说过:世界上不是缺少美,而是缺少发现美的眼睛.Java的世界也是如此! 本文地图: 1.什么是程序 在计算机领域当中,程序就是为了能够让计算机执行

Windows窗口程序运行过程

现在,简单介绍下windows应用程序的大概运行过程,让刚开始接触Windows开发或者MFC开发的同学有一个大致的了解. 1.创建一个窗口首先要注册一个窗口类,初始化wndclass中的各个域,设置窗口过程函数. 2.调用RigisterClass来注册这个窗口类. 3.创建窗口.CreateWindow 4.显示窗口.ShowWindow 5.刷新窗口.UpdateWindow 5.消息循环. 这里主要讲解消息循环. 消息循环中的循环是由程序中 while(GetMessage(&msg,N

Perl 关于在程序运行过程中重新开启标准输入的问题

遇见问题是,如何程序运行的时候已经将标准输入使用"<"符号或者"|"符合在命令行定向为一个文件. 可是在程序的运行过程中希望从键盘得到输入内容. 因为/dev/tty为当前进程的控制台,STDIN 为当前的标准输入. 如果重定向,例如: perl script.pl <myfile.txt STDIN 被指向 myfile.txt, 但是 /dev/tty 仍然来自于控制终端.所有的Unix都是这样,不单单是指这个perl. 那么解决方案: #!/usr

opencv检错:程序运行过程正常,当跳出函数时出现断言错误(Debug Assertion Failed)

转载http://blog.csdn.net/u012327581/article/details/51351780 1.问题描述 在VS2015下配置好Opencv后,程序在函数运行过程中正常,调试时发现,当运行至跳出函数时,出现断言错误. 2.原因分析 单步跟踪调试发现,在函数结束时会进行vector的析构,出现了析构错误.并且,如果vector在定义完成之后,进行resize或reserve操作,将vector空间做大,问题消失.后来查阅资料,结合亲身测试,发现是在调用Opencv 库时,

[VS+OpenCV] 程序运行过程正常,当跳出函数是出现断言错误

问题描述 在VS2015下配置好Opencv后,成勋在函数运行过程中正常,调试时发现,当运行至跳出函数是,出现断言错误.如图 原因分析 单步跟踪调试发现,在函数结束时会进行vector的析构,出现了析构错误.并且,如果vector在定义完成之后,进行resize或reserve操作,将vector空间做大,问题消失.后来查阅资料,结合亲身测试,发现是在调用Opencv 库时,由于opencv库编译使用的是 VC12(或者VC10/VC11)编译的,而本人使用的VS2015使用的时VC14(14是

[转载] linux 程序运行过程中替换文件

今天被朋友问及“Linux下可以替换运行中的程序么?”,以前依稀记得Linux下是可以的(而Windows就不让),于是随口答道“OK”.结果朋友发来一个执行结果:(test正在运行中)# cp test2 test cp: cannot create regular file `test': Text file busy 看起来是程序被占用,无法覆盖.于是自己又再做了几个实验: (1)先rm删除正在运行的test,然后cp test2 test就没有错误了.(2)先mv改名正在运行的test,