【MFC】1.Windows程序内部运行原理
1.原理与内容
Windows应用程序,操作系统,计算机硬件之间的相互关系:
向下的箭头③表示应用程序可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要应用程序告诉操作系统该发出什么样的声音。这个关系好比有个机器人能够完成行走的功能,但是,如果人们不告诉它往哪个方向上走,机器人是不会主动行走的。这里的机器人就是操作系统,人们就是应用程序。
向上的箭头④表示操作系统能够将输入设备的变化上传给应用程序。如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。好比有个蚊子叮了我们一口,我们的神经末梢(相当于操作系统)马上感知到这一事件,并传递给了我们的大脑(相当于应用程序),我们的大脑最终决定如何对这一事件作出反应,如将蚊子赶走,或是将蚊子拍死。对事件作出反应的过程就是消息响应。
句柄(HANDLE),资源的标识。操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。
创建一个完整的窗口需要经过下面四个操作步骤:
(1)设计一个窗口类;
(2)注册窗口类;
(3)创建窗口;
(4)显示及更新窗口。
2.API程序代码
#include<windows.h>
#include<stdio.h>//回调函数声明
LRESULT CALLBACK WindowProc(HWND hwnd, // handle to windowUINT uMsg, // message identifierWPARAM wParam, // first message parameterLPARAM lParam // second message parameter
);//操作系统调用,并给WINMAIN分配一个实例号,并传递参数
int WINAPI WinMain(HINSTANCE hInstance, // handle to current instanceHINSTANCE hPrevInstance, // handle to previous instanceLPSTR lpCmdLine, // pointer to command lineint nCmdShow // show state of window 最大化显示 还是最小化显示
)
{//第一步:设计窗口类WNDCLASS wndcls; wndcls.style = CS_HREDRAW | CS_VREDRAW; // 水平和垂直重画,在窗口调整大小的时候告知// 是否需要重画,如果填写两参数,表示重画,窗口内容将清除重画wndcls.lpfnWndProc = WindowProc; // 回调函数// 当应用程序收到某个窗口的消息,消息与窗口相关,需要调用一个函数作相应,
<span style="white-space:pre"> </span> // 这些工作本来是有操作系统进行处理的,但是需要我们进行通知// 不同的窗口有特定回调函数wndcls.cbClsExtra = 0; //类额外数据,内存空间称为类的附加内存wndcls.cbWndExtra = 0; //窗口附加内存wndcls.hInstance = hInstance; //当前实例号,即利用操作系统传进来的形参hInstance进行复制wndcls.hIcon = LoadIcon(NULL,IDI_ERROR ); //微软的标准图标第一个参数皆为NULLwndcls.hCursor = LoadCursor(NULL,IDC_ARROW); //如用预定义光标,第一参数为NULL,IDC_CROSSwndcls.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); //得到预定义的画刷,画笔等wndcls.lpszMenuName = NULL; //窗口菜单名wndcls.lpszClassName = "winmain"; //给本窗口类取个名字//第二步:注册窗口类RegisterClass(&wndcls); //向操作系统注册//第三步:创建窗口HWND hwnd; //句柄,标识/特征等,分配资源hwnd = CreateWindow("winmain", //操作系统认识的名字<span style="white-space:pre"> </span>"第一个实验!", //标题栏的名字WS_OVERLAPPEDWINDOW /* &~WS_MAXIMIZEBOX */,0,//CW_USEDEFAULT,//窗口显示的时候,采用操作系统默认为位置及大小0,//CW_USEDEFAULT,200,//CW_USEDEFAULT,200,//CW_USEDEFAULT, /*自主设定0,0,100,200*/NULL, //父窗口的句柄 NULL, //菜单的句柄hInstance, //当前的实例,操作系统传的值NULL);//第四步:显示窗口ShowWindow(hwnd,SW_SHOWNORMAL); //显示哪一个窗口???//第五步:更新窗口,可有可无UpdateWindow(hwnd);MSG msg;//每次循环从消息队列中取出一条消息进行处理while(GetMessage(&msg,NULL,0,0)) //NULL 调用线程任意窗口的消息{//该语句将类似于WM_KeyDown和WM_KeyUp转换生成新WM_CHAR投递给系统处理TranslateMessage(&msg);//将消息投递出去给操作系统,操作系统会自动调用回调函数处理DispatchMessage(&msg);}return 0;
}LRESULT CALLBACK WindowProc(HWND hwnd, // handle to windowUINT uMsg, // message identifierWPARAM wParam, // first message parameterLPARAM lParam // second message parameter)
{HDC hdc;switch(uMsg) {case WM_PAINT:PAINTSTRUCT ps;hdc=BeginPaint(hwnd,&ps);TextOut(hdc,0,10,"hello world!",strlen("hello world!"));EndPaint(hwnd,&ps);break;case WM_CHAR:char szChar[20];sprintf(szChar,"char is %d",wParam);MessageBox(hwnd,szChar,"Warnning!",MB_OK);case WM_LBUTTONDOWN:hdc=GetDC(hwnd); //得到当前窗口的上下文句柄TextOut(hdc,0,50,"沈春旭作品",strlen("沈春旭作品"));ReleaseDC(hwnd,hdc);break;case WM_CLOSE:if(IDOK==MessageBox(hwnd,"确认要退出嘛?","Warning!",MB_OK)){//销毁窗口,但进程中还是保留的,该函数直接抛出WM_DESTROY消息DestroyWindow(hwnd);}break;case WM_DESTROY:PostQuitMessage(0); //终止消息循环,并抛出WM_QUIT消息,从而导致上面的消息循环退出default://对于代码中没有涉及到的消息,由提交给系统处理,此句一定要加,否则窗口不会出现return DefWindowProc(hwnd,uMsg,wParam,lParam);}return 0;
}
3.执行结果
【MFC】1.Windows程序内部运行原理相关推荐
- 孙鑫VC++LESSON1:Windows程序内部运行原理
视频链接:https://www.bilibili.com/video/BV1Ts411f7fw/?spm_id_from=333.337.search-card.all.click&vd_s ...
- Windows程序内部运行原理
Windows程序内部运行原理 为了理解Visual C++应用程序开发过程,先要理解Windows程序的运行机制.因为 Visual C++是 Windows 开发语言,需要明白在 Window ...
- Windows程序内部运行原理(2)
Windows程序内部运行原理 为了理解Visual C++应用程序开发过程,先要理解Windows程序的运行机制.因为 Visual C++是 Windows 开发语言,需要明白在 Window ...
- VC++学习(1):Windows程序内部运行原理
Windows应用程序,操作系统,计算机硬件之间的相互关系 关于API:向下的箭头③表示应用程序可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需 ...
- 孙鑫-MFC笔记一--Windows程序内部运行机制
对于一个初学者来说,常常会用到各种库函数,例如printf等等,这些库函数是由你所使用的编译器厂商提供的,在Windows操作系统下,开发的应用程序, 也有这样的库函数,不同的是,这样的库函数,是有w ...
- VC++的学习(基于VS2008)——windows程序内部运行机制
昨天和今天都在学习windows程序的内部运行机制,再次学习这一章,我明显感到条理清晰了,原来这一章是讲我们所用的电脑,这样一个windows平台下程序运行的内部机制的.windows应用程序下最重要 ...
- [转]孙鑫VC教程例子代码1---Windows程序内部运行原理
本文转自:http://blog.csdn.net/ljt350740378/article/details/6437113 创建一个完整的窗口需要经过下面四个操作步骤: 设计一个窗口类: 注册窗口类 ...
- 《VC++深入详解》学习笔记 第一章 Windows程序内部运行机制
(金光鳞闪影若茫) 窗口四步走: 设计窗口类 注册窗口类 创建窗口 显示更新窗口 最后创建消息循环和响应函数 设计窗口类: typedef struct {UINT style;//窗口类型 WNDP ...
- python程序只能使用源代码进行运行吗-谈谈 Python 程序的运行原理
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...
最新文章
- python 程序流程控制结构-【笔记】《python语言程序设计》——程序的控制结构...
- 数组常见的遍历循环方法、数组的循环遍历的效率对比
- (Spring)概述及IOC
- 二维稳态热传导 代码实现_常用振动激励方式:稳态正弦 、瞬态和随机激振
- C# 与 Unity 同名函数
- java 文件通配符_Java中泛型通配符的使用方法示例
- Silverlight 3.0 Isolated Storage 独立存储空间
- OJ1086: ASCII码排序(多实例测试)(C语言)
- php mysql ajax登录界面_PHP+jQuery+Ajax实现用户登录与退出
- MyEclipse Web 项目导入 Eclipse 中需要改的文件
- 反计算机病毒技术论文,计算机病毒反病毒技术论文
- 说明:最新谷歌AI智商不超过6岁研究来自科学院而非康内尔大学
- Java中set.iterator()的用法;
- 联想电脑bios设置u盘启动 windows安装 重装系统盘
- wifi一到晚上服务器无响应,wifi到晚上网速很慢(为啥一到晚上网速就慢)
- sql语句-如何以一个表中的数据为条件据查询另一个表中的数据
- oracle awr监控报告,一个Oracle小白的AWR报告分析(一)
- 电子技术与计算机软件杂志,《电子技术与软件工程》杂志社
- vs+qt使用过程中遇到的问题(一)
- B题-具有自动泊车功能的电动车赛题解析TI杯2022年省级大学生电子设计竞赛联赛(10月)