📄 wndx.h
字号:
/*------------------------------------------------------------------------------*\
=============================
模块名称: WndX.h
=============================
[目的]
当我刚开始用VC编程的时候,VC+MFC是我的主要开发手段。在开发过程中,我越来越
发觉,MFC太复杂,而且速度又慢,虽然它在某些方面简化了Windows编程,但综合考虑其
它一些方面的问题,比如说控制的深入性等发面,MFC显然有些力不从新,我还觉得MFC把
WINAPI封装得太严实了,很多细节都被隐藏了。
现在我一直用SDK,我喜欢SDK,虽然它被看来很麻烦。
我还没用写过什么大程序(大概超过10000行的就算大程序了吧),但是我已经发现代
码封装的必要性,SDK虽好,我总不能通篇的回调函数和事件响应函数吧。为此我决定写
一个我自己的窗口封装类,就象MFC中的CWnd一样,但首先应该明白的是,我的窗口封装类
只是MFC中窗口类的简化,而不是重复。有些人或许会说,微软的MFC不错啊,我已经说过,
MFC太慢,我需要的是一个快速的窗口封装类,不要封得太严实。象CWnd类中的一些对窗口
操作的函数,如GetWindowText之类的,根本没有必要去封装,多写个句柄真有那么烦吗?
[描述]
为了封装对窗口的操作,我需要一套组织模式和一组额外类,为了这些,我已经花了很
多时间、想了很多办法。最后我选择了该模块中的方案。模块中有一个CWndMgr类,看
表面意思好象觉得它的作用很大,其实不然,在不断的修改中,它的作用已经和我的本意
不符了,现在,它的唯一作用是:当窗口创建时在其中登记一下,当窗口接收到第一个消
息的时候就删掉。CWndX和MFC中的CWnd类似,它实现了最基本窗口的创建等功能,所有窗
口都由此派生。CWndX比较抽象,一般由它派生类,而不直接由此创建对象。
注意!!:
有几个很重要的全局函数和全局变量,这对外部是不公开的,不允许对这些对象直接访
问。
[用法]
CWndX类比较抽象,请不要直接用它创建对象,你可以从它派生一个类来扩充它的功能.
1.如何派生一个类
每个学过C++的人都知道,class YourClass:plublic CWndX
2.如何响应窗口消息
首先,在你派生得到的类中,一般来说应该有一个形为
LRESULT WndProc(UINT uMsg,WPARAM wParam,LPARAM lParam)
的虚函数,这是消息的入口
如果你用SDK写过程序,那么这将变得很简单,用一个switch语句就可以搞定.在你派
生出的类中,应该有一个WndProc的虚函数,这个函数是WINDOWS消息的入口,就相当于
SDK中的窗口过程函数.在这个函数中,你用一个switch来获得你想要的消息,并定义一
系列响应的函数
[依赖性]
CHash
[修改记录]
版本: 1.01.01
日期: 01-9-19
作者: Brant Q
备注:
这个模块能工作了,而且工作得不错,我用它创建了几个窗口,还用它将一个基于MFC的
模块改写了,基本符合要求.
目前对外只有一个CWndX类,一个CEditX类,和一个CDialogX类,以后如还要用到一些基
本的控件或窗口,将临时扩充此模块.
-----------------------------------
版本: 1.01.02
日期: 01-9-24
作者: Brant Q
备注:
加入了菜单类CMenuX
修正了好多BUG,下面是主要的两个
1.在多线程环境下,有可能出现CWndMgr中访问争夺 --已修正
2.窗口无法收到WM_CREATE及其之前的消息 --已修正
-----------------------------------
版本: 1.01.02
日期: 01-10-12
作者: Brant Q
备注:
原先是用普通线性链表存储窗口对象的,现在改用hash表,由于只有当窗口创建时才涉及
到Hash表的访问,因此性能没有明显提高.
[版权]
2000-2001 115软件工厂 版权所有
\*------------------------------------------------------------------------------*/
#ifndef _WNDX_H_
#define _WNDX_H_
#include <Windows.h>
#include <commctrl.h>
#include "GDIX.h"
#include "Hash.h"
#define WND_OBJ_ID "@" //窗口对象标识
#define WND_OLD_PROC "~" //旧窗口过程
class CWndMgr; //窗口管理类
class CObjectChain; //窗口对象表
class CWndX; //窗口类(基础类)
extern HINSTANCE hInstX; //程序实例句柄
//负责消息派送
LRESULT WINAPI MsgSender(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
//消息预处理
BOOL PreTranslateMessageX(MSG* pMsg);
//初始化X系统
void InitXSystem(HINSTANCE hInst);
///////////////////////////////////////////////////////////////////
//CWndX
class CWndX
{
protected:
HWND m_hWnd;//窗口句柄
public:
CWndX();
virtual ~CWndX();
void operator =(HWND hWnd);
operator HWND() const;
HWND GetHwnd() const;
//创建窗口,支持扩展风格
virtual BOOL Create(DWORD dwExStyle,LPCTSTR lpszClassName,LPCTSTR lpszWindowName,DWORD dwStyle,
const RECT& rect,HWND hParentWnd,HMENU hMenu,LPVOID lpParam=NULL);
BOOL Attach(HWND hWnd);
HWND Detach();
friend class CWndMgr;
friend class CObjectChain;
friend LRESULT WINAPI MsgSender(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
friend BOOL PreTranslateMessageX(MSG* pMsg);
protected:
WNDPROC m_OldProc;//旧窗口句柄
virtual void OnNcDestroy();
virtual BOOL PreTranslateMessage(MSG* pMsg);
//窗口过程
virtual LRESULT WndProc(UINT uMsg,WPARAM wParam,LPARAM lParam);
private:
};
/////////////////////////////////////////////////////
//CWndMgr
class CWndMgr
{
public:
CWndMgr();
virtual ~CWndMgr();
BOOL RemoveObject(CWndX* pWndObj);
BOOL AddObject(CWndX* pWndObj);
friend LRESULT WINAPI MsgSender(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
friend BOOL PreTranslateMessageX(MSG* pMsg);
protected:
CRITICAL_SECTION m_cs;//临界区对象
};
/////////////////////////////////////////
//CDialogX
class CDialogX:public CWndX
{
public:
CDialogX();
virtual ~CDialogX();
//创建一个非模式对话框
BOOL Create(LPCTSTR lpszTemplateName,HWND hWndParent);
//创建一个模式对话框
virtual int DoModal(LPCTSTR lpszTemplateName,HWND hWndParent);
protected:
//消息响应
virtual void OnClose();
virtual void OnNcDestroy();
virtual void OnOK();
virtual void OnCancel();
//
//窗口过程
virtual LRESULT WndProc(UINT uMsg,WPARAM wParam,LPARAM lParam);
private:
BOOL m_bModal;//是否为模式
};
/////////////////////////////////////////////
//CCtrlX 控件基础类
class CCtrlX:public CWndX
{
public:
//创建一个控件
BOOL Create(DWORD dwStyleEx,LPCTSTR pszClass,LPCTSTR pszCaption,DWORD dwStyle, const RECT &rect, HWND hParentWnd, UINT nID);
//与一个已存在控件关联
BOOL Associate(HWND hWndParent,UINT uIDDlgItem);
protected:
virtual LRESULT WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam);
private:
};
/////////////////////////////////////////////////
//CButtonX
class CButtonX:public CCtrlX
{
public:
BOOL Create(LPCTSTR pszCaption,DWORD dwStyle, const RECT &rect, HWND hParentWnd, UINT nID);
protected:
private:
};
////////////////////////////////////////////////
//CEditX
class CEditX:public CCtrlX
{
public:
BOOL Create(LPCTSTR pszCaption,DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
private:
protected:
};
///////////////////////////////////////////////
//CStaticX
class CStaticX:public CCtrlX
{
public:
BOOL Create(LPCTSTR pszCaption,DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
private:
protected:
};
///////////////////////////////////////////////
//CComboBoxX
class CComboBoxX:public CCtrlX
{
public:
BOOL Create(LPCTSTR pszCaption,DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
protected:
private:
};
//////////////////////////////////////////////////
//CListBoxX
class CListBoxX:public CCtrlX
{
public:
BOOL Create(LPCTSTR pszCaption,DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
protected:
private:
};
///////////////////////////////////////////////////
//CScrollBarX
class CScrollBarX:public CCtrlX
{
public:
BOOL Create(DWORD dwStyle,const RECT& rect,HWND hParentWnd,UINT nID);
};
////////////////////////////////////////////////////
//CStatusBarX
class CStatusBarX:public CCtrlX
{
public:
BOOL Create(LPCTSTR pszCaption,DWORD dwStyle, HWND hParentWnd,UINT nID);
};
///////////////////////////////////////////////////
//CToolBarX
class CToolBarX:public CCtrlX
{
public:
BOOL Create(DWORD dwStyle,HWND hParentWnd,UINT nID);
};
/////////////////////////////////////////////////
//CMenuX
class CMenuX
{
public:
CMenuX();
virtual ~CMenuX();
HMENU GetHandle();
BOOL Attach(HMENU hMenu);
HMENU Detach();
protected:
HMENU m_hMenu;
};
#endif//#
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -