关于CreateWindowEx及自己封装Window类

今天看msdn的时候发现之前自己封装的Window类写的完全是错误的。封装window类的时候要建立自己的消息处理函数,但是如果是类成员函数的话,一定要是静态类成员函数才行。所以之前我都把消息处理函数里需要调用的函数都写成静态成员函数...

先来看看CreateWindowEx函数:

HWND WINAPI CreateWindowEx(_In_      DWORD dwExStyle,_In_opt_  LPCTSTR lpClassName,_In_opt_  LPCTSTR lpWindowName,_In_      DWORD dwStyle,_In_      int x,_In_      int y,_In_      int nWidth,_In_      int nHeight,_In_opt_  HWND hWndParent,_In_opt_  HMENU hMenu,_In_opt_  HINSTANCE hInstance,_In_opt_  LPVOID lpParam
);

最后一个参数LPVOID lpParam用来传递参数。并可以在响应WM_NCCREATE消息的时候,通过lParam参数获取该参数,代码如下:

        if (uMsg == WM_NCCREATE){CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam;T* pThis = (T*)pCreate->lpCreateParams;SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pThis);       pThis->mhwnd = hwnd; }

其中SetWindowLongPtr函数用来保存该参数,并可通过GetWindowLongPtr函数再次获取该参数:

T* pThis = (T*)GetWindowLongPtr(hwnd, GWLP_USERDATA);

有了这些,就可以不用把处理消息的函数写成静态函数了,方法如下(摘抄自MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/ff381400(v=vs.85).aspx )

template <class DERIVED_TYPE>
class BaseWindow
{
public:static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){DERIVED_TYPE *pThis = NULL;if (uMsg == WM_NCCREATE){CREATESTRUCT* pCreate = (CREATESTRUCT*)lParam;pThis = (DERIVED_TYPE*)pCreate->lpCreateParams;SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pThis);pThis->m_hwnd = hwnd;}else{pThis = (DERIVED_TYPE*)GetWindowLongPtr(hwnd, GWLP_USERDATA);}if (pThis){return pThis->HandleMessage(uMsg, wParam, lParam);}else{return DefWindowProc(hwnd, uMsg, wParam, lParam);}}BaseWindow() : m_hwnd(NULL) { }BOOL Create(PCWSTR lpWindowName,DWORD dwStyle,DWORD dwExStyle = 0,int x = CW_USEDEFAULT,int y = CW_USEDEFAULT,int nWidth = CW_USEDEFAULT,int nHeight = CW_USEDEFAULT,HWND hWndParent = 0,HMENU hMenu = 0){WNDCLASS wc = {0};wc.lpfnWndProc   = DERIVED_TYPE::WindowProc;wc.hInstance     = GetModuleHandle(NULL);wc.lpszClassName = ClassName();RegisterClass(&wc);m_hwnd = CreateWindowEx(dwExStyle, ClassName(), lpWindowName, dwStyle, x, y,nWidth, nHeight, hWndParent, hMenu, GetModuleHandle(NULL), this);return (m_hwnd ? TRUE : FALSE);}HWND Window() const { return m_hwnd; }protected:virtual PCWSTR  ClassName() const = 0;virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) = 0;HWND m_hwnd;
};

View Code

具体就是窗口创建时传递this指针。处理消息时调用

this->HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) 方法

posted on 2014-01-22 22:47 自护意识 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/zihuyishi/p/3530477.html

关于CreateWindowEx及自己封装Window类相关推荐

  1. Directx11学习笔记【二】 将HelloWin封装成类

    我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 My ...

  2. 封装一个类搞定90%安卓客户端与服务器端交互

    本实例封装了一个处理安卓客户端与服务器端交互的几个方法,对于中文乱码问题本实例也找到了解决方案.本例可以处理的场景如下: 1.与服务器端交互json数据. 2.Get方式与服务器端交互数据. 3.Po ...

  3. 第五讲 类的封装和类的继承

    第五讲 类的封装和类的继承 主要内容 软件包的创建和使用 Java访问权限修饰词 类的访问权限修饰词 Java中类的层次结构和类的继承 对象的初始化再讨论   软件包的创建和使用 什么是软件包(pac ...

  4. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Button的command/Label/PhotoImage/封装为类)

    Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Button的command/Label/PhotoImage/封装为类) 目录 tkinter应用案例五 ...

  5. php 仓储 sqlite_详解php封装db类连接sqlite3

    sqlite3_open是sqlite数据库的api函数(C/C++),作用是打开(或创建)一个数据库文件.本文主要和大家分享php封装db类连接sqlite3 的知识,希望能帮助到大家.<?p ...

  6. JAVA——Okhttp封装工具类

    基本概念 OKhttp:一个处理网络请求的开源项目,是安卓端最火热的轻量级框架. Maven <!--OK HTTP Client--><dependency><grou ...

  7. Android的Window类详解

    Android的Window类(一) Android的GUI层并不复杂.它的复杂度类似于WGUI这类基于布局和对话框的GUI,与MFC.Qt等大型框架没有可比性,甚至飞漫魏永明的MiniGUI都比它复 ...

  8. 类的概念、成员函数的定义方式、类的访问控制和封装、类的大小、this指针

    文章目录 类的概念 struct class class和struct的区别是什么呢? 类中成员函数的两种定义方式 声明和定义都在类中 声明和定义分离 类的访问控制和封装 类的封装特性 类的大小 结构 ...

  9. android文件读取工具类,Android 下读取Assets Properties操作封装工具类

    Android 下读取Assets Properties操作封装工具类 发布时间:2018-06-03作者:laosun阅读(2081) 为了方便使用,首先创建BaseApplication类,如下所 ...

  10. 数据库MySQL基础---JDBC开发步骤--JDBC封装工具类--PreparedStatement实现CRUD操作

    JDBC简介 1.JDBC定义Java数据库连接(Java Database Connectivity,简称JDBC):是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询 ...

最新文章

  1. 关于短文本匹配的深度学习模型
  2. 由奥迪车灯想到的前端动画
  3. 十一、非规则组织分析及其数学模型——芦席斜纹组织
  4. Linux指令小记(简明实用)
  5. 大数据Java基础第十二天作业
  6. springMVC使用与生成序列号
  7. JUnit5基本用法
  8. SprinBoot整合SSM之添加
  9. 代替紧急通知_人员紧急替代程序与替代方案的通知
  10. Linux基础知识-文件管理
  11. 修改title旁边的小图标
  12. 台式计算机识别不了鼠标,USB无线鼠标失灵电脑检测不到无法识别怎么办
  13. Linux 怎么防止 ssh 被暴力破解
  14. 已知IP地址和子网掩码计算网络号
  15. 数学四大思想八大方法_四大数学思想
  16. 16进制到ASC 的互转
  17. 客户端访问https时应无浏览器(含终端)安全警告信息;_Http升级Https(Let#x27;s Encrypt)...
  18. 高考成绩等位分查询2021,2019高考等位分查询系统
  19. python之函数的定义
  20. AC78013MDQA车规 杰发MCU 32引脚 128KB QFN封装 AECQ100 Grade1

热门文章

  1. mysql 变量类型_MySQL 变量类型
  2. argmax函数_Python 的Numpy 函数到底是个啥?看这篇就足够了
  3. oracle数据库如何写翻页_ORACLE翻页SQL语句
  4. MySQL — 创建表,插入数据,更新数据,删除数据
  5. C语言 — 转义字符
  6. Python入门:局部变量与全局变量1
  7. 监控mysql的存储引擎
  8. 第一周 7.10-7.16
  9. 加密解密(源自Discuz!NT3.1)
  10. Jmeter多机联合产生负载 (转)