CString CToolbarHelper::GetTip(UINT nID, LPPOINT pPoint) const { if (!nID) { return _T(""); // separator } // are we over the dropbutton? BOOL bOverDropBtn = FALSE; if (pPoint) { CSize sizeBtn(m_pToolbar->GetToolBarCtrl().GetButtonSize()); CRect rButton; m_pToolbar->GetToolBarCtrl().GetRect(nID, rButton); rButton.left += sizeBtn.cx; if (rButton.PtInRect(*pPoint)) { bOverDropBtn = TRUE; } } CString sTip; // do we have a mapping for this THButton dm; if (m_mapTHButtons.Lookup(nID, dm)) { if (!bOverDropBtn) { // try the default item first if (dm.nDefCmdID && IsCmdEnabled(dm.nDefCmdID)/* && (dm.nDefCmdID != nID)*/) { sTip = GetTip(dm.nDefCmdID); if (!sTip.IsEmpty()) { return sTip; } } } // try override tip if (_tcslen(dm.szTip)) { return dm.szTip; } } return GetTip(nID); }
afx_msg void CServerView::OnUpdateRulerShow(CCmdUI* pCmdUI) { BOOL state = IsCmdEnabled(0, this); // Toggle show/hide menu item to HIDE rulers if currently displayed. // Otherwise, SHOW them. if( !pCmdUI->m_pOther ) OnUpdateShowHideMenu( IDM_RULERSHOW, !( m_lpDisplay && m_lpDisplay->HasRulers ), pCmdUI ); pCmdUI->Enable (state); }
afx_msg void CServerView::OnUpdateHideMarquee(CCmdUI* pCmdUI) { BOOL state = IsCmdEnabled(0, this); CImage *pImage = GetDocument()->GetImage(); if (state && !pImage->GetMask()) state = FALSE; if( !pCmdUI->m_pOther ) OnUpdateShowHideMenu( IDM_HIDEMARQUEE, pImage && !IsMarqueeVisible( pImage ), pCmdUI ); pCmdUI->Enable( state ); }
afx_msg void CServerView::OnUpdatePasteSpecial(CCmdUI* pCmdUI) { if (IsCmdEnabled(0, this)) { COleDataSource *pDataSource = COleDataSource::GetClipboardOwner(); if (pDataSource) pCmdUI->Enable(FALSE); else OnUpdatePaste(pCmdUI); } else pCmdUI->Enable(FALSE); }
afx_msg void CServerView::OnUpdateStitch(CCmdUI* pCmdUI) { BOOL state = IsCmdEnabled(0, this); if (state) { CImage *pImage = GetDocument()->GetImage(); FRMTYPEINFO TypeInfo; pImage->GetTypeInfo(&TypeInfo); if (TypeInfo.DataType == FDT_PALETTECOLOR || pImage->InMaskEditMode()) state = FALSE; } pCmdUI->Enable( state ); }
afx_msg void CServerView::on_update_zoom(int idCmd, CCmdUI* pCmdUI) { if (IsCmdEnabled(0, this) && m_lpDisplay->ViewPercentage) { int inc; if (idCmd == IDC_ZOOMIN) inc = 100; else inc = -100; pCmdUI->Enable( ZoomEnable(GetSafeHwnd(), inc, YES) ); } else pCmdUI->Enable( FALSE ); }
afx_msg void CServerView::OnUpdateHideObjMarquee(CCmdUI* pCmdUI) { BOOL state = IsCmdEnabled(0, this); if (state) { CImage *pImage = GetDocument()->GetImage(); if (pImage->MultipleObjects()) { if( !pCmdUI->m_pOther ) OnUpdateShowHideMenu( IDM_OBJ_HIDEMARQUEE, !pImage->UseObjectMarquee, pCmdUI ); } else state = FALSE; } pCmdUI->Enable(state); }
afx_msg void CServerView::OnUpdatePaste(CCmdUI* pCmdUI) { BOOL state = IsCmdEnabled(0, this); if (state) { state = FALSE; if ( OpenClipboard() ) { if ( IsClipboardFormatAvailable(CF_METAFILEPICT) || // new jtm IsClipboardFormatAvailable(CF_DIB) || IsClipboardFormatAvailable(CF_BITMAP) || IsClipboardFormatAvailable(Control.cfImage) || IsClipboardFormatAvailable(Control.cfImagePP4) ) state = TRUE; CloseClipboard(); } } pCmdUI->Enable( state ); }
LRESULT CToolbarHelper::WindowProc(HWND hRealWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_NOTIFY: { LPNMHDR pNMHDR = (LPNMHDR)lp; switch (pNMHDR->code) { case TBN_DROPDOWN: // check its our toolbar if (pNMHDR->hwndFrom == m_pToolbar->GetSafeHwnd()) { // load the menu LPNMTOOLBAR pNMTB = (LPNMTOOLBAR)pNMHDR; if (DisplayDropMenu((UINT)pNMTB->iItem)) return FALSE; // we handled it } break; #ifndef _UNICODE case TTN_NEEDTEXTA: #else case TTN_NEEDTEXTW: #endif { // to be thorough we will need to handle UNICODE versions of the message also !! TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR; // only handle this if it's not already been done if (pTTT->lpszText && *(pTTT->lpszText)) break; UINT nID = pNMHDR->idFrom; if (pTTT->uFlags & TTF_IDISHWND) // idFrom is actually the HWND of the tool nID = ::GetDlgCtrlID((HWND)nID); // get cursor pos CPoint point(::GetMessagePos()); m_pToolbar->ScreenToClient(&point); // get tip static CString sTipText; sTipText = GetTip(nID, &point); if (!sTipText.IsEmpty()) // will be zero on a separator { pTTT->lpszText = (LPTSTR)(LPCTSTR)sTipText; return TRUE; } } break; case TTN_SHOW: { CWnd* pTooltipCtrl = CWnd::FromHandle(pNMHDR->hwndFrom); ASSERT (pTooltipCtrl); pTooltipCtrl->SendMessage(TTM_SETMAXTIPWIDTH, 0, (m_bMultiline ? m_nMultilineWidth : UINT_MAX)); if (m_pShortcutMgr) { static UINT nIDLastShow = 0; UINT nCmdID = pNMHDR->idFrom; // prevent re-entrancy on same tip if (nCmdID != nIDLastShow) { TOOLINFO ti = { 0 }; ti.cbSize = sizeof(ti); ti.hwnd = *m_pToolbar; // restore callback on last shown item if (nIDLastShow) { ti.uId = nIDLastShow; pTooltipCtrl->SendMessage(TTM_GETTOOLINFO, 0, (LPARAM)&ti); ti.lpszText = LPSTR_TEXTCALLBACK; pTooltipCtrl->SendMessage(TTM_SETTOOLINFO, 0, (LPARAM)&ti); nIDLastShow = 0; } // append shortcut text to new item THButton dm = { 0 }; if (m_mapTHButtons.Lookup(nCmdID, dm)) { if (dm.nDefCmdID) nCmdID = dm.nDefCmdID; } CString sShortcut = m_pShortcutMgr->GetShortcutTextByCmd(nCmdID); if (!sShortcut.IsEmpty()) { // store original id immediately to prevent re-entrancy nIDLastShow = pNMHDR->idFrom; const int TIP_LEN = 80; TCHAR szTip[TIP_LEN] = { 0 }; ti.lpszText = szTip; ti.hwnd = *m_pToolbar; ti.uId = pNMHDR->idFrom; pTooltipCtrl->SendMessage(TTM_GETTEXT, TIP_LEN, (LPARAM)&ti); CString sTip; sTip.Format(_T("%s (%s)"), szTip, sShortcut); ti.lpszText = (LPTSTR)(LPCTSTR)sTip; pTooltipCtrl->SendMessage(TTM_UPDATETIPTEXT, 0, (LPARAM)&ti); pTooltipCtrl->SendMessage(TTM_UPDATE); } } } } break; } } break; case WM_COMMAND: { HWND hCtrlFrom = (HWND)lp; // if m_pToolbar sent the command and we have a mapping for it then // change it to the default cmd for that button if (hCtrlFrom == *m_pToolbar) { THButton dm = { 0 }; UINT nCmdID = LOWORD(wp); if (m_mapTHButtons.Lookup(nCmdID, dm)) { // if we have an enabled default command then send it if (dm.nDefCmdID && IsCmdEnabled(dm.nDefCmdID)) { wp = MAKEWPARAM(dm.nDefCmdID, HIWORD(wp)); } else { BOOL bRes = DisplayDropMenu(nCmdID, TRUE); if (bRes) return 0L; // we handled it } } } } break; case WM_DESTROY: { // must call rest of chain first LRESULT lr = CSubclassWnd::WindowProc(hRealWnd, msg, wp, lp); HookWindow(NULL); return lr; } } return CSubclassWnd::WindowProc(hRealWnd, msg, wp, lp); }
afx_msg void CServerView::OnUpdateSaveShape(CCmdUI* pCmdUI) { pCmdUI->Enable( IsCmdEnabled(0, this) ); }
afx_msg void CServerView::OnUpdateViewAll(CCmdUI* pCmdUI) { pCmdUI->Enable( IsCmdEnabled(0, this) ); }
LRESULT CToolbarHelper::WindowProc(HWND hRealWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg) { case WM_NOTIFY: { LPNMHDR pNMHDR = (LPNMHDR)lp; switch (pNMHDR->code) { case TBN_DROPDOWN: // check its our toolbar if (pNMHDR->hwndFrom == m_pToolbar->GetSafeHwnd()) { // load the menu LPNMTOOLBAR pNMTB = (LPNMTOOLBAR)pNMHDR; if (DisplayDropMenu((UINT)pNMTB->iItem)) { return FALSE; // we handled it } } break; case TTN_NEEDTEXT: { // to be thorough we will need to handle UNICODE versions of the message also !! TOOLTIPTEXT* pTTT = (TOOLTIPTEXT*)pNMHDR; UINT nID = pNMHDR->idFrom; if (pTTT->uFlags & TTF_IDISHWND) // idFrom is actually the HWND of the tool { nID = ::GetDlgCtrlID((HWND)nID); } // get cursor pos CPoint point(::GetMessagePos()); m_pToolbar->ScreenToClient(&point); // get tip static CString sTipText; sTipText = GetTip(nID, &point); if (!sTipText.IsEmpty()) // will be zero on a separator { pTTT->lpszText = (LPTSTR)(LPCTSTR)sTipText; return TRUE; } } break; case TTN_SHOW: { CWnd* pTooltipCtrl = CWnd::FromHandle(pNMHDR->hwndFrom); ASSERT(pTooltipCtrl); pTooltipCtrl->SendMessage(TTM_SETMAXTIPWIDTH, 0, m_bMultiline ? m_nMultilineWidth : UINT_MAX); } break; } } break; case WM_COMMAND: { HWND hCtrlFrom = (HWND)lp; // if m_pToolbar sent the command and we have a mapping for it then // change it to the default cmd for that button if (hCtrlFrom == *m_pToolbar) { THButton dm; UINT nCmdID = LOWORD(wp); if (m_mapTHButtons.Lookup(nCmdID, dm)) { // if we have an enabled default command then send it if (dm.nDefCmdID && IsCmdEnabled(dm.nDefCmdID)) { wp = MAKEWPARAM(dm.nDefCmdID, HIWORD(wp)); } else { BOOL bRes = DisplayDropMenu(nCmdID, TRUE); if (bRes) { return 0L; // we handled it } } } } } break; case WM_KICKIDLE: break; case WM_DESTROY: { // must call rest of chain first LRESULT lr = CSubclassWnd::WindowProc(hRealWnd, msg, wp, lp); HookWindow(NULL); return lr; } } return CSubclassWnd::WindowProc(hRealWnd, msg, wp, lp); }