窗口过程到底是怎么实现的?函数代码是什么?
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开源数据库领先者
通过举例,快速理解窗口函数。
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)
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)
2)窗口函数的使用
row_number() over(order by createtime) as cr 这部分为窗口函数。over(order by createtime)为窗口规范,函数 row_number() 即对窗口的数据进行编号。所以上述 sql 的意思为:先对 createtime 进行排序,然后对每行数据进行编号。