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;
}
DuiLib 通用窗口类封装
最新推荐文章于 2024-06-11 09:45:10 发布