void MainDialog::InitWindow() { MONITORINFO oMonitor = {}; oMonitor.cbSize = sizeof(oMonitor); ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor); CDuiRect rcWork = oMonitor.rcWork; CDuiRect rcWnd; GetWindowRect(m_hWnd, &rcWnd); int nWidth = rcWnd.GetWidth(); int nHeight = rcWnd.GetHeight(); SetWindowPos(m_hWnd, HWND_TOPMOST, rcWork.GetWidth() - nWidth - 100, 100, 280, rcWork.GetHeight()-200, SWP_SHOWWINDOW); }
void CMenuWnd::ResizeMenu() { CControlUI* pRoot = m_pm.GetRoot(); #if defined(WIN32) && !defined(UNDER_CE) MONITORINFO oMonitor = {}; oMonitor.cbSize = sizeof(oMonitor); ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor); CDuiRect rcWork = oMonitor.rcWork; #else CDuiRect rcWork; GetWindowRect(m_pOwner->GetManager()->GetPaintWindow(), &rcWork); #endif SIZE szAvailable = { rcWork.right - rcWork.left, rcWork.bottom - rcWork.top }; szAvailable = pRoot->EstimateSize(szAvailable); m_pm.SetInitSize(szAvailable.cx, szAvailable.cy); //必须是Menu标签作为xml的根节点 CMenuUI *pMenuRoot = static_cast<CMenuUI*>(pRoot); ASSERT(pMenuRoot); SIZE szInit = m_pm.GetInitSize(); CDuiRect rc; CDuiPoint point = m_BasedPoint; rc.left = point.x; rc.top = point.y; rc.right = rc.left + szInit.cx; rc.bottom = rc.top + szInit.cy; int nWidth = rc.GetWidth(); int nHeight = rc.GetHeight(); if (m_dwAlignment & eMenuAlignment_Right) { rc.right = point.x; rc.left = rc.right - nWidth; } if (m_dwAlignment & eMenuAlignment_Bottom) { rc.bottom = point.y; rc.top = rc.bottom - nHeight; } SetForegroundWindow(m_hWnd); MoveWindow(m_hWnd, rc.left, rc.top, rc.GetWidth(), rc.GetHeight(), FALSE); SetWindowPos(m_hWnd, HWND_TOPMOST, rc.left, rc.top, rc.GetWidth(), rc.GetHeight() + pMenuRoot->GetInset().bottom + pMenuRoot->GetInset().top, SWP_SHOWWINDOW); }
LRESULT WindowImplBase::OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { LPMINMAXINFO lpMMI = (LPMINMAXINFO) lParam; MONITORINFO oMonitor = {}; oMonitor.cbSize = sizeof(oMonitor); ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTONEAREST), &oMonitor); CDuiRect rcWork = oMonitor.rcWork; CDuiRect rcMonitor = oMonitor.rcMonitor; rcWork.Offset(-oMonitor.rcMonitor.left, -oMonitor.rcMonitor.top); // 计算最大化时,正确的原点坐标 lpMMI->ptMaxPosition.x = rcWork.left; lpMMI->ptMaxPosition.y = rcWork.top; lpMMI->ptMaxTrackSize.x = lpMMI->ptMaxSize.x = rcWork.GetWidth(); lpMMI->ptMaxTrackSize.y = lpMMI->ptMaxSize.y = rcWork.GetHeight(); if (m_PaintManager.GetMaxInfo().cx != 0) { lpMMI->ptMaxTrackSize.x = lpMMI->ptMaxSize.x = m_PaintManager.GetMaxInfo().cx; } if (m_PaintManager.GetMaxInfo().cy != 0) { lpMMI->ptMaxTrackSize.y = lpMMI->ptMaxSize.y = m_PaintManager.GetMaxInfo().cy; } lpMMI->ptMinTrackSize.x =m_PaintManager.GetMinInfo().cx; lpMMI->ptMinTrackSize.y =m_PaintManager.GetMinInfo().cy; bHandled = TRUE; return 0; }
LRESULT WindowImplBase::OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { LPRECT pRect=NULL; if ( wParam == TRUE) { LPNCCALCSIZE_PARAMS pParam = (LPNCCALCSIZE_PARAMS)lParam; pRect=&pParam->rgrc[0]; } else { pRect=(LPRECT)lParam; } if ( ::IsZoomed(m_hWnd)) { // 最大化时,计算当前显示器最适合宽高度 MONITORINFO oMonitor = {}; oMonitor.cbSize = sizeof(oMonitor); ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTONEAREST), &oMonitor); CDuiRect rcWork = oMonitor.rcWork; CDuiRect rcMonitor = oMonitor.rcMonitor; rcWork.Offset(-oMonitor.rcMonitor.left, -oMonitor.rcMonitor.top); pRect->right = pRect->left + rcWork.GetWidth(); pRect->bottom = pRect->top + rcWork.GetHeight(); return WVR_REDRAW; } return 0; }
void CComboBoxUI::PaintStatusImage(HDC hDC) { if (m_sArrowImage.IsEmpty()) CComboUI::PaintStatusImage(hDC); else { // get index if( IsFocused() ) m_uButtonState |= UISTATE_FOCUSED; else m_uButtonState &= ~ UISTATE_FOCUSED; if( !IsEnabled() ) m_uButtonState |= UISTATE_DISABLED; else m_uButtonState &= ~ UISTATE_DISABLED; int nIndex = 0; if ((m_uButtonState & UISTATE_DISABLED) != 0) nIndex = 4; else if ((m_uButtonState & UISTATE_PUSHED) != 0) nIndex = 2; else if ((m_uButtonState & UISTATE_HOT) != 0) nIndex = 1; else if ((m_uButtonState & UISTATE_FOCUSED) != 0) nIndex = 3; // make modify string CDuiString sModify = m_sArrowImage; int nPos1 = sModify.Find(_T("source")); int nPos2 = sModify.Find(_T("'"), nPos1 + 7); if (nPos2 == -1) return; //first int nPos3 = sModify.Find(_T("'"), nPos2 + 1); if (nPos3 == -1) return; //second CDuiRect rcBmpPart; LPTSTR lpszValue = NULL; rcBmpPart.left = _tcstol(sModify.GetData() + nPos2 + 1, &lpszValue, 10); ASSERT(lpszValue); rcBmpPart.top = _tcstol(lpszValue + 1, &lpszValue, 10); ASSERT(lpszValue); rcBmpPart.right = _tcstol(lpszValue + 1, &lpszValue, 10); ASSERT(lpszValue); rcBmpPart.bottom = _tcstol(lpszValue + 1, &lpszValue, 10); ASSERT(lpszValue); m_nArrowWidth = rcBmpPart.GetWidth() / 5; rcBmpPart.left += nIndex * m_nArrowWidth; rcBmpPart.right = rcBmpPart.left + m_nArrowWidth; CDuiRect rcDest(0, 0, m_rcItem.right - m_rcItem.left, m_rcItem.bottom - m_rcItem.top); rcDest.Deflate(GetBorderSize(), GetBorderSize()); rcDest.left = rcDest.right - m_nArrowWidth; CDuiString sSource = sModify.Mid(nPos1, nPos3 + 1 - nPos1); CDuiString sReplace; sReplace.SmallFormat(_T("source='%d,%d,%d,%d' dest='%d,%d,%d,%d'"), rcBmpPart.left, rcBmpPart.top, rcBmpPart.right, rcBmpPart.bottom, rcDest.left, rcDest.top, rcDest.right, rcDest.bottom); sModify.Replace(sSource, sReplace); // draw image if (!DrawImage(hDC, m_sArrowImage, sModify)) m_sNormalImage.Empty(); } }
HRGN CreateTransColorRgn(HDC dc,HWND hwnd,COLORREF TransColor) { COLORREF cl; CDuiRect cRect; HRGN wndRgn; ::GetWindowRect(hwnd,&cRect); wndRgn = ::CreateRectRgn(0,0,cRect.GetWidth(),cRect.GetHeight()); for(int x = 0,len = cRect.GetWidth(); x <= len; x++) { int y1,y2; int height = cRect.GetHeight(); for(y1 = 0; y1 <=height; y1++) { cl = ::GetPixel(dc,x,y1); if(cl == TransColor) { HRGN rgnTemp = ::CreateRectRgn(x, y1, x+1, y1+1); ::CombineRgn(wndRgn,wndRgn,rgnTemp,RGN_XOR); ::DeleteObject(rgnTemp); } else { break; } } for(y2 = height-1; y2 >= y1; y2--) { cl = ::GetPixel(dc,x, y2); if(cl == TransColor) { HRGN rgnTemp = ::CreateRectRgn(x, y2, x+1, y2+1); ::CombineRgn(wndRgn,wndRgn,rgnTemp, RGN_XOR); ::DeleteObject(rgnTemp); } else { break; } } } return wndRgn; }
LRESULT CWkeWebkitWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { CDuiRect rcWnd; ::GetWindowRect(*this, &rcWnd); m_pWebView->resize(rcWnd.GetWidth(), rcWnd.GetHeight()); m_pWebView->tick(); ::InvalidateRect(m_hWnd, NULL, FALSE); return 0; }
void CMenuWnd::AdjustPostion() { CDuiRect rcWnd; GetWindowRect(m_hWnd, &rcWnd); int nWidth = rcWnd.GetWidth(); int nHeight = rcWnd.GetHeight(); rcWnd.left = m_ptPos.x; rcWnd.top = m_ptPos.y; rcWnd.right = rcWnd.left + nWidth; rcWnd.bottom = rcWnd.top + nHeight; MONITORINFO oMonitor = {}; oMonitor.cbSize = sizeof(oMonitor); ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor); CDuiRect rcWork = oMonitor.rcWork; if( rcWnd.bottom > rcWork.bottom ) { if( nHeight >= rcWork.GetHeight() ) { rcWnd.top = 0; rcWnd.bottom = nHeight; } else { rcWnd.bottom = rcWork.bottom; rcWnd.top = rcWnd.bottom - nHeight; } } if( rcWnd.right > rcWork.right ) { if( nWidth >= rcWork.GetWidth() ) { rcWnd.left = 0; rcWnd.right = nWidth; } else { rcWnd.right = rcWork.right; rcWnd.left = rcWnd.right - nWidth; } } ::SetWindowPos(m_hWnd, NULL, rcWnd.left, rcWnd.top, rcWnd.GetWidth(), rcWnd.GetHeight(), SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); }
void CWindowWnd::FullScreen() { ::GetClientRect(m_hWnd,&m_RestoreRect); CPoint point; ::ClientToScreen(m_hWnd,&point); m_RestoreRect.left=point.x; m_RestoreRect.top=point.y; m_RestoreRect.right+=point.x; m_RestoreRect.bottom+=point.y; MONITORINFO oMonitor = {}; oMonitor.cbSize = sizeof(oMonitor); ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTONEAREST), &oMonitor); CDuiRect rcWork = oMonitor.rcWork; ::SetWindowPos( m_hWnd, NULL, rcWork.left, rcWork.top, rcWork.GetWidth(), rcWork.GetHeight(), SWP_SHOWWINDOW | SWP_NOZORDER ); }
LRESULT WindowImplBase::OnGetMinMaxInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { MONITORINFO oMonitor = {}; oMonitor.cbSize = sizeof(oMonitor); ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor); CDuiRect rcWork = oMonitor.rcWork; rcWork.Offset(-oMonitor.rcMonitor.left, -oMonitor.rcMonitor.top); LPMINMAXINFO lpMMI = (LPMINMAXINFO) lParam; lpMMI->ptMaxPosition.x = rcWork.left; lpMMI->ptMaxPosition.y = rcWork.top; lpMMI->ptMaxSize.x = rcWork.GetWidth(); lpMMI->ptMaxSize.y = rcWork.GetHeight(); bHandled = FALSE; return 0; }
BOOL CWin::MoveWindowToPoint(LPPOINT lpPoint) { assert(lpPoint); assert(::IsWindow(m_hWnd)); RECT rcWnd; GetWindowRect(&rcWnd); const int nWidth = rcWnd.right - rcWnd.left; const int nHeight = rcWnd.bottom - rcWnd.top; rcWnd.left = lpPoint->x; rcWnd.top = lpPoint->y; rcWnd.right = rcWnd.left + nWidth; rcWnd.bottom = rcWnd.top + nHeight; MONITORINFO oMonitor = {0}; oMonitor.cbSize = sizeof(oMonitor); ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor); CDuiRect rcWork = oMonitor.rcWork; if( rcWnd.bottom > rcWork.bottom ) { if( nHeight >= rcWork.GetHeight() ) { rcWnd.top = 0; rcWnd.bottom = nHeight; } else { rcWnd.bottom = lpPoint->y;//rcWork.bottom; rcWnd.top = rcWnd.bottom - nHeight; } } if( rcWnd.right > rcWork.right ) { if( nWidth >= rcWork.GetWidth() ) { rcWnd.left = 0; rcWnd.right = nWidth; } else { rcWnd.right = lpPoint->x;//rcWork.right; rcWnd.left = rcWnd.right - nWidth; } } return SetWindowPos(NULL,&rcWnd,SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); }
void CInfoWindow::AdjustWindow(HWND hparent,POINT pt) { if(hparent) ::ClientToScreen(hparent,&pt); CDuiRect rtWnd; GetWindowRect(&rtWnd); const int nWidth = rtWnd.GetWidth(); const int nHeight = rtWnd.GetHeight(); rtWnd.left = pt.x; rtWnd.right = rtWnd.left + nWidth; rtWnd.bottom = pt.y;// - _ptOffsize.cy; rtWnd.top = rtWnd.bottom - nHeight; SetWindowPos(HWND_TOPMOST,&rtWnd,0); // { // CDuiRect rect; // GetWindowRect(&rect); // HDC dc = ::GetDC(m_hWnd); // HDC memdc = ::CreateCompatibleDC(dc); // COLORREF clr = RGB(255,0,255); // COLORREF clrOld = ::SetBkColor(memdc, clr); // ASSERT(clrOld != CLR_INVALID); // if(clrOld != CLR_INVALID) // { // ::ExtTextOut(memdc, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL); // ::SetBkColor(memdc, clrOld); // } // VERIFY(CRenderEngine::DrawImageString(memdc,GetPaintMgr(),rect,rect,GetPaintMgr()->GetRoot()->GetBkImage())); // HRGN hrgn = CreateTransColorRgn(memdc,m_hWnd,clr); // ASSERT(hrgn); // ::SetWindowRgn(m_hWnd,hrgn, true); // ::DeleteObject(hrgn); // ::DeleteDC(memdc); // ::ReleaseDC(m_hWnd,dc); // } Invalidate(FALSE); }
void CControlUI::SetPos(const CDuiRect& rc) { m_rcItem = rc; if(m_rcItem.right < m_rcItem.left) m_rcItem.right = m_rcItem.left; if(m_rcItem.bottom< m_rcItem.top) m_rcItem.bottom = m_rcItem.top; SIZE tmpsz = {m_rcItem.GetWidth(), m_rcItem.GetHeight()}; SetPostSize(tmpsz); if(!IsWindow(m_hWnd) || m_rcItem.IsNull()) return; CDuiRect rct = m_rcItem; rct = m_rcItem; rct.left += m_rcInset.left; rct.top += m_rcInset.top; rct.right -= m_rcInset.right; rct.bottom -= m_rcInset.bottom; ::SetWindowPos(m_hWnd, 0, rct.left, rct.top, rct.GetWidth(), rct.GetHeight(), SWP_NOZORDER); }
void CSysComboUI::SetPos(RECT rc) { __super::SetPos(rc); CDuiRect r = GetPos(); ::SetWindowPos(*m_pWnd,0,r.left, r.top, r.GetWidth(), r.GetHeight(), SWP_NOZORDER | ::IsWindowVisible(*m_pWnd)?SWP_SHOWWINDOW:SWP_HIDEWINDOW); }
LRESULT CMenuWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) { if( uMsg == WM_CREATE ) { if( m_pOwner != NULL) { LONG styleValue = ::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); m_pm.Init(m_hWnd); // The trick is to add the items to the new container. Their owner gets // reassigned by this operation - which is why it is important to reassign // the items back to the righfull owner/manager when the window closes. m_pLayout = new CMenuUI(); m_pm.UseParentResource(m_pOwner->GetManager()); m_pLayout->SetManager(&m_pm, NULL, true); LPCTSTR pDefaultAttributes = m_pOwner->GetManager()->GetDefaultAttributeList(kMenuUIInterfaceName); if( pDefaultAttributes ) { m_pLayout->ApplyAttributeList(pDefaultAttributes); } m_pLayout->SetBkColor(0xFFFFFFFF); m_pLayout->SetBorderColor(0xFF85E4FF); m_pLayout->SetBorderSize(0); m_pLayout->SetAutoDestroy(false); m_pLayout->EnableScrollBar(); for( int i = 0; i < m_pOwner->GetCount(); i++ ) { if(m_pOwner->GetItemAt(i)->GetInterface(kMenuElementUIInterfaceName) != NULL ){ (static_cast<CMenuElementUI*>(m_pOwner->GetItemAt(i)))->SetOwner(m_pLayout); m_pLayout->Add(static_cast<CControlUI*>(m_pOwner->GetItemAt(i))); } } m_pm.AttachDialog(m_pLayout); // Position the popup window in absolute space RECT rcOwner = m_pOwner->GetPos(); RECT rc = rcOwner; int cxFixed = 0; int cyFixed = 0; #if defined(WIN32) && !defined(UNDER_CE) MONITORINFO oMonitor = {}; oMonitor.cbSize = sizeof(oMonitor); ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor); CDuiRect rcWork = oMonitor.rcWork; #else CDuiRect rcWork; GetWindowRect(m_pOwner->GetManager()->GetPaintWindow(), &rcWork); #endif SIZE szAvailable = { rcWork.right - rcWork.left, rcWork.bottom - rcWork.top }; for( int it = 0; it < m_pOwner->GetCount(); it++ ) { if(m_pOwner->GetItemAt(it)->GetInterface(kMenuElementUIInterfaceName) != NULL ){ CControlUI* pControl = static_cast<CControlUI*>(m_pOwner->GetItemAt(it)); SIZE sz = pControl->EstimateSize(szAvailable); cyFixed += sz.cy; if( cxFixed < sz.cx ) cxFixed = sz.cx; } } cyFixed += 4; cxFixed += 4; RECT rcWindow; GetWindowRect(m_pOwner->GetManager()->GetPaintWindow(), &rcWindow); rc.top = rcOwner.top; rc.bottom = rc.top + cyFixed; ::MapWindowRect(m_pOwner->GetManager()->GetPaintWindow(), HWND_DESKTOP, &rc); rc.left = rcWindow.right; rc.right = rc.left + cxFixed; rc.right += 2; bool bReachBottom = false; bool bReachRight = false; LONG chRightAlgin = 0; LONG chBottomAlgin = 0; RECT rcPreWindow = {0}; ContextMenuObserver::Iterator<BOOL, ContextMenuParam> iterator(s_context_menu_observer); ReceiverImplBase<BOOL, ContextMenuParam>* pReceiver = iterator.next(); while( pReceiver != NULL ) { CMenuWnd* pContextMenu = dynamic_cast<CMenuWnd*>(pReceiver); if( pContextMenu != NULL ) { GetWindowRect(pContextMenu->GetHWND(), &rcPreWindow); bReachRight = rcPreWindow.left >= rcWindow.right; bReachBottom = rcPreWindow.top >= rcWindow.bottom; if( pContextMenu->GetHWND() == m_pOwner->GetManager()->GetPaintWindow() || bReachBottom || bReachRight ) break; } pReceiver = iterator.next(); } if (bReachBottom) { rc.bottom = rcWindow.top; rc.top = rc.bottom - cyFixed; } if (bReachRight) { rc.right = rcWindow.left; rc.left = rc.right - cxFixed; } if( rc.bottom > rcWork.bottom ) { rc.bottom = rc.top; rc.top = rc.bottom - cyFixed; } if (rc.right > rcWork.right) { rc.right = rcWindow.left; rc.left = rc.right - cxFixed; rc.top = rcWindow.bottom; rc.bottom = rc.top + cyFixed; } if( rc.top < rcWork.top ) { rc.top = rcOwner.top; rc.bottom = rc.top + cyFixed; } if (rc.left < rcWork.left) { rc.left = rcWindow.right; rc.right = rc.left + cxFixed; } MoveWindow(m_hWnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, FALSE); } else { m_pm.Init(m_hWnd); CDialogBuilder builder; CMenuBuilderCallback menuCallback; CControlUI* pRoot = builder.Create(m_xml, m_sType.GetData(), &menuCallback, &m_pm); m_pm.AttachDialog(pRoot); #if defined(WIN32) && !defined(UNDER_CE) MONITORINFO oMonitor = {}; oMonitor.cbSize = sizeof(oMonitor); ::GetMonitorInfo(::MonitorFromWindow(*this, MONITOR_DEFAULTTOPRIMARY), &oMonitor); CDuiRect rcWork = oMonitor.rcWork; #else CDuiRect rcWork; GetWindowRect(m_pOwner->GetManager()->GetPaintWindow(), &rcWork); #endif SIZE szAvailable = { rcWork.right - rcWork.left, rcWork.bottom - rcWork.top }; szAvailable = pRoot->EstimateSize(szAvailable); m_pm.SetInitSize(szAvailable.cx, szAvailable.cy); DWORD dwAlignment = eMenuAlignment_Left | eMenuAlignment_Top; SIZE szInit = m_pm.GetInitSize(); CDuiRect rc; CDuiPoint point = m_BasedPoint; rc.left = point.x; rc.top = point.y; rc.right = rc.left + szInit.cx; rc.bottom = rc.top + szInit.cy; int nWidth = rc.GetWidth(); int nHeight = rc.GetHeight(); if (dwAlignment & eMenuAlignment_Right) { rc.right = point.x; rc.left = rc.right - nWidth; } if (dwAlignment & eMenuAlignment_Bottom) { rc.bottom = point.y; rc.top = rc.bottom - nHeight; } SetForegroundWindow(m_hWnd); MoveWindow(m_hWnd, rc.left, rc.top, rc.GetWidth(), rc.GetHeight(), FALSE); SetWindowPos(m_hWnd, HWND_TOPMOST, rc.left, rc.top, rc.GetWidth(), rc.GetHeight(), SWP_SHOWWINDOW); } return 0; } else if( uMsg == WM_CLOSE ) { if( m_pOwner != NULL ) { m_pOwner->SetManager(m_pOwner->GetManager(), m_pOwner->GetParent(), false); m_pOwner->SetPos(m_pOwner->GetPos()); m_pOwner->SetFocus(); } } else if( uMsg == WM_RBUTTONDOWN || uMsg == WM_CONTEXTMENU || uMsg == WM_RBUTTONUP || uMsg == WM_RBUTTONDBLCLK ) { return 0L; } else if( uMsg == WM_KILLFOCUS ) { HWND hFocusWnd = (HWND)wParam; BOOL bInMenuWindowList = FALSE; ContextMenuParam param; param.hWnd = GetHWND(); ContextMenuObserver::Iterator<BOOL, ContextMenuParam> iterator(s_context_menu_observer); ReceiverImplBase<BOOL, ContextMenuParam>* pReceiver = iterator.next(); while( pReceiver != NULL ) { CMenuWnd* pContextMenu = dynamic_cast<CMenuWnd*>(pReceiver); if( pContextMenu != NULL && pContextMenu->GetHWND() == hFocusWnd ) { bInMenuWindowList = TRUE; break; } pReceiver = iterator.next(); } if( !bInMenuWindowList ) { param.wParam = 1; param.lParam = NULL; s_context_menu_observer.RBroadcast(param); return 0; } } else if( uMsg == WM_KEYDOWN) { if( wParam == VK_ESCAPE) { Close(); } } LRESULT lRes = 0; if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes; return CWindowWnd::HandleMessage(uMsg, wParam, lParam); }
void CRollTextUI::PaintText(HDC hDC) { if( m_dwTextColor == 0 ) m_dwTextColor = m_pManager->GetDefaultFontColor(); if( m_dwDisabledTextColor == 0 ) m_dwDisabledTextColor = m_pManager->GetDefaultDisabledColor(); DWORD dwTextColor = IsEnabled() ? m_dwTextColor : m_dwDisabledTextColor; CDuiString sText = GetText(); if( sText.IsEmpty() ) return; RECT rcTextPadding = GetTextPadding(); CDuiRect rcClient; rcClient = m_rcItem; rcClient.left += rcTextPadding.left; rcClient.right -= rcTextPadding.right; rcClient.top += rcTextPadding.top; rcClient.bottom -= rcTextPadding.bottom; if(m_nText_W_H > 0) { int nScrollRange = 0; if (m_nRollDirection == ROLLTEXT_LEFT || m_nRollDirection == ROLLTEXT_RIGHT) { //左面移动 nScrollRange = m_nText_W_H + rcClient.GetWidth(); rcClient.Offset((m_nRollDirection == ROLLTEXT_LEFT?rcClient.GetWidth():-rcClient.GetWidth()), 0); rcClient.Offset((m_nRollDirection == ROLLTEXT_LEFT?-m_nScrollPos:m_nScrollPos), 0); rcClient.right += (m_nText_W_H - rcClient.GetWidth()); } else { //上下移动 nScrollRange = m_nText_W_H + rcClient.GetHeight(); rcClient.Offset(0, (m_nRollDirection == ROLLTEXT_UP?rcClient.GetHeight():-rcClient.GetHeight())); rcClient.Offset(0, (m_nRollDirection == ROLLTEXT_UP?-m_nScrollPos:m_nScrollPos)); rcClient.bottom += (m_nText_W_H - rcClient.GetHeight()); } m_nScrollPos += m_nStep; if (m_nScrollPos > nScrollRange) { m_nScrollPos = 0; } } RECT rc = rcClient; UINT uTextStyle = DT_WORDBREAK | DT_EDITCONTROL; if(m_nText_W_H == 0) { uTextStyle |= DT_CALCRECT; //第一次计算文本宽度或高度 if (m_nRollDirection == ROLLTEXT_LEFT || m_nRollDirection == ROLLTEXT_RIGHT) { //左面移动 rc.right += 10000; } else { //上下移动 rc.bottom += 10000; } } if( m_bShowHtml ) { int nLinks = 0; CRenderEngine::DrawHtmlText(hDC, m_pManager, rc, sText, dwTextColor, NULL, NULL, nLinks, m_iFont, uTextStyle); } else { CRenderEngine::DrawText(hDC, m_pManager, rc, sText, dwTextColor, m_iFont, uTextStyle); } if(m_nText_W_H == 0) { m_nText_W_H = (m_nRollDirection == ROLLTEXT_LEFT || m_nRollDirection == ROLLTEXT_RIGHT)?(rc.right - rc.left):(rc.bottom - rc.top); //计算文本宽度或高度 } }
void CVerticalLayoutUI::SetPos(const CDuiRect& rc) { CControlUI::SetPos(rc); if( m_items.IsEmpty() ) return; CDuiRect rct = m_rcItem; rct.left += m_rcInset.left; rct.top += m_rcInset.top; rct.right -= m_rcInset.right; rct.bottom -= m_rcInset.bottom; // Determine the width of elements that are sizeable SIZE szAvailable = {rct.GetWidth(), rct.GetHeight()}; int nAdjustables = 0; int cyFixed = 0; int nEstimateNum = 0; for( int it1 = 0; it1 < m_items.GetSize(); it1++ ) { CControlUI* pControl = static_cast<CControlUI*>(m_items[it1]); if( !pControl->IsVisible() ) continue; SIZE sz = pControl->EstimateSize(szAvailable); if( sz.cy == 0 ) { nAdjustables++; } else { if( sz.cy < pControl->GetMinHeight() ) sz.cy = pControl->GetMinHeight(); if( sz.cy > pControl->GetMaxHeight() ) sz.cy = pControl->GetMaxHeight(); } cyFixed += sz.cy; nEstimateNum++; } // Place elements int cyNeeded = 0; int cyExpand = 0; if( nAdjustables > 0 ) cyExpand = MAX(0, (szAvailable.cy - cyFixed) / nAdjustables); // Position the elements SIZE szRemaining = szAvailable; int iPosY = rct.top; int iPosX = rct.left; int iAdjustable = 0; int cyFixedRemaining = cyFixed; for( int it2 = 0; it2 < m_items.GetSize(); it2++ ) { CControlUI* pControl = static_cast<CControlUI*>(m_items[it2]); if( !pControl->IsVisible() ) continue; SIZE sz = pControl->EstimateSize(szRemaining); if( sz.cy == 0 ) { iAdjustable++; sz.cy = cyExpand; // Distribute remaining to last element (usually round-off left-overs) if( iAdjustable == nAdjustables ) { sz.cy = MAX(0, szRemaining.cy - cyFixedRemaining); } if( sz.cy < pControl->GetMinHeight() ) sz.cy = pControl->GetMinHeight(); if( sz.cy > pControl->GetMaxHeight() ) sz.cy = pControl->GetMaxHeight(); } else { if( sz.cy < pControl->GetMinHeight() ) sz.cy = pControl->GetMinHeight(); if( sz.cy > pControl->GetMaxHeight() ) sz.cy = pControl->GetMaxHeight(); cyFixedRemaining -= sz.cy; } sz.cx = pControl->GetFixedWidth(); if( sz.cx == 0 ) sz.cx = szAvailable.cx; if( sz.cx < 0 ) sz.cx = 0; if( sz.cx < pControl->GetMinWidth() ) sz.cx = pControl->GetMinWidth(); if( sz.cx > pControl->GetMaxWidth() ) sz.cx = pControl->GetMaxWidth(); RECT rcCtrl = { iPosX, iPosY, iPosX + sz.cx, iPosY + sz.cy}; pControl->SetPos(rcCtrl); iPosY += sz.cy; cyNeeded += sz.cy ; szRemaining.cy -= sz.cy; } SIZE sztmp = {m_rcItem.GetWidth(), cyNeeded}; sztmp.cy += m_rcInset.top + m_rcInset.bottom; SetPostSize(sztmp); }
void CSysButtonUI::SetPos(RECT rc) { __super::SetPos(rc); CDuiRect r = GetPos(); if(m_pWnd) ::SetWindowPos(*m_pWnd,0,r.left, r.top, r.GetWidth(), r.GetHeight(), SWP_NOZORDER); }