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

📄 ew_window.cpp

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

	EW_Window.cpp - 窗口类的实现文件

	本程序是FishGUI软件的一部分

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

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

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

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

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

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

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

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

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

/*! \file
 *  \brief 窗口类的实现文件
 *
*/

/*! @} */

#include "../OSAdaptor/EW_OSAdaptor.h"
#include "EW_Screen.h"
#include "EW_Window.h"

#if defined(WIN32) && defined(_DEBUG)
    /* Trace memory allocation in windows debug version */
    #include <crtdbg.h>
    static char THIS_FILE[] = __FILE__;
    #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif  /* _DEBUG */
    
// VC++下只需要写:
//     ON_DRAW         (OnDraw)
// gcc更严格,必须加类名
BEGIN_MESSAGE_MAP(EW_Window, EW_Container)
    ON_DRAW         (EW_Window::OnDraw)
    ON_KEY          (EW_Window::OnKey)
    ON_MOUSE        (EW_Window::OnMouse)
    ON_DRAWREQUEST  (EW_Window::OnDrawRequest)
    ON_FOCUS        (EW_Window::OnFocus)
END_MESSAGE_MAP()

bool EW_Window::AddWidget(EW_Widget * const pWidget)
{
    if (AddChild(pWidget))
    {
        if (pWidget->CanGetFocus())
        {
            // 把焦点切换到刚添加的控件
	        ChangeFocus(pWidget);
        }
        return true;
    }
    else
        return false;
}

bool EW_Window::RemoveWidget(EW_Widget * pWidget)
{
    if (m_pFocus && m_pFocus == pWidget)
    {		            
        // 如果删除的是当前焦点控件,把焦点指针置为NULL
        // 之后,用户需要自己调整焦点
        ChangeFocus(NULL);
    }
    if (RemoveChild(pWidget))
    {
        // 要求重画
        RequestDraw();
        return true;
    }
    else
        return false;
}

//##ModelId=3F6193A800D6
void EW_Window::GetClientRect(EW_Rect & rect) const
{
	EW_Object::GetClientRect(rect);
	if (m_Title.Length())
		rect.wTop += TITLE_HEIGHT;
}

//##ModelId=3F6193A800F4
void EW_Window::ChangeFocus(EW_Widget * const pWidget)
{
    if (! pWidget || (pWidget && pWidget->CanGetFocus()))
    {
        EW_Message Msg(EW_MSG_FOCUS);
	    if (m_pFocus)
        {
            // 给失去焦点的控件发送焦点失去消息
            Msg.wData = FFS_LOSE;
		    m_pFocus->Message(& Msg);
        }
	    m_pFocus = pWidget;
	    if (m_pFocus)
        {
            // 给得到焦点的控件发送焦点得到消息
            Msg.wData = FFS_GET;
		    m_pFocus->Message(& Msg);
        }
    }
}

bool EW_Window::RegisterKey(const WORD wOrgKey, const WORD wActKey, const WORD wID)
{
    EW_Widget * pTarget = (EW_Widget *)GetChild(wID);
    if (pTarget)
    {
        bool ret = m_KeyMap.RegisterKey(wOrgKey, wActKey, pTarget); 
        if (ret)
        {
//            pTarget->SetCanGetFocus(false);
//            if (pTarget == m_pFocus)
//                ChangeFocus(NULL);	
			;
        }
        return ret;
    }
    else
        return false;
}

//##ModelId=3F584C9403D0
void EW_Window::OnDraw(EW_OSAdaptor * pAdaptor)
{
    pAdaptor->BeginDraw(m_Rect);

    EW_Container::OnDraw(pAdaptor);

    if (m_Title.Length())
    {
        // 画标题
        EW_Rect Rect;
        EW_Object::GetClientRect(Rect);
        Rect.wBottom = Rect.wTop + TITLE_HEIGHT;
        pAdaptor->FillRect(Rect, COLOR_BLUE, COLOR_BLUE);
        pAdaptor->DrawTextW(m_Title.DataGet(), Rect.wLeft + 2, Rect.wTop + 1, COLOR_WHITE);
    }

    // 按照覆盖顺序把EW_MSG_DRAW消息发送给每个子控件,要求他们重画自己
    EW_OBJECTLIST::forward_iterator i;
    for (i = m_ObjectList.First(); ! i.IsDone(); ++ i)
    {
        EW_Message Msg(EW_MSG_DRAW);
        i->Message(& Msg);
    }

    pAdaptor->EndDraw();
}

//##ModelId=3F603B980398
void EW_Window::OnDrawRequest(EW_Message * pMsg)
{
    //  - 如果本窗口为焦点窗口
    //      - 直接发送EW_MSG_DRAW消息给要求重画控件,使其重画自己
    //  - 否则
    //      - 给屏幕对象发送要求重画消息\ref EW_MSG_DRAW_REQUEST
	if (IsFocus())
	{
        EW_Object * pSender = (EW_Object *)pMsg->pData;
        EW_Message Msg(EW_MSG_DRAW);
		pSender->Message(& Msg);
	}
	else
    {
		RequestDraw();
    }
}

//##ModelId=3F5C4AEB0321
bool EW_Window::OnKey(EW_Message * pMsg)
{
    if (pMsg->lData == FVK_TAB)
    {
        // TAB键,按顺序切换焦点
        if (m_pFocus && pMsg->wData == FKS_DOWN)
        {
            EW_OBJECTLIST::loop_iterator i = m_ObjectList.Loop(m_pFocus);
            EW_CheckCanGetFocus tmp;

            if (EW_ListFind_If(i, tmp))
                ChangeFocus((EW_Widget *)(EW_Object *)i);
        }
        return true;
    }
    else
    {
        // 发送给快捷键管理器处理
        // 如果不是快捷键(快捷键管理器未处理),发送给当前焦点窗口
        if (m_KeyMap.SendKey(pMsg))
            return true;
        else if (m_pFocus)
            return m_pFocus->Message(pMsg);
        else
            return false;
    }
}

//##ModelId=3F5C4AEB032B
bool EW_Window::OnMouse(EW_Message * pMsg)
{
    // 把该消息发送给鼠标指针所在的窗口元素,并且使该窗口元素得到焦点
    EW_OBJECTLIST::back_iterator i;
    for (i = m_ObjectList.Last(); ! i.IsDone(); ++ i)
    {
        if (i->IsContains(pMsg->Point))
        {
            if (pMsg->wData == FMS_LBUTTONDOWN)
                ChangeFocus((EW_Widget *)(EW_Object *)i);

            if (i->Message(pMsg))
				return true;
        }
    }
    return false;
}

//##ModelId=3F6193A80162
void EW_Window::OnFocus(EW_Message * pMsg)
{
    if (m_pFocus)
        m_pFocus->Message(pMsg);

    EW_Container::OnFocus(pMsg);
}

⌨️ 快捷键说明

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