coolbar吧 关注:7贴子:514
  • 6回复贴,共1

Coolbar在VC中的应用

只看楼主收藏回复

 
BEGIN_EVENTSINK_MAP(CMainFrame, CWnd) 
    //{{AFX_EVENTSINK_MAP(CMainFrame) 
        ON_EVENT(CMainFrame, IDC_ACTIVEBAR, 71, OnActiveBarClick, VTS_DISPATCH) 
        //}}AFX_EVENTSINK_MAP 
END_EVENTSINK_MAP() 
 
Note: The dispatch id constants are located in the file dispids.h 
 
3- Add event handler to mainfrm.cpp 
 
void CMainFrame::OnActiveBarClick(LPDISPATCH pDisp) 

        ITool *pTool=(ITool *)pDisp; 
        LONG id; 
        pTool->get_ToolID(&id); 
        if (id!=0) 
                SendMessage(WM_COMMAND,MAKELONG(id,0),NULL); 

 
As you see hooking up the toolbar click event to commands is very easy since the
 toolid's of tool objects map 1-to-1 to command ids of the WordPad application.  
 
 
Filling the font name and size combobox 
 
To fill ActiveBar's font name and size combobox objects, we will define a class 
to enumerate fonts and use ActiveBars tool.CBList property for filling the combobox 
list. The source code is provided in fenum.h and fenum.cpp files. 
 
To fill the font combobox use the following code 
 
void CMainFrame::FillFontCombo() 

        VARIANT v; 
        CTool tool; 
 
        // Get tool by tool name 
        v.vt=VT_BSTR; 
        v.bstrVal=SysAllocString(L"FontName"); 
        tool=m_bar.GetTools().Item(&v); 
        VariantClear(&v); 
 
        // Set properties of the combobox 
        tool.SetCBStyle(2);     // sort 
        tool.SetCBWidth(180);   // set combolist width 
 
        // Get combolist object of the tool and fill font names 
        CComboList clist=tool.GetCBList(); 
        clist.Clear(); 
        int cnt,fontCount; 
        CString name; 
        fontCount=m_fontEnum.GetFontCount(); 
        for (cnt=0;cntget_Enabled(&bPrevEnabled); 
        if (bOn && (!bPrevEnabled)) 
                pTool->put_Enabled(VARIANT_TRUE); 
        if ((!bOn) && bPrevEnabled) 
                pTool->put_Enabled(VARIANT_FALSE); 

 
void CToolCmdUI::SetCheck(int nCheck) 

        ASSERT(nCheck >= 0 && nCheck <= 2); // 0=>off, 1=>on, 2=>indeterminate 
 
        CMainFrame *pMainFrame=(CMainFrame *)m_pOther; 
        ASSERT(pMainFrame!= NULL); 
        ASSERT_KINDOF(CMainFrame, pMainFrame); 
        ASSERT(m_nIndex < m_nIndexMax); 
 
        VARIANT_BOOL bPrevChecked; 
        pTool->get_Checked(&bPrevChecked); 
        if (nCheck==1 && (!bPrevChecked)) 
                pTool->put_Checked(VARIANT_TRUE); 
        if (nCheck!=1 && bPrevChecked) 
                pTool->put_Checked(VARIANT_FALSE); 

 
void CToolCmdUI::SetText(LPCTSTR) 

// ignore 

 
void TwipsToPointString(LPTSTR lpszBuf, int nTwips) 

        ASSERT(lpszBuf != NULL); 
        lpszBuf[0] = NULL; 
        if (nTwips >= 0) 
        { 
                // round to nearest half point 
                nTwips = (nTwips+5)/10; 
                if ((nTwips%2) == 0) 
                        _stprintf(lpszBuf, _T("%ld"), nTwips/2); 
                else 
                        _stprintf(lpszBuf, _T("%.1f"), (float)nTwips/2.F); 



2楼2006-12-09 17:38
回复
            } 

     
    void CMainFrame::UpdateActiveBarCommandUI() 

            CToolCmdUI state; 
            state.m_pOther = this; 
     
            CTool tool; 
            VARIANT v; 
            v.vt=VT_I2; 
     
            state.m_nIndexMax = m_bar.GetTools().Count(); 
     
            for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax; state.m_nIndex++) 
            { 
                    v.iVal=state.m_nIndex; 
                    tool=m_bar.GetTools().Item(&v); 
     
                    tool.m_lpDispatch->QueryInterface(IID_ITool,(LPVOID *)&(state.pTool)); 
                    // get buttons state 
                    state.m_nID=tool.GetToolID(); 
                    if (state.m_nID!=0) 
                    { 
                            // allow the owner to process the update 
                            state.DoUpdate(this, FALSE); 
                    } 
                    if (state.pTool) 
                            state.pTool->Release(); 
            } 
     
            // Now update font 
     
            USES_CONVERSION; 
            // get the current font from the view and update 
            CHARHDR fh; 
            CHARFORMAT& cf = fh.cf; 
            fh.hwndFrom = m_hWnd; 
            fh.idFrom = ID_VIEW_FORMATBAR; 
            fh.code = FN_GETFORMAT; 
                     
            cf=((CWordPadView *)GetActiveView())->GetCharFormatSelection(); 
     
                     
            v.vt=VT_BSTR; 
            v.bstrVal=L"FontName"; 
            tool=m_bar.GetTools().Item(&v); 
             
     
            tool.SetText(cf.szFaceName); 
     
            TCHAR buf[10]; 
            TwipsToPointString(buf, ( (cf.dwMask & CFM_SIZE) ? cf.yHeight : -1) ); 
     
            v.bstrVal=L"FontSize"; 
            tool=m_bar.GetTools().Item(&v); 
            tool.SetText(buf); 

     
     
    Integrating ShortCut keys and menu accellerators 
     
    To route menu and shortcut keys to ActiveBar add the following code to process 
    PreTranslateMessage: 
     
    short OCXKeyState() 

        BOOL bShift = (GetKeyState(VK_SHIFT) < 0); 
        BOOL bCtrl  = (GetKeyState(VK_CONTROL) < 0); 
        BOOL bAlt   = (GetKeyState(VK_MENU) < 0); 
        return (short)(bShift + (bCtrl << 1) + (bAlt << 2)); 

     
     
    BOOL CMainFrame::PreTranslateMessage( MSG* pMsg ) 

            if (pMsg->message==WM_SYSKEYDOWN || pMsg->message==WM_KEYDOWN) 
            { 
                    if (m_bar.m_hWnd!=NULL) 
                            if (m_bar.OnKeyDown((short)pMsg->wParam, OCXKeyState())==TRUE) 
                                    return TRUE; 
            } 
            return CFrameWnd::PreTranslateMessage(pMsg); 

     
     
     
    THATS ALL FOLKS!!!  Check our web site at www.datadynamics.com for new samples and FAQ 
     


    


    3楼2006-12-09 17:38
    回复
      请问你为什么总转贴,不能发些自己的东西???


      4楼2006-12-10 05:42
      回复
        这就是我自己的东西 你看不懂不赖我 哈哈


        5楼2006-12-10 22:12
        回复
          dddddddddddddd


          6楼2006-12-12 15:47
          回复
            ddddddddddddddddd


            7楼2006-12-13 19:47
            回复
              ddddd


              8楼2006-12-14 18:37
              回复