窗口过程到底是怎么实现的?函数代码是什么?

 我来答
消逝的光芒0
推荐于2016-10-07 · TA获得超过520个赞
知道小有建树答主
回答量:321
采纳率:0%
帮助的人:181万
展开全部
在Windows中,所有的消息均通过窗口过程函数进行处理,窗口过程函数是我们和Windows操作系统建立联系的唯一途径,窗口过程函数的声明均为:

LRESULT __stdcall WndProc
(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
MSDN有对该函数中的每个参数的详细描述,如果你现在仍然对该函数存在疑问,那么请先参照MSDN中的相关内容后,再继续阅读本文。通常,Windows均要求我们将消息处理函数定义为一个全局函数,或者是一个类中的静态成员函数。并且该函数必须采用__stdcall的调用约定(Calling Convention),因为__stdcall的函数在返回前会自己修正ESP的值(由于参数传递所导致的ESP的改变),从而使ESP的值恢复到函数调用之前的状态。

全局函数或静态成员函数的使用使得我们很难发挥C++的优势(除非你一直想使用C进行Windows程序开发,如果是这样,那么你也就没有必要再继续阅读本文了),因为在这种结构下(即面向过程),我们不能很方便地在消息处理函数中使用我们的C++对象,因为在这样的消息处理函数中,我们很难得到我们对象的指针,从而导致我们不能很方便的操作C++对象中的属性。为了解决对Win32的封装,Microsoft先后推出了MFC和ATL,可以说两者都是非常优秀的解决方案,并且一直为多数用户所使用,为他们在Windows下的程序开发提供了很大的便利。

但是,MFC在我们大家的眼里都是一种比较笨重的方法,使用MFC开发出来的程序都必须要在MFC相关动态库的支持下才能运行,并且这些动态库的大小可不一般(VS2005中的mfc80.dll就有1.04M),更为甚者,CWnd中包含大量的虚函数,所以每个从他继承下来的子类都有一个数量相当可观的虚函数表(虽然通过在存在虚函数的类上使用sizeof得到的结果是该类对象的大小只增长了4个字节,即虚函数表指针,但是该指针所指向的虚函数数组同样需要内存空间来存储。一个虚函数在虚函数表中需占用4个字节,如果在我们的程序中用到较多的CWnd的话,定会消耗不少内存(sizeof(CWnd) = 84,sizeof(CDialog) = 116)。ATL与MFC完全不同,ATL采用模板来对Win32中的所有内容进行封装,使用ATL开发出来的程序不需要任何其他动态库的支持(当然,除基本的Windows库外),ATL使用Thunk将C++对象的指针通过消息处理函数的第一个参数(即hWnd)传入,这样,在消息处理函数中,我们就可以很方便地通过该指针来访问C++对象中的属性和成员函数了,但这种方法也必须要借助几个静态成员函数来实现。

本文将采用这几种技术实现一种完全由C++类成员函数(非静态)实现的Windows消息处理机制,并最终开发一个封装Windows消息处理的工具包(KWIN)。首先让我们来看看怎样使用KWIN来开发的一个简单程序:

创建一个简单的窗口程序:
爱可生云数据库
2021-01-05 · MySQL开源数据库领先者
爱可生云数据库
爱可生,金融级开源数据库和数据云服务整体解决方案提供商;优秀的开源数据库技术,企业级数据处理技术整体解决方案提供商;私有云数据库云服务市场整体解决方案提供商。
向TA提问
展开全部

通过举例,快速理解窗口函数。

2.1 举例

1)创建表 user,表 user 的数据如下

  • mysql> select * from user;+‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+| id | name | address | createtime |+‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+| 1 | aa | cun | 2020‐06‐01 00:00:00 || 2 | bb | cun | 2020‐06‐01 00:00:00 || 3 | bb | shi | 2020‐06‐01 01:00:00 || 4 | bb | shi | 2020‐06‐01 01:00:00 || 5 | cc | cun | 2020‐06‐01 01:00:00 || 6 | tt | cun | 2020‐06‐03 01:00:00 || 7 | eee | cun | 2020‐06‐04 01:00:00 || 8 | eee | cun | 2020‐06‐04 01:00:00 || 9 | xx | shen | 2020‐06‐02 01:00:00 |+‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+9 rows in set (0.00 sec)


  • 2)窗口函数的使用

  • SELECT createtime,row_number() over(order by createtime) AS crFROM user ;+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐+| createtime | ll |+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐+| 2020‐06‐01 00:00:00 | 1 || 2020‐06‐01 00:00:00 | 2 || 2020‐06‐01 01:00:00 | 3 || 2020‐06‐01 01:00:00 | 4 || 2020‐06‐01 01:00:00 | 5 || 2020‐06‐02 01:00:00 | 6 || 2020‐06‐03 01:00:00 | 7 || 2020‐06‐04 01:00:00 | 8 || 2020‐06‐04 01:00:00 | 9 | +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐+9 rows in set (0.00 sec)


  • row_number() over(order by createtime) as cr 这部分为窗口函数。over(order by createtime)为窗口规范,函数 row_number() 即对窗口的数据进行编号。所以上述 sql 的意思为:先对 createtime 进行排序,然后对每行数据进行编号。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式