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;

关于句柄:句柄(HANDLE),资源的标识。

  

  操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分成图标句柄(HICON),光标句柄(HCURSOR),窗口句柄(HWND),应用程序实例句柄(HINSTANCE)、HDC:device context 的句柄等等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。
从变量的类型区分变量的用途

int x,y;

x=30;

y=30;

//x和y既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重。

typedef int WIDTH

typedef int HEIGHT

WIDTH x;

HEIGHT y;

//好处:我们从变量的类型上就可以知道x和y是用来表示宽度和高度。

WinMain函数:Windows程序的入口函数,由系统调用
int WINAPI WinMain(

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 {

  UINT      style;                     //窗口类型
  WNDPROC  lpfnWndProc;           //过程函数(回调函数)
  int       cbClsExtra;                 //窗口类附加内存,一般为0
  int       cbWndExtra;    //窗口附加内存,一般0
  HANDLE   hInstance;    //所属应用程序实例
     HICON     hIcon;     //LoadIcon(NULL,类型),NULL表示使用windows自带的图标;类型为icon的id
     HCURSOR   hCursor;
           HBRUSH    hbrBackground;
      LPCTSTR   lpszMenuName;
     LPCTSTR   lpszClassName;     //窗口类名,注册和创建窗口时使用
  } WNDCLASS;
窗口类的类型
  在我们的程序中经常要用到一类变量,这个变量里的每一位(bit)都对应某一种特性。当该变量的某位为1时,表示有该位对应的那种特性,当该位为0时,即没有该位所对应的特性。当变量中的某几位同时为1时,就表示同时具有几种特性的组合。一个变量中的哪一位代表哪种意义,不容易记忆,所以我们经常根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该特征相对应的那一(bit)为1,其余的bit都为0。我们使用goto definition就能发现CS_VREDRAW=0x0001,CS_HREDRAW=0x0002,CS_DBLCLKS =0x0008,CS_NOCLOSE=0x0200。他们的共同点就是只有一位为1,其余位都为0。如果我们希望某一变量的数值既有CS_VREDRAW特性,又有CS_HREDRAW特性,我们只需使用二进制OR(|)操作符将他们进行或运算相组合,如style=CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE。如果我们希望在某一变量原有的几个特征上去掉其中一个特征,用取反(~)之后再进行与(&)运算,就能够实现,如在刚才的style的基础上去掉CS_NOCLOSE特征,可以用style & ~CS_NOCLOSE实现。
窗口过程函数
  第二个成员变量lpfnWndProc指定了这一类型窗口的过程函数,也称回调函数。回调函数的原理是这样的,当应用程序收到给某一窗口的消息时(还记得前面讲过的消息通常与窗口相关的吗?),就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的。
  举例:汽车厂家生产汽车好比应用程序创建窗口,用户使用汽车好比操作系统管理窗口,某种汽车在销售前就指定好了修理站(类似回调函数),当用户的汽车出现故障后(类似窗口收到消息),汽车用户(类似操作系统)自己直接找到修理站去修理,不用厂家(类似应用程序)亲自将车送到修理站去修理,但修理站还得由厂家事先建造好。
消息处理函数
  获取消息:获得WM_QUIT消息时返回为0
BOOL GetMessage(__out  LPMSG lpMsg,     //要被填充的消息结构体__in   HWND hWnd,       //获取哪一个窗口的消息,NULL表示获取应用程序所拥有的消息队列中的所有消息__in   UINT wMsgFilterMin,  //消息的最小值如WM_KEYFIRST,以一条消息__in   UINT wMsgFilterMax
);

转化消息:例如将WM_KEYDOWN和WM_KEYUP消息转换为WM_CHAR消息 

BOOL TranslateMessage(__in  const MSG *lpMsg
);

分发消息:将消息发送给操作系统,再由系统发给窗口分发函数
LRESULT DispatchMessage(__in  const MSG *lpmsg
);

  消息盒子:弹出消息框,返回值为ID_?,如YES等

int MessageBox(__in  HWND hWnd,    __in  LPCTSTR lpText,    //消息内容__in  LPCTSTR lpCaption,  //标题框__in  UINT uType      //消息框的类型如MB_OK
);


过程函数:  LRESULT为Long型
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
);

绘制图形文字: 
  获得与释放窗口的DC(画布)
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      //字符串的长度
);  

  重新与结束绘制窗口:  只能用于响应WM_PAINT消息

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

  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. 【MFC】1.Windows程序内部运行原理

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Nuxt项目中使用axios
  2. mybatis获取mysql存储过程out参数的值_mybatis接受mysql存储过程out的值
  3. MySQL中count(1),count(*),count(某字段)等用法联系和区别
  4. Python 字典 values() 方法
  5. c access mysql数据库_基于C#的Access MsSQL MySQL 三种数据库访问演示(含源文件Demo)...
  6. MySQL中boolean类型设置
  7. java函数调用实例_Java使用方法引用实现任意对象的实例方法
  8. 开启MyBatis(一)
  9. 如何在 M1 Mac 上运行英特尔应用程序?
  10. numpy的广播机制
  11. 托马斯微积分 从入门到失望
  12. STM32定时器产生指定个数脉冲
  13. 数仓知识06:什么是元数据?
  14. Java调用 新浪微博API 接口发微博(包含js微博组件、springMVC新浪登录)详解
  15. 女生从猫猫身上学到的.........||精品||
  16. miui11可用的位置模拟器_MIUI11内测体验包
  17. MarkDown的简介
  18. System.IO.FileNotFoundException: Could not load file or assembly ‘System.Data.SQLite.dll‘ or one of
  19. Fabled Rooks UVA - 11134(题意+思路+题解)
  20. CSS如何修改滚动条的样式?

热门文章

  1. Win10如何关闭管理员权限运行
  2. 没有tpm不能装win11的解决方法
  3. 常用的计算机显示器按其显像原理可分为什么,计算机组装与维护的试卷C答案...
  4. 表格嵌套_HTML |2| 表格与列表
  5. car-like robot运动模型及应用分析(图片版)
  6. kali linux卸载lnmp,kali linux 如何安装lnmp 1.2
  7. 统计平方和三元组的数目
  8. 实验4-2-3 验证“哥德巴赫猜想” (20 分)
  9. Halcon缺陷检测——机器学习1
  10. 图鸭科技获数千万元A轮融资,金沙江创投领投