📄 controlview.cpp
字号:
void CControlView::SetScrollRangePos(){ RecalcWorkSpaceSize(); if(m_nWorkspace>0){ CScrollBar *cv=(CScrollBar *)(GetParent()->GetDlgItem(AFX_IDW_VSCROLL_FIRST)); //BOOL cv=TRUE; if(cv){ CRect rcClient; GetClientRect(rcClient); SCROLLINFO si; si.cbSize=sizeof SCROLLINFO; memset(&si,0,sizeof SCROLLINFO); si.nPage=rcClient.Height(); si.fMask=SIF_PAGE|SIF_RANGE|SIF_POS; si.nMin=0; CRect rect; GetTreeCtrl().GetItemRect(GetTreeCtrl().GetRootItem(),rect,FALSE); si.nPos=-rect.top; BOOL bHasVScroll=(si.nPage<(unsigned)m_nWorkspace); if(bHasVScroll){ si.nMax=m_nWorkspace/*-si.nPage*/; cv->SetScrollInfo(&si,SIF_PAGE|SIF_RANGE|SIF_POS); //TRACE("SetScrollInfo range=(%d,%d) pos=%d page=%d\n",si.nMin,si.nMax,si.nPos,si.nPage); } if(bHasVScroll!=m_bHasVScroll){ CSplitterWnd *pSplitter=(CSplitterWnd *)GetParent(); DWORD style=(pSplitter->GetScrollStyle()&(~WS_VSCROLL)) |(bHasVScroll*WS_VSCROLL); pSplitter->SetScrollStyle(style); pSplitter->RecalcLayout(); m_bHasVScroll=bHasVScroll; } } }}void CControlView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { CTreeView::OnHScroll(nSBCode, nPos, pScrollBar); SetHScrollPos();}void CControlView::SetHScrollRangePos(){ return;//sdf}void CControlView::SetHScrollPos(){ return;//sdf CRect rcClient; GetClientRect(rcClient); SCROLLINFO si; si.cbSize=sizeof SCROLLINFO; memset(&si,0,sizeof SCROLLINFO); si.fMask=SIF_POS; CRect rect; GetTreeCtrl().GetItemRect(GetTreeCtrl().GetRootItem(),rect,FALSE); si.nPos=-rect.left; const int nCol=0; CScrollBar *cv=(CScrollBar *)(GetParent()->GetDlgItem(AFX_IDW_HSCROLL_FIRST+nCol)); //BOOL cv=TRUE; if(cv && m_bHasHScroll){ cv->SetScrollInfo(&si,SIF_POS); //SetScrollInfo(SB_HORZ,&si,SIF_POS); } }void CControlView::OnMouseMove(UINT nFlags, CPoint point) { CTreeView::OnMouseMove(nFlags, point) ; // Relay the mouse event to the splitter ClientToScreen(&point); GetParent()->ScreenToClient(&point); GetParent()->SendMessage(WM_MOUSEMOVE,(WPARAM)nFlags,MAKELPARAM(point.x,point.y)); }BOOL CControlView::OnMouseWheel(UINT, short zDelta, CPoint) { UINT nScrollCode=((zDelta<0)?SB_LINEDOWN:SB_LINEUP); LPARAM lParam=(LPARAM)GetScrollBarCtrl(SB_VERT)->GetSafeHwnd(); if(lParam){ for(int i=0;i<abs(zDelta)/WHEEL_DELTA;i++){ SendMessage(WM_VSCROLL,MAKEWPARAM(nScrollCode,0),lParam); CConfigTool::GetCellView()->Sync(); } } return TRUE;}void CControlView::RecalcWorkSpaceSize(){ //TRACE("Control view recalcworkspace\n"); CRect rcFirst,rcLast; CConfigToolDoc* pDoc = CConfigTool::GetConfigToolDoc(); if(pDoc->ItemCount()>0){ HTREEITEM h=pDoc->FirstItem()->HItem(); if(h){ GetItemRect(h,rcFirst,FALSE); if(pDoc->ItemCount()>0 && pDoc->Item(pDoc->ItemCount()-1)->HItem()){ for(HTREEITEM h=pDoc->Item(pDoc->ItemCount()-1)->HItem();h;h=GetPrevVisibleItem(h)){ if(GetItemRect(h,rcLast,FALSE)){ m_nWorkspace=rcLast.bottom-rcFirst.top; break; } } } } }}void CControlView::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { switch(nChar){ case VK_F10: if(::GetKeyState(VK_SHIFT)&0x8000){ // Shift key down ShowPopupMenu(GetSelectedItem()); } break; case VK_RETURN: if(nFlags&(1<<13)){ // Alt key down m_hContext=GetSelectedItem(); OnPopupProperties(); } break; } CTreeView::OnSysKeyDown(nChar, nRepCnt, nFlags);}void CControlView::ShowPopupMenu(HTREEITEM h,CPoint point/*=CPoint(-1,-1)*/){ // Display a context menu if(NULL!=h){ Menu menu; menu.LoadMenu(IDR_CONTROLVIEW_POPUP); Menu *pPopup=(Menu *)menu.GetSubMenu(0); if(point.x<0){ CRect rcItem; GetItemRect(h,rcItem,TRUE); point=rcItem.CenterPoint(); ClientToScreen(&point); } m_hContext=h; CConfigItem &ti=TI(m_hContext); CConfigItem::TreeItemType type=ti.Type(); #ifndef PLUGIN menu.LoadToolbar(IDR_MISCBAR); #endif if(!IsChanged(m_hContext,true)){ pPopup->EnableMenuItem(ID_RESTORE_DEFAULTS,MF_BYCOMMAND|MF_GRAYED); } if((CConfigItem::None!=type) || ti.HasBool ()){ const CString strURL(ti.GetURL()); if(strURL.IsEmpty()){ pPopup->EnableMenuItem(ID_VIEW_URL,MF_BYCOMMAND|MF_GRAYED); } } const CFileName strFile(TI(h).FileName()); if(strFile.IsEmpty() || CConfigTool::GetConfigToolDoc()->BuildTree().IsEmpty()){ pPopup->EnableMenuItem(ID_VIEW_HEADER,MF_BYCOMMAND|MF_GRAYED); } if(!TI(h).IsPackage()){ int n=pPopup->GetMenuItemCount(); pPopup->RemoveMenu(n-1,MF_BYPOSITION); pPopup->RemoveMenu(n-2,MF_BYPOSITION); } pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x,point.y,this); }}void CControlView::OnSysChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default CTreeView::OnSysChar(nChar, nRepCnt, nFlags);}CConfigToolDoc * CControlView::GetDocument(){ return CConfigTool::GetConfigToolDoc();}void CControlView::OnViewHeader() { TI(m_hContext).ViewHeader();}void CControlView::OnEditFind() { CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); if(!CConfigTool::GetMain()->m_bFindInProgress){ (new CFindDialog())->Create(pDoc->m_strFind,pDoc->m_nFindFlags&(FR_WHOLEWORD|FR_MATCHCASE|FR_DOWN),pDoc->m_nFindWhere, this); CConfigTool::GetMain()->m_bFindInProgress=true; }}void CControlView::OnEditFindAgain() { CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); DoFind(pDoc->m_strFind,pDoc->m_nFindFlags,pDoc->m_nFindWhere);}LONG CControlView::OnFind(WPARAM wParam, LPARAM lParam){ UNUSED_ALWAYS(wParam); CFindDialog *pDlg=(CFindDialog *)CFindDialog::GetNotifier(lParam); FINDREPLACE &fr=pDlg->m_fr; CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); if(0==(fr.Flags&FR_DIALOGTERM)){ pDoc->m_strFind=fr.lpstrFindWhat; pDoc->m_nFindFlags=fr.Flags; pDoc->m_nFindWhere=pDlg->m_nFindPos; CConfigItem *pItem=DoFind(pDoc->m_strFind,pDoc->m_nFindFlags,pDoc->m_nFindWhere); if(pItem){ // Is the find window on top of the item? CRect rect1,rect2; GetItemRect(pItem->HItem(),rect1,TRUE); ClientToScreen(rect1); pDlg->GetWindowRect(rect2); // screen coords rect1=rect1 & rect2; if(rect1.Height()|rect1.Width()){ int nWidth=rect2.Width(); rect2.left=rect1.right; rect2.right=rect2.left+nWidth; pDlg->MoveWindow(rect2); } } } else { CConfigTool::GetMain()->m_bFindInProgress=false; } return 0;}CConfigItem * CControlView::DoFind(LPCTSTR pszWhat,DWORD dwFlags,WhereType where){ CConfigToolDoc *pDoc=CConfigTool::GetConfigToolDoc(); int nCount=pDoc->ItemCount(); static LPCTSTR arWhereImage[]={_T("name"),_T("macro"),_T("description string"),_T("current value"),_T("default value")}; CString strFind(pszWhat); if(!(dwFlags&FR_MATCHCASE)){ strFind.MakeLower(); } HTREEITEM h=GetSelectedItem(); int nItem; if(!h){ nItem=0; } else { for(nItem=nCount-1;nItem>=0;--nItem) { if(h==pDoc->Item(nItem)->HItem()){ break; } } ASSERT(nItem>=0); } CConfigItem *pItem=NULL; for(int i=0;i<nCount;i++){ if(dwFlags&FR_DOWN){ nItem=(nItem+1)%nCount; } else { nItem=(nCount+nItem-1)%nCount; } pItem=pDoc->Item(nItem); CString strName(pItem->StringValue(where)); if(0==(dwFlags&FR_MATCHCASE)){ strName.MakeLower(); } int nIndex=strName.Find(strFind); if(-1!=nIndex){ if(dwFlags&FR_WHOLEWORD){ // Enforce whole-word semantics: to left and right if(nIndex>0 && IsWordChar(strName[nIndex-1])){ continue; } nIndex+=strFind.GetLength(); if(nIndex<strName.GetLength() && IsWordChar(strName[nIndex])){ continue; } } break; } } if(i<nCount){ if(m_hExpandedForFind){ Expand(m_hExpandedForFind,TVE_COLLAPSE); } HTREEITEM h=pItem->HItem(); // Is h visible? for(HTREEITEM hv=GetFirstVisibleItem();hv;hv=GetNextVisibleItem(hv)){ if(hv==h){ break; } } if(NULL==hv){ // we want to record the highest unexpanded item for(HTREEITEM hv=GetParentItem(h);hv;hv=GetParentItem(hv)){ const UINT selflag = TVIS_EXPANDED; if(0==(GetItemState( hv, selflag ) & selflag )){ m_hExpandedForFind=hv; } } } EnsureVisible(h); SelectItem(h); } else { CUtils::MessageBoxF(_T("Cannot find the %s '%s'"),arWhereImage[where],pszWhat); } return pItem;}bool CControlView::IsWordChar(TCHAR c){ return _istalnum(c) || _TCHAR('_')==c;}void CControlView::OnUpdateEditFindAgain(CCmdUI* pCmdUI) { pCmdUI->Enable(!CConfigTool::GetMain()->m_bFindInProgress && !CConfigTool::GetConfigToolDoc()->m_strFind.IsEmpty() && CWnd::GetFocus() && m_hWnd==CWnd::GetFocus()->m_hWnd); }bool CControlView::SelectItem(const CConfigItem *pItem){#ifdef PLUGIN CConfigTool::GetMain()->ShoweCosBar();#else#endif return SelectItem(pItem->HItem());}void CControlView::OnUpdateEditFind(CCmdUI* pCmdUI) { pCmdUI->Enable(!CConfigTool::GetMain()->m_bFindInProgress); }BOOL CControlView::PreTranslateMessage(MSG* pMsg) { // We handle WM_KEYDOWN here to avoid the problem of the keyboard buffer not being emptied if(WM_KEYDOWN==pMsg->message){ HTREEITEM h=GetSelectedItem(); if(h){ switch(pMsg->wParam){ case VK_SPACE: if(BumpItem(h,0)){ // toggle boolean return true; } break; case VK_TAB: { bool bShift=(::GetKeyState(VK_SHIFT)&0x8000);// Shift key down if(bShift){ h=GetPrevVisibleItem(h); } if(h){ SelectItem(h); if(!CConfigTool::GetCellView()->InCell(h) && !bShift){ h=GetNextVisibleItem(h); if(h){ SelectItem(h); } } } if(NULL==h){ MessageBeep (0xFFFFFFFF); } // Always handle this message to keep focus within the tree control return true; } } } } return CTreeView::PreTranslateMessage(pMsg);}void CControlView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { HTREEITEM h=GetSelectedItem(); if(h){ switch(nChar){ case _TCHAR('>'): if(!BumpItem(h,+1)){ MessageBeep(0xffff); } return; case _TCHAR('<'): if(!BumpItem(h,-1)){ MessageBeep(0xffff); } return; } } CTreeView::OnChar(nChar, nRepCnt, nFlags);}LRESULT CControlView::OnSetFont(WPARAM, LPARAM){ LRESULT rc=Default(); CRect rect; GetItemRect(GetFirstVisibleItem(),rect,FALSE); m_nItemHeight=rect.Height(); RecalcWorkSpaceSize(); return rc;}void CControlView::OnUnload(){ if(IDYES==CUtils::MessageBoxFT(MB_YESNO|MB_DEFBUTTON2,_T("Are you sure you wish to unload this package?"))){ TI(m_hContext).Unload(); CConfigTool::GetConfigToolDoc()->RegenerateData(); }}void CControlView::OnDeleteitem(NMHDR*, LRESULT* pResult) { if(CConfigTool::GetCellView()){ CConfigTool::GetCellView()->Invalidate(); } *pResult = 0;}void CControlView::OnWhatsThis() { DWORD dwPos=GetMessagePos(); HH_POPUP hhp; hhp.cbStruct=sizeof(hhp); hhp.idString=0; hhp.hinst=AfxGetInstanceHandle(); hhp.pszText=TI(m_hContext).Desc(); hhp.pt.x=GET_X_LPARAM(dwPos); hhp.pt.y=GET_Y_LPARAM(dwPos); hhp.clrForeground=(COLORREF)-1; //default hhp.clrBackground=GetSysColor(COLOR_INFOBK); hhp.rcMargins=CRect(-1,-1,-1,-1); hhp.pszFont=NULL; HtmlHelp( m_hWnd, NULL, HH_DISPLAY_TEXT_POPUP, //HH_TP_HELP_CONTEXTMENU, (DWORD)&hhp ); }void CControlView::Refresh(LPCTSTR pszMacroName){ const CConfigItem * pItem=CConfigTool::GetConfigToolDoc()->Find(pszMacroName); if(pItem){ // will be NULL if item has been removed Refresh(pItem->HItem()); }}BOOL CControlView::OnHelpInfo(HELPINFO*) { return CConfigTool::GetConfigToolDoc()->ShowURL(CUtils::LoadString(IDS_CONTROL_VIEW_HELP)); }LRESULT CControlView::OnMenuChar(UINT, UINT, CMenu*){ const MSG *pMsg=GetCurrentMessage(); // punt to the mainframe to deal with shortcuts in popups return AfxGetMainWnd()->SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -