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程序内部运行原理相关推荐

  1. 孙鑫VC++LESSON1:Windows程序内部运行原理

    视频链接:https://www.bilibili.com/video/BV1Ts411f7fw/?spm_id_from=333.337.search-card.all.click&vd_s ...

  2. Windows程序内部运行原理

    Windows程序内部运行原理   为了理解Visual C++应用程序开发过程,先要理解Windows程序的运行机制.因为 Visual C++是 Windows 开发语言,需要明白在 Window ...

  3. Windows程序内部运行原理(2)

    Windows程序内部运行原理   为了理解Visual C++应用程序开发过程,先要理解Windows程序的运行机制.因为 Visual C++是 Windows 开发语言,需要明白在 Window ...

  4. VC++学习(1):Windows程序内部运行原理

    Windows应用程序,操作系统,计算机硬件之间的相互关系 关于API:向下的箭头③表示应用程序可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需 ...

  5. 孙鑫-MFC笔记一--Windows程序内部运行机制

    对于一个初学者来说,常常会用到各种库函数,例如printf等等,这些库函数是由你所使用的编译器厂商提供的,在Windows操作系统下,开发的应用程序, 也有这样的库函数,不同的是,这样的库函数,是有w ...

  6. VC++的学习(基于VS2008)——windows程序内部运行机制

    昨天和今天都在学习windows程序的内部运行机制,再次学习这一章,我明显感到条理清晰了,原来这一章是讲我们所用的电脑,这样一个windows平台下程序运行的内部机制的.windows应用程序下最重要 ...

  7. [转]孙鑫VC教程例子代码1---Windows程序内部运行原理

    本文转自:http://blog.csdn.net/ljt350740378/article/details/6437113 创建一个完整的窗口需要经过下面四个操作步骤: 设计一个窗口类: 注册窗口类 ...

  8. 《VC++深入详解》学习笔记 第一章 Windows程序内部运行机制

    (金光鳞闪影若茫) 窗口四步走: 设计窗口类 注册窗口类 创建窗口 显示更新窗口 最后创建消息循环和响应函数 设计窗口类: typedef struct {UINT style;//窗口类型 WNDP ...

  9. python程序只能使用源代码进行运行吗-谈谈 Python 程序的运行原理

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...

最新文章

  1. python 程序流程控制结构-【笔记】《python语言程序设计》——程序的控制结构...
  2. 数组常见的遍历循环方法、数组的循环遍历的效率对比
  3. (Spring)概述及IOC
  4. 二维稳态热传导 代码实现_常用振动激励方式:稳态正弦 、瞬态和随机激振
  5. C# 与 Unity 同名函数
  6. java 文件通配符_Java中泛型通配符的使用方法示例
  7. Silverlight 3.0 Isolated Storage 独立存储空间
  8. OJ1086: ASCII码排序(多实例测试)(C语言)
  9. php mysql ajax登录界面_PHP+jQuery+Ajax实现用户登录与退出
  10. MyEclipse Web 项目导入 Eclipse 中需要改的文件
  11. 反计算机病毒技术论文,计算机病毒反病毒技术论文
  12. 说明:最新谷歌AI智商不超过6岁研究来自科学院而非康内尔大学
  13. Java中set.iterator()的用法;
  14. 联想电脑bios设置u盘启动 windows安装 重装系统盘
  15. wifi一到晚上服务器无响应,wifi到晚上网速很慢(为啥一到晚上网速就慢)
  16. sql语句-如何以一个表中的数据为条件据查询另一个表中的数据
  17. oracle awr监控报告,一个Oracle小白的AWR报告分析(一)
  18. 电子技术与计算机软件杂志,《电子技术与软件工程》杂志社
  19. vs+qt使用过程中遇到的问题(一)
  20. B题-具有自动泊车功能的电动车赛题解析TI杯2022年省级大学生电子设计竞赛联赛(10月)

热门文章

  1. 深入理解PHP中赋值与引用
  2. poj 3616(简单dp)
  3. VMware安装Linux ubuntu虚拟机
  4. CSU 1081集训队分组(搜索)
  5. Golang之错误处理
  6. 类选择器与ID选择器的比较
  7. python--微信小程序获取手机号码报错
  8. Python数据可视化之Matplotlib实现各种图表
  9. [高级软件工程教学]团队Beta阶段成绩汇总
  10. Git学习笔记(0)-错误汇总