DuiLib 通用窗口类封装

classWindowImplBase : publicCWindowWnd, publicINotifyUI, publicIMessageFilterUI, publicIDialogBuilderCallback
{
public:
    WindowImplBase();
    virtual~WindowImplBase();
 
    virtualvoid OnFinalMessage(HWNDhWnd);
 
    virtualvoid Init();
 
    virtualCControlUI* CreateControl(LPCTSTRpstrClass, CPaintManagerUI* pManager);
 
    virtualLRESULT MessageHandler(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT OnClose(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT OnDestroy(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
#if defined(UI_BUILD_FOR_WIN32) && !defined(UI_BUILD_FOR_WINCE)
    virtualLRESULT OnNcActivate(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT OnNcCalcSize(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT OnNcPaint(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT OnNcHitTest(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT OnGetMinMaxInfo(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
#endif
 
    virtualLRESULT OnSize(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);    
 
    virtualLRESULT OnSysCommand(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT OnCreate(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT OnKeyDown(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT OnKillFocus(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT OnSetFocus(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT OnLButtonDown(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT OnLButtonUp(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
    virtualLRESULT HandleMessage(UINTuMsg, WPARAMwParam, LPARAMlParam);
 
    virtualLRESULT HandleCustomMessage(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled);
 
protected:
    virtualtString GetSkinFolder();
    virtualtString GetSkinFile() = 0;
 
    virtualLRESULT ResponseDefaultKeyEvent(WPARAMwParam);
 
protected:
    CPaintManagerUI paint_manager_;
};
 
 
 
 
WindowImplBase::WindowImplBase()
{}
 
WindowImplBase::~WindowImplBase()
{}
 
CControlUI* WindowImplBase::CreateControl(LPCTSTRpstrClass, CPaintManagerUI* pManager)
{
    returnNULL;
}
 
voidWindowImplBase::OnFinalMessage(HWND/*hWnd*/)
{
    paint_manager_.RemovePreMessageFilter(this);
    paint_manager_.RemoveNotifier(this);
    paint_manager_.ReapObjects(paint_manager_.GetRoot());
}
 
voidWindowImplBase::Init()
{}
 
LRESULTWindowImplBase::OnClose(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL& bHandled)
{
    bHandled = FALSE;
    return0;
}
 
LRESULTWindowImplBase::OnDestroy(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL& bHandled)
{
    bHandled = FALSE;
    return0;
}
 
#if defined(UI_BUILD_FOR_WIN32) && !defined(UI_BUILD_FOR_WINCE)
LRESULTWindowImplBase::OnNcActivate(UINT/*uMsg*/,WPARAMwParam, LPARAM/*lParam*/,BOOL&/*bHandled*/)
{
    return(wParam == 0) ? TRUE : FALSE;
}
 
LRESULTWindowImplBase::OnNcCalcSize(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL&/*bHandled*/)
{
    return0;
}
 
LRESULTWindowImplBase::OnNcPaint(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL&/*bHandled*/)
{
    return0;
}
 
LRESULTWindowImplBase::OnNcHitTest(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled)
{
    POINT pt; pt.x = GET_X_LPARAM(lParam); pt.y = GET_Y_LPARAM(lParam);
    ::ScreenToClient(*this, &pt);
 
    RECT rcClient;
    ::GetClientRect(*this, &rcClient);
 
    //if( !::IsZoomed(*this) ) {
    //  RECT rcSizeBox = paint_manager_.GetSizeBox();
    //  if( pt.y < rcClient.top + rcSizeBox.top ) {
    //      if( pt.x < rcClient.left + rcSizeBox.left ) return HTTOPLEFT;
    //      if( pt.x > rcClient.right - rcSizeBox.right ) return HTTOPRIGHT;
    //      return HTTOP;
    //  }
    //  else if( pt.y > rcClient.bottom - rcSizeBox.bottom ) {
    //      if( pt.x < rcClient.left + rcSizeBox.left ) return HTBOTTOMLEFT;
    //      if( pt.x > rcClient.right - rcSizeBox.right ) return HTBOTTOMRIGHT;
    //      return HTBOTTOM;
    //  }
    //  if( pt.x < rcClient.left + rcSizeBox.left ) return HTLEFT;
    //  if( pt.x > rcClient.right - rcSizeBox.right ) return HTRIGHT;
    //}
 
    RECT rcCaption = paint_manager_.GetCaptionRect();
    if( pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right \
        && pt.y >= rcCaption.top && pt.y < rcCaption.bottom ) {
            CControlUI* pControl = static_cast<CControlUI*>(paint_manager_.FindControl(pt));
            if( pControl && _tcsicmp(pControl->GetClass(), _T("ButtonUI")) != 0 && 
                _tcsicmp(pControl->GetClass(), _T("OptionUI")) != 0 &&
                _tcsicmp(pControl->GetClass(), _T("TextUI")) != 0 )
                returnHTCAPTION;
    }
 
    returnHTCLIENT;
}
 
LRESULTWindowImplBase::OnGetMinMaxInfo(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled)
{
    MONITORINFO oMonitor = {};
    oMonitor.cbSize = sizeof(oMonitor);
    ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor);
    CRect rcWork = oMonitor.rcWork;
    rcWork.Offset(-rcWork.left, -rcWork.top);
 
    LPMINMAXINFO lpMMI = (LPMINMAXINFO) lParam;
    lpMMI->ptMaxPosition.x   = rcWork.left;
    lpMMI->ptMaxPosition.y   = rcWork.top;
    lpMMI->ptMaxSize.x       = rcWork.right;
    lpMMI->ptMaxSize.y       = rcWork.bottom;
 
    bHandled = FALSE;
    return0;
}
#endif
 
 
LRESULTWindowImplBase::OnSetFocus(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL& bHandled)
{
    bHandled = FALSE;
    return0;
}
 
LRESULTWindowImplBase::OnLButtonDown(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL& bHandled)
{
    bHandled = FALSE;
    return0;
}
 
LRESULTWindowImplBase::OnLButtonUp(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL& bHandled)
{
    bHandled = FALSE;
    return0;
}
 
LRESULTWindowImplBase::OnKeyDown(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL& bHandled)
{
    bHandled = FALSE;
    return0;
}
 
LRESULTWindowImplBase::OnKillFocus(UINT/*uMsg*/,WPARAM/*wParam*/,LPARAM/*lParam*/,BOOL& bHandled)
{
    bHandled = FALSE;
    return0;
}
 
LRESULTWindowImplBase::OnSize(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled)
{
    SIZE szRoundCorner = paint_manager_.GetRoundCorner();
#if defined(UI_BUILD_FOR_WIN32) && !defined(UI_BUILD_FOR_WINCE)
    if( !::IsIconic(*this) && (szRoundCorner.cx != 0 || szRoundCorner.cy != 0) ) {
        CRect rcWnd;
        ::GetWindowRect(*this, &rcWnd);
        rcWnd.Offset(-rcWnd.left, -rcWnd.top);
        rcWnd.right++; rcWnd.bottom++;
        HRGNhRgn = ::CreateRoundRectRgn(rcWnd.left, rcWnd.top, rcWnd.right, rcWnd.bottom, szRoundCorner.cx, szRoundCorner.cy);
        ::SetWindowRgn(*this, hRgn, TRUE);
        ::DeleteObject(hRgn);
    }
#endif
    bHandled = FALSE;
    return0;
}
 
 
LRESULTWindowImplBase::OnSysCommand(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled)
{
    if(wParam == SC_CLOSE){
        bHandled = TRUE;
        return0;
    }
#if defined(UI_BUILD_FOR_WIN32) && !defined(UI_BUILD_FOR_WINCE)
    BOOLbZoomed = ::IsZoomed(*this);
    LRESULTlRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam);
    if( ::IsZoomed(*this) != bZoomed ){
    }
#else
    LRESULTlRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam);
#endif
    returnlRes;
}
 
tString WindowImplBase::GetSkinFolder()
{
    returntString(CPaintManagerUI::GetInstancePath()) + _T("Skins\\");
}
 
LRESULTWindowImplBase::OnCreate(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled)
{
    LONGstyleValue = ::GetWindowLong(*this, GWL_STYLE);
    styleValue &= ~WS_CAPTION;
    ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
    RECT rcClient;
    ::GetClientRect(*this, &rcClient);
    ::SetWindowPos(*this, NULL, rcClient.left, rcClient.top, rcClient.right - rcClient.left, \
        rcClient.bottom - rcClient.top, SWP_FRAMECHANGED);
 
    paint_manager_.Init(m_hWnd);
    paint_manager_.AddPreMessageFilter(this);
 
    CDialogBuilder builder;
 
    paint_manager_.SetResourcePath(GetSkinFolder().c_str());
 
#if USE(ZIP_SKIN)
 
#if defined(UI_BUILD_FOR_WINCE)
    staticbool resource_unzipped = false;
    if(!resource_unzipped)
    {
        resource_unzipped = true;
        paint_manager_.SetResourceZip(GlobalVariable::kResourceSkinZipFileName);
        paint_manager_.UnzipResource();
        paint_manager_.SetResourceZip(GlobalVariable::kNullString);
    }
    tString tstrSkin = paint_manager_.GetResourcePath();
    tstrSkin += GetSkinFile();
#else
    paint_manager_.SetResourceZip(GlobalVariable::kResourceSkinZipFileName);
    tString tstrSkin = GetSkinFile();
#endif
 
#else
    tString tstrSkin = paint_manager_.GetResourcePath();
    tstrSkin += GetSkinFile();
#endif
    CControlUI* pRoot = builder.Create(tstrSkin.c_str(), (UINT)0,this, &paint_manager_);
    paint_manager_.AttachDialog(pRoot);
    paint_manager_.AddNotifier(this);
 
    Init();
    return0;
}
 
LRESULTWindowImplBase::HandleCustomMessage(UINTuMsg, WPARAMwParam, LPARAMlParam, BOOL& bHandled)
{
    bHandled = FALSE;
    return0;
}
 
LRESULTWindowImplBase::HandleMessage(UINTuMsg, WPARAMwParam, LPARAMlParam)
{
    LRESULTlRes = 0;
    BOOLbHandled = TRUE;
    switch(uMsg)
    {
    caseWM_CREATE:         lRes = OnCreate(uMsg, wParam, lParam, bHandled); break;
    caseWM_CLOSE:          lRes = OnClose(uMsg, wParam, lParam, bHandled); break;
    caseWM_DESTROY:        lRes = OnDestroy(uMsg, wParam, lParam, bHandled); break;
#if defined(UI_BUILD_FOR_WIN32) && !defined(UI_BUILD_FOR_WINCE)
    caseWM_NCACTIVATE:     lRes = OnNcActivate(uMsg, wParam, lParam, bHandled); break;
    caseWM_NCCALCSIZE:     lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled); break;
    caseWM_NCPAINT:        lRes = OnNcPaint(uMsg, wParam, lParam, bHandled); break;
    caseWM_NCHITTEST:      lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled); break;
    caseWM_GETMINMAXINFO:  lRes = OnGetMinMaxInfo(uMsg, wParam, lParam, bHandled); break;
#endif
    caseWM_SIZE:           lRes = OnSize(uMsg, wParam, lParam, bHandled); break;  
    caseWM_SYSCOMMAND:     lRes = OnSysCommand(uMsg, wParam, lParam, bHandled); break;
    caseWM_KEYDOWN:        lRes = OnKeyDown(uMsg, wParam, lParam, bHandled); break;
    caseWM_KILLFOCUS:      lRes = OnKillFocus(uMsg, wParam, lParam, bHandled); break;
    caseWM_SETFOCUS:       lRes = OnSetFocus(uMsg, wParam, lParam, bHandled); break;
    caseWM_LBUTTONUP:      lRes = OnLButtonUp(uMsg, wParam, lParam, bHandled); break;
    caseWM_LBUTTONDOWN:    lRes = OnLButtonDown(uMsg, wParam, lParam, bHandled); break;
    default:                bHandled = FALSE; break;
    }
    if(bHandled) returnlRes;
 
    lRes = HandleCustomMessage(uMsg, wParam, lParam, bHandled);
    if(bHandled) returnlRes;
 
    if(paint_manager_.MessageHandler(uMsg, wParam, lParam, lRes)) returnlRes;
    returnCWindowWnd::HandleMessage(uMsg, wParam, lParam);
}
 
LRESULTWindowImplBase::MessageHandler(UINTuMsg, WPARAMwParam, LPARAM/*lParam*/,BOOL&/*bHandled*/)
{
    if(uMsg == WM_KEYDOWN)
    {
        switch(wParam)
        {
        caseVK_RETURN:
        caseVK_ESCAPE:
            returnResponseDefaultKeyEvent(wParam);
        default:
            break;
        }
    }
    returnFALSE;
}
 
LRESULTWindowImplBase::ResponseDefaultKeyEvent(WPARAMwParam)
{
    if(wParam == VK_RETURN)
    {
        returnFALSE;
    }
    elseif (wParam == VK_ESCAPE)
    {
        Close();
        returnTRUE;
    }
 
    returnFALSE;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值