VC++学习(1):Windows程序内部运行原理
Windows应用程序,操作系统,计算机硬件之间的相互关系
关于API:向下的箭头③表示应用程序可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要应用程序告诉操作系统该发出什么样的声音。这个关系好比有个机器人能够完成行走的功能,但是,如果人们不告诉它往哪个方向上走,机器人是不会主动行走的。这里的机器人就是操作系统,人们就是应用程序。
那么,应用程序是如何通知操作系统执行某个功能的呢?有过编程经验的读者都应该知道,在应用程序中要完成某个功能,都是以函数调用的形式实现的,同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用,这些函数的集合就是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称Windows API。如CreateWindow就是一个API函数,应用程序中调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口。
关于消息和消息队列:向上的箭头④表示操作系统能够将输入设备的变化上传给应用程序。如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。好比有个蚊子叮了我们一口,我们的神经末梢(相当于操作系统)马上感知到这一事件,并传递给了我们的大脑(相当于应用程序),我们的大脑最终决定如何对这一事件作出反应,如将蚊子赶走,或是将蚊子拍死。对事件作出反应的过程就是消息响应。
操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消息机制(Message)来实现的。操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序,参看MSDN。
MSG结构定义如下:
typedef struct tagMSG {
HWND hwnd;
UINT message; //在windows中采用宏定义,以wm_开始(windows message)
WPARAM wParam; //附加参数,如键盘上字符的ASSCI码
LPARAM lParam; //附加参数
DWORD time; //消息发生的时间
POINT pt; //消息发生时,光标所在位置
} MSG;
int x,y;
x=30;
y=30;
//x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重。
typedef int WIDTH
typedef int HEIGHT
WIDTH x;
HEIGHT y;
//好处:我们从变量的类型上就可以知道x和y是用来表示宽度和高度。
HINSTANCE hInstance, // handle to current instance当前实例句柄
HINSTANCE hPrevInstance, // handle to previous instance先前的相同的实例句柄
LPSTR lpCmdLine, // command line命令行参数
int nCmdShow // show state最大化、最小化或者隐藏显示
);
窗口的创建:创建一个完整的窗口需要经过下面四个操作步骤:
1、设计一个窗口类;WNDCLASS
2、注册窗口类;
ATOM RegisterClass(__in CONST WNDCLASS *lpWndClass
);
3、创建窗口;
HWND CreateWindow(__in LPCTSTR lpClassName, //窗口类名__in LPCTSTR lpWindowName, //窗口名__in DWORD dwStyle, //窗口类型,可最小化、最大化等,是一种特征位__in int x, //窗口显示的位置__in int y,__in int nWidth, //窗口宽度__in int nHeight,__in HWND hWndParent, __in HMENU hMenu,__in HINSTANCE hInstance, //应用程序句柄__in LPVOID lpParam //WM_CREATE消息的附加参数 );
BOOL DestroyWindow( //会发送WM_DESTROY消息__in HWND hWnd );
void PostQuitMessage( //退出应用程序__in int nExitCode //WM_QUIT消息的附加信息 );
4、显示及更新窗口。
BOOL ShowWindow(__in HWND hWnd, //显示的窗口句柄__in int nCmdShow //显示窗口的状态(最大化、最小化SW_) );
BOOL UpdateWindow(__in HWND hWnd );
设计窗口类:
typedef struct _WNDCLASS {
BOOL GetMessage(__out LPMSG lpMsg, //要被填充的消息结构体__in HWND hWnd, //获取哪一个窗口的消息,NULL表示获取应用程序所拥有的消息队列中的所有消息__in UINT wMsgFilterMin, //消息的最小值如WM_KEYFIRST,以一条消息__in UINT wMsgFilterMax
);
BOOL TranslateMessage(__in const MSG *lpMsg
);
LRESULT DispatchMessage(__in const MSG *lpmsg
);
int MessageBox(__in HWND hWnd, __in LPCTSTR lpText, //消息内容__in LPCTSTR lpCaption, //标题框__in UINT uType //消息框的类型如MB_OK
);
LRESULT CALLBACK WindowProc(__in HWND hwnd, //窗口句柄__in UINT uMsg, //message id__in WPARAM wParam, __in LPARAM lParam );
LRESULT DefWindowProc( //默认的消息处理过程,必不可少,消息一旦产生之后,必须找到一个归宿__in HWND hWnd,__in UINT Msg,__in WPARAM wParam,__in LPARAM lParam );
HDC GetDC(__in HWND hWnd );
int ReleaseDC(__in HWND hWnd,__in HDC hDC );
书写文字BOOL TextOut(__in HDC hdc, __in int nXStart, //文字的位置__in int nYStart,__in LPCTSTR lpString, //书写的字符串__in int cbString //字符串的长度
);
HDC BeginPaint(__in HWND hwnd,__out LPPAINTSTRUCT lpPaint );
BOOL EndPaint(__in HWND hWnd,__in const PAINTSTRUCT *lpPaint );
1 #include <windows.h> 2 #include <stdio.h> 3 4 LRESULT CALLBACK WinSunProc( 5 HWND hwnd, // handle to window 6 UINT uMsg, // message identifier 7 WPARAM wParam, // first message parameter 8 LPARAM lParam // second message parameter 9 );10 11 int WINAPI WinMain(12 HINSTANCE hInstance, // handle to current instance13 HINSTANCE hPrevInstance, // handle to previous instance14 LPSTR lpCmdLine, // command line15 int nCmdShow // show state16 )17 {18 WNDCLASS wndcls;19 wndcls.cbClsExtra=0;20 wndcls.cbWndExtra=0;21 wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);22 wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);23 wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);24 wndcls.hInstance=hInstance;25 wndcls.lpfnWndProc=WinSunProc;26 wndcls.lpszClassName="Weixin2003";27 wndcls.lpszMenuName=NULL;28 wndcls.style=CS_HREDRAW | CS_VREDRAW;29 RegisterClass(&wndcls);30 31 HWND hwnd;32 hwnd=CreateWindow("Weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,33 0,0,600,400,NULL,NULL,hInstance,NULL);34 35 ShowWindow(hwnd,SW_SHOWNORMAL);36 UpdateWindow(hwnd);37 38 MSG msg;39 while(GetMessage(&msg,NULL,0,0))40 {41 TranslateMessage(&msg);42 DispatchMessage(&msg);43 }44 return 0;45 }46 47 LRESULT CALLBACK WinSunProc(48 HWND hwnd, // handle to window49 UINT uMsg, // message identifier50 WPARAM wParam, // first message parameter51 LPARAM lParam // second message parameter52 )53 {54 switch(uMsg)55 {56 case WM_CHAR:57 char szChar[20];58 sprintf(szChar,"char is %d",wParam);59 MessageBox(hwnd,szChar,"weixin",0);60 break;61 case WM_LBUTTONDOWN:62 MessageBox(hwnd,"mouse clicked","weixin",0);63 HDC hdc;64 hdc=GetDC(hwnd);65 TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训"));66 ReleaseDC(hwnd,hdc);67 break;68 case WM_PAINT:69 HDC hDC;70 PAINTSTRUCT ps;71 hDC=BeginPaint(hwnd,&ps);72 TextOut(hDC,0,0,"维新培训",strlen("维新培训"));73 EndPaint(hwnd,&ps);74 break;75 case WM_CLOSE:76 if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))77 {78 DestroyWindow(hwnd);79 }80 break;81 case WM_DESTROY:82 PostQuitMessage(0);83 break;84 default:85 return DefWindowProc(hwnd,uMsg,wParam,lParam); //一定要加return呀,否则窗口不会显示86 }87 return 0;88 }
VC++学习(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 ...
- 【MFC】1.Windows程序内部运行原理
1.原理与内容 Windows应用程序,操作系统,计算机硬件之间的相互关系: 向下的箭头③表示应用程序可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声 ...
- VC++的学习(基于VS2008)——windows程序内部运行机制
昨天和今天都在学习windows程序的内部运行机制,再次学习这一章,我明显感到条理清晰了,原来这一章是讲我们所用的电脑,这样一个windows平台下程序运行的内部机制的.windows应用程序下最重要 ...
- 孙鑫-MFC笔记一--Windows程序内部运行机制
对于一个初学者来说,常常会用到各种库函数,例如printf等等,这些库函数是由你所使用的编译器厂商提供的,在Windows操作系统下,开发的应用程序, 也有这样的库函数,不同的是,这样的库函数,是有w ...
- 《VC++深入详解》学习笔记 第一章 Windows程序内部运行机制
(金光鳞闪影若茫) 窗口四步走: 设计窗口类 注册窗口类 创建窗口 显示更新窗口 最后创建消息循环和响应函数 设计窗口类: typedef struct {UINT style;//窗口类型 WNDP ...
- [转]孙鑫VC教程例子代码1---Windows程序内部运行原理
本文转自:http://blog.csdn.net/ljt350740378/article/details/6437113 创建一个完整的窗口需要经过下面四个操作步骤: 设计一个窗口类: 注册窗口类 ...
- python程序只能使用源代码进行运行吗-谈谈 Python 程序的运行原理
因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,谈谈 Python 程序的运行原理 这篇文章准确说是『Python 源码剖析』的 ...
最新文章
- Nuxt项目中使用axios
- mybatis获取mysql存储过程out参数的值_mybatis接受mysql存储过程out的值
- MySQL中count(1),count(*),count(某字段)等用法联系和区别
- Python 字典 values() 方法
- c access mysql数据库_基于C#的Access MsSQL MySQL 三种数据库访问演示(含源文件Demo)...
- MySQL中boolean类型设置
- java函数调用实例_Java使用方法引用实现任意对象的实例方法
- 开启MyBatis(一)
- 如何在 M1 Mac 上运行英特尔应用程序?
- numpy的广播机制
- 托马斯微积分 从入门到失望
- STM32定时器产生指定个数脉冲
- 数仓知识06:什么是元数据?
- Java调用 新浪微博API 接口发微博(包含js微博组件、springMVC新浪登录)详解
- 女生从猫猫身上学到的.........||精品||
- miui11可用的位置模拟器_MIUI11内测体验包
- MarkDown的简介
- System.IO.FileNotFoundException: Could not load file or assembly ‘System.Data.SQLite.dll‘ or one of
- Fabled Rooks UVA - 11134(题意+思路+题解)
- CSS如何修改滚动条的样式?
热门文章
- Win10如何关闭管理员权限运行
- 没有tpm不能装win11的解决方法
- 常用的计算机显示器按其显像原理可分为什么,计算机组装与维护的试卷C答案...
- 表格嵌套_HTML |2| 表格与列表
- car-like robot运动模型及应用分析(图片版)
- kali linux卸载lnmp,kali linux 如何安装lnmp 1.2
- 统计平方和三元组的数目
- 实验4-2-3 验证“哥德巴赫猜想” (20 分)
- Halcon缺陷检测——机器学习1
- 图鸭科技获数千万元A轮融资,金沙江创投领投