⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ew_object.h

📁 基于Windml2.0的窗口系统原代码 , 以及和MFC CDC兼容的CDC
💻 H
字号:
/*--------------------------------------------------------------------------

	EW_Object.h - 窗口元素类的头文件

	本程序是FishGUI软件的一部分

	版权所有 (C) 2003,2004 王咏武
	http://www.contextfree.net/wangyw/

----------------------------------------------------------------------------

	作者对 FishGUI 软件及其所有源代码授权如下:

	允许任何个人、组织、机构、企业无偿获得、修改、使用、重新发布 FishGUI 软
	件及其源代码,或按照有偿或者无偿的方式发行基于 FishGUI 源代码的全部或部
	分内容开发的软件产品,——但行使以上权利时,须遵守以下约定:

	1、重新发布 FishGUI 软件及其源代码时,不得隐去软件及其源代码中原有的版
	   权信息和开发者标识。

	2、发行基于 FishGUI 源代码的全部或部分内容开发的软件产品时,必须在产品
	   的显著位置标明以下字样:

	   【本产品的一部分功能是基于王咏武在 FishGUI 软件中的工作完成的】

	3、在正式出版物中引用 FishGUI 的文档、源代码或注释内容的,应注明软件的
	   原作者为王咏武。

--------------------------------------------------------------------------*/
/*! \addtogroup Framework
 *  @{ 
 */

/*! \file
 *  \brief 窗口元素类的头文件
 *
*/

#ifndef EW_OBJECT_H_HEADER_INCLUDED_C0AD453B
#define EW_OBJECT_H_HEADER_INCLUDED_C0AD453B

#include "../Utility/EW_Utility.h"
#include "EW_MsgMap.h"
#include "EW_TimerManager.h"
#include "cdc_platform.h"
#include "EW_Common.h"

#define SW_SHOW true
#define SW_HIDE false

//##ModelId=3F52B635008C
/*! \brief 窗口元素类
 *
 *  窗口元素类是所有可以在屏幕上显示的窗口、空间等类的基类
 */
class EW_Object
{
public:
    //##ModelId=3F58382100BB
    /*! \brief 构造函数,可以作为缺省构造函数使用
     *
     *  前景色和背景色缺省为黑色(\ref COLOR_BLACK)和灰色(\ref COLOR_GRAY)
     *  父窗口指针缺省为\ref NULL
     *  \param wID 该窗口元素的唯一标识,缺省值0(0为无效标识)
     *  \param wStyle 该窗口元素的边框风格,缺省值为\ref FS_NONE
     */
    EW_Object(const WORD wID = 0, const WORD wStyle = FS_NONE)
        : m_ForeColor(COLOR_BLACK), m_Background(COLOR_GRAY), m_wStyle(wStyle), m_wID(wID), m_pParent(NULL), m_bIsShowWindow(SW_SHOW) 
        {}

    //##ModelId=3F52BE4E0368
    /*! \brief 构造函数
     *
     *  前景色和背景色缺省为黑色(\ref COLOR_BLACK)和灰色(\ref COLOR_GRAY)
     *  父窗口指针缺省为\ref NULL
     *
     *  \param Rect 该窗口元素的边框矩形
     *  \param wID 该窗口元素的唯一标识,缺省值0(0为无效标识)
     *  \param wStyle 该窗口元素的边框风格,缺省值
     */
    EW_Object(const EW_Rect & Rect, const WORD wID = 0, const WORD wStyle = FS_NONE)
        : m_ForeColor(COLOR_BLACK), m_Background(COLOR_GRAY),
          m_Rect(Rect), m_wStyle(wStyle), m_wID(wID), m_pParent(NULL)
        {}

    //##ModelId=3F52BE4F01BB
    /*! \brief 析构函数
     *
     *  必须为虚函数,删除该窗口元素申请的所有定时器
     */
    virtual ~EW_Object();
    
    //##ModelId=3F52BE4F0251
    /*! \brief 得到该窗口元素的客户区矩形
     *
     *  根据边框风格除去不同的边框大小,客户区矩形可能小于边框矩形,
     *  某一个具体的窗口元素可以覆盖此函数,以确定自己的客户区矩形
     *  \param rect 返回该窗口元素的客户区矩形
     */
    virtual void GetClientRect(EW_Rect & rect) const;

    //##ModelId=3F52BE4F02E7
    /*! \brief 判断某一个像素点是否在本窗口元素中
     *
     *  \param Test 被测试的像素点
     *  \return true 表示像素点在本窗口元素中
     *          false 表示像素点不在本窗口元素中
     */
    bool IsContains(const EW_Point Test) const { return m_Rect.Contains(Test); }
    
    //##ModelId=3F52BE4F0391
    /*! \brief 设置窗口元素的前景色
     *
     *  \param color 前景色
     */
    void ForeColor(const COLORREF color) { m_ForeColor = color; }

    //##ModelId=3F52BE50003F
    /*! \brief 得到窗口元素的前景色
     *
     *  \return 本窗口元素的前景色
     */
    COLORREF ForeColor(void) const { return m_ForeColor; }
    
    //##ModelId=3F52BE5000AE
    /*! \brief 设置窗口元素的背景色
     *
     *  \param color 背景色
     */
    void BGColor(const COLORREF color) { m_Background = color; }

    //##ModelId=3F52BE500144
    /*! \brief 得到窗口元素的背景色
     *
     *  \return 本窗口元素的背景色
     */
    COLORREF BGColor(void) const { return m_Background; }

    //##ModelId=3F52BE500252
    /*! \brief 设置窗口元素的唯一标识值
     *
     *  \param wID 唯一标识值
     */
    void ID(const WORD wID) { m_wID = wID;}

    //##ModelId=3F52BE5001C6
    /*! \brief 得到窗口元素的唯一标识值
     *
     *  \return 本窗口元素的唯一标识值
     */
    WORD ID(void) const { return m_wID;}

    //##ModelId=3F52BE500375
    /*! \brief 设置指向父窗口元素的指针
     *
     *  \param object 指向父窗口元素的指针
     */
    void Parent(EW_Object * const object) { m_pParent = object; }

    //##ModelId=3F52BE5002E8
    /*! \brief 返回指向父窗口元素的指针
     *
     *  \return 指向父窗口元素的指针
     */
    EW_Object * Parent(void) const { return m_pParent; }

    //##ModelId=3F52BE51018B
    /*! \brief 设置窗口元素的边框风格
     *
     *  \param wStyle 边框风格
     */
    void FrameStyle(WORD wStyle)
    {
        wStyle &= FS_MASK;
        m_wStyle &= ~FS_MASK;
        m_wStyle |= wStyle;
    }

    //##ModelId=3F52BE510236
    /*! \brief 得到窗口元素的边框风格
     *
     *  \return 本窗口元素的边框风格
     */
    WORD FrameStyle(void) const { return (m_wStyle & FS_MASK); }

    //##ModelId=3F52BE51036C
    /*! \brief 设置窗口元素的风格
     *
     *  \param wStyle \ref Style
     */
    void Style(const WORD wStyle) { m_wStyle = wStyle; }

    //##ModelId=3F52BE5102CC
    /*! \brief 得到窗口元素的风格
     *
     *  \return 本窗口元素的\ref Style
     */
    WORD Style(void) const { return m_wStyle; }

    //##ModelId=3F6EAC8F00F6
    /*! \brief 设置窗口元素的风格中的焦点位,即把该窗口元素设置为焦点窗口或焦点控件
     *
     *  焦点位\ref GS_FOCUS为1,表示该窗口元素为焦点窗口或焦点控件,即可以得到当前的键盘输入
     *  否则该窗口元素不是输入焦点
     */
    void SetFocus(void) { m_wStyle |= GS_FOCUS; }

    //##ModelId=3F6EAC8F0100
    /*! \brief 清除窗口元素的风格中的焦点位,即把该窗口元素设置为非焦点窗口或非焦点控件
     *
     *  焦点位为1,表示该窗口元素为焦点窗口或焦点控件,即可以得到当前的键盘输入
     *  否则该窗口元素不是输入焦点
     */
    void ResetFocus(void) { m_wStyle &= ~GS_FOCUS; }

    //##ModelId=3F6EAC8F0114
    /*! \brief 该窗口元素是否为当前焦点窗口元素
     *
     *  - 对于窗口,焦点窗口指最上面的窗口
     *  - 对于控件,焦点控件指当前接受输入的控件
     */
    bool IsFocus(void) const { return (m_wStyle & GS_FOCUS) != 0; }

    //##ModelId=3F58382102A6
    /*! \brief 消息分发函数
     *
     *  首先得到消息映射表的指针,从本类直到基类的消息映射表中寻找该消息,
     *  然后,根据消息类型分发消息
     *  \param pMsg 要分发的消息指针
     *  \return 该消息是否已被处理
     *          true    该消息已被处理
     *          false   该消息未被处理
     */
    bool Message(EW_Message * pMsg);
    
    
    //获取窗口元素的占据的矩形区域
    EW_Rect GetObjectPos() { return m_Rect; }
    
    //设置窗口元素的占据的矩形区域
    void SetObjectPos(EW_Rect rect) { m_Rect = rect; }
    
   	bool IsShowWindow() { return m_bIsShowWindow; }
    
    void ShowWindow( bool bIsShowWindow ) {  m_bIsShowWindow = bIsShowWindow; }

protected:
    //##ModelId=3F5DAA1402B2
    /*! \brief 为当前窗口元素启动一个定时器
     *
     *  \param timerID 定时器的唯一标识(对于当前窗口元素唯一)
     *  \param dwInterval 定时器的到期时间
     *  \return 定时器是否成功启动
     *          true    成功
     *          false   失败
     */
    bool StartTimer(const BYTE timerID, const WORD dwInterval);
    
    //##ModelId=3F5DAA140320
    /*! \brief 删除当前窗口元素的定时器
     *
     *  \param timerID 定时器的唯一标识(对于当前窗口元素唯一)
     *  \return 定时器是否成功删除
     *          true    成功
     *          false   失败
     */
    bool KillTimer(const BYTE timerID);
    

    //##ModelId=3F52BE520038
    /*! \brief 绘制窗口元素的边框
     *
     *  \param pAdaptor 指向操作系统适配器的指针
     */
    void DrawBorder(EW_OSAdaptor * pAdaptor);

    //##ModelId=3F603B980280
    /*! \brief 发送通知消息给该窗口元素的父窗口
     *
     *  \param wNotification 通知消息的类型
     */
    void NotifyParent(const WORD wNotification);

    //##ModelId=3F603B9802BC
    /*! \brief 发送要求重画消息给该窗口元素的父窗口
     *
     */
    void RequestDraw();

protected:
    //##ModelId=3F52BE4E01E1
    COLORREF    m_ForeColor;        /*!< \brief 前景色 */
    //##ModelId=3F52BE4E02BF
    COLORREF    m_Background;       /*!< \brief 背景色 */
    //##ModelId=3F52BE4E02DD
    EW_Rect     m_Rect;             /*!< \brief 本窗口元素占据的矩形区域 */

    //##ModelId=3F52BE4E02F1
    WORD        m_wStyle;           /*!< \brief 本窗口元素的边框风格 */

    //##ModelId=3F52BE4E0305
    WORD        m_wID;              /*!< \brief 本窗口元素的唯一标识 */

    //##ModelId=3F52BE4E034D
    EW_Object * m_pParent;          /*!< \brief 指向本窗口元素的父窗口的指针 */

	bool m_bIsShowWindow;

//    DECLARE_MESSAGE_MAP()
private:
    //##ModelId=3F5C4D41037C
    static const EW_MSGMAP_ENTRY    m_MsgEntries[];     /*!< \brief 消息映射表项数组 */

protected:
    //##ModelId=3F5C4D4103CC
    static const EW_MSGMAP          m_MsgMap;           /*!< \brief 本类的消息映射表 */

    //##ModelId=3F5C4D42001F
    /*! \brief 得到本类的消息映射表指针
     *
     *  虚函数,派生类覆盖该函数,来返回自己的消息映射表指针,通过宏\ref BEGIN_MESSAGE_MAP生成
     *  \return 本类的消息映射表指针
     */
    virtual const EW_MSGMAP * GetMessageMap() const;

protected:
    //##ModelId=3F52BE4F01E3
    /*! \brief 重画消息\ref EW_MSG_DRAW的处理函数
     *
     *  按照窗口元素的边框风格绘制边框
     *  \param pAdaptor 指向操作系统适配器的指针
     */
    void OnDraw(EW_OSAdaptor * pAdaptor)
    {
        DrawBorder(pAdaptor);
    }

    //##ModelId=3F6EAC8F0128
    /*! \brief 焦点切换消息\ref EW_MSG_FOCUS的处理函数
     *
     *  \param pMsg 指向焦点切换消息结构的指针
     */
    void OnFocus(EW_Message * pMsg);
};

//##ModelId=3FD884F403D9
/*! \brief 按照标识查找窗口元素的检查类
 *
 *  用于算法函数按照标识查找窗口元素
 */
class EW_CheckObjectID : public EW_ListCheck<EW_Object>
{
public:
    //##ModelId=3FD884F600C5
    /*! \brief 构造函数
     *
     *  \param wID 要查找的窗口元素的唯一标识
     */
    EW_CheckObjectID(const WORD wID) : m_wID(wID) {}

    //##ModelId=3FD884F600CF
    /*! \brief 检查对象是否满足条件
     *
     *  通过比较窗口元素的ID来决定该窗口元素是否满足条件
     *  \param pObj 要检查的窗口元素指针
     *  \return 是否满足条件\n
     *          true    满足条件\n
     *          false   不满足条件
     */
    virtual bool FindIt(const EW_Object * pObj)
    {
        return pObj->ID() == m_wID;
    }

private:
    //##ModelId=3FD884F600A8
    WORD m_wID;                 /*!< \brief 保存要查找的窗口元素的唯一标识 */
            
};

#endif /* EW_OBJECT_H_HEADER_INCLUDED_C0AD453B */

/*! @} */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -