zoukankan      html  css  js  c++  java
  • 用BCG开发字体设定工具栏在按下粗体设置按钮式后,选中内容被设定,但是工具栏上的按钮没有处于按下状态

    用BCG开发 字体设定工具栏,粗体、斜体、下划线按钮CBCGPToolbarButton 在按下后,CRichEditCtrl对应的选中内容被设定,但是工具栏上的按钮没有处于按下状态,即使在按钮按下消息里添加设置按钮状态的代码也无法在该消息里设定按钮状态

    ----------解决方法:按钮设为 TBBS_CHECKBOX 风格


    void CFormatBar2::OnReset ()
    {
     UINT nvCmdID[3];
     nvCmdID[0] = ID_CHAR_BOLD;
     nvCmdID[1] = ID_CHAR_ITALIC;
     nvCmdID[2] = ID_CHAR_UNDERLINE;

     for (int i=0; i<3 ; i++)
     {
      UINT nCmdID = nvCmdID[i];

      int index = CommandToIndex(nCmdID);
      if (index >=0)
      {
       CBCGPToolbarButton *pBtn = GetButton(index);
       pBtn->SetStyle(TBBS_CHECKBOX);!!!

    ----------解决方法:按钮设为 TBBS_CHECKBOX 风格


      }
     }


     // Insert the color menu button:
     CBCGPColorMenuButton* pColorButton = CreateColorButton ();
     ReplaceButton (ID_CHAR_COLOR, *pColorButton);
     delete pColorButton;
    }

    另外附上按钮按下时消息响应函数

    typedef struct
    {
     UINT nCmdID;
     DWORD dwMask;
     DWORD dwEffects;
    } FONT_CONTROL;

    void CPropertyDlg::OnCharEffect(UINT nID)
    {

    FONT_CONTROL m_FontControlPara[3];

     int i=0;
     m_FontControlPara[i].nCmdID = ID_CHAR_BOLD;
     m_FontControlPara[i].dwMask = CFM_BOLD;
     m_FontControlPara[i].dwEffects = CFE_BOLD;
     i++;

     m_FontControlPara[i].nCmdID = ID_CHAR_ITALIC;
     m_FontControlPara[i].dwMask = CFM_ITALIC;
     m_FontControlPara[i].dwEffects = CFE_ITALIC;
     i++;

     m_FontControlPara[i].nCmdID = ID_CHAR_UNDERLINE;
     m_FontControlPara[i].dwMask = CFM_UNDERLINE;
     m_FontControlPara[i].dwEffects = CFE_UNDERLINE;
     i++;

    。。。。。


     AFX_MANAGE_STATE(AfxGetStaticModuleState());

     CLDCText40Control *pCtrl = (CLDCText40Control *)m_pCtrl;

     int i;
     for (i=0; i<3; i++)
     {
      if (nID==m_FontControlPara[i].nCmdID)
       break;
     }

     if (i>=3)
     {
      return;
     }

     CWnd *pWnd = CWnd::FromHandle(pCtrl->m_hWnd);
     CRichEditCtrlEx *pEdit = (CRichEditCtrlEx *)pWnd;

     CCharFormat cf;
     long nStart, nEnd;
     
     pEdit->GetSel(nStart, nEnd);
     pEdit->SetSel(nStart, (nEnd>nStart?nStart+1:nStart));//!!! 这样做是因为 字体不同 时 cf.dwEffects 为无效值
     pEdit->GetSelectionCharFormat(cf);
     pEdit->SetSel(nStart, nEnd);

     if ( (cf.dwMask&m_FontControlPara[i].dwMask)==m_FontControlPara[i].dwMask)
     {
      //DWORD nRes = cf.dwEffects&CFE_BOLD;
      //if (nRes==(DWORD)CFE_BOLD)
      if ((cf.dwEffects&m_FontControlPara[i].dwEffects)==m_FontControlPara[i].dwEffects)
      {
       cf.dwEffects = 0;
      }
      else
      {
       cf.dwEffects = (m_FontControlPara[i].dwEffects);
      }

      cf.dwMask = m_FontControlPara[i].dwMask;
      pEdit->SetSelectionCharFormat(cf);
      
      pEdit->SetFocus ();
     }

    }

    奇怪的是,在居中+对齐按钮的响应函数中对工具栏按钮状态进行设置却有效果一下列出代码----(???原因待查)


    void CPropertyDlg::OnParaFormat(UINT nID)
    {
     CLDCText40Control *pCtrl = (CLDCText40Control *)m_pCtrl;
     CWnd *pWnd = CWnd::FromHandle(pCtrl->m_hWnd);
     CRichEditCtrlEx *pEdit = (CRichEditCtrlEx *)pWnd; 

     PARAFORMAT pf;
     pf.dwMask = PFM_ALIGNMENT;
     switch (nID)
     {
     case ID_PARA_LEFT:
      pf.wAlignment = PFA_LEFT;
      break;
     case ID_PARA_CENTER:
      pf.wAlignment = PFA_CENTER;
      break;
     case ID_PARA_RIGHT:
      pf.wAlignment = PFA_RIGHT;
      break;
     default:
      return;
      break;
     }
     
     pEdit->SetParaFormat(pf);

     this->SetDlgAttFromCtrl(pCtrl);
    }

    另外附上根据edit控件最新状态设置工具栏按钮状态的代码,但是代码对 居中+对齐 有效,对粗斜体无效(???原因待查)
    void CPropertyDlg::SetDlgAttFromCtrl(const CLDCControl *pCtrl)
    {
     AFX_MANAGE_STATE(AfxGetStaticModuleState());

     CLDCText40Control *pTxtCtrl = (CLDCText40Control *)pCtrl;
     m_pCtrl = pTxtCtrl;

     // sec.1 x,y,w,h
     m_SP_TopLeftX = pCtrl->m_Att.m_lpShapePoints[0].x;
     m_SP_TopLeftY = pCtrl->m_Att.m_lpShapePoints[0].y;
     m_SP_BottomRightX = pCtrl->m_Att.m_lpShapePoints[4].x;
     m_SP_BottomRightY = pCtrl->m_Att.m_lpShapePoints[4].y;
     //m_SP_TopLeftX = pTxtCtrl->m_pEdtFrame->m_lpShapePoints[0].x;
     //m_SP_TopLeftY = pTxtCtrl->m_pEdtFrame->m_lpShapePoints[0].y;
     //m_SP_BottomRightX = pTxtCtrl->m_pEdtFrame->m_lpShapePoints[4].x;
     //m_SP_BottomRightY = pTxtCtrl->m_pEdtFrame->m_lpShapePoints[4].y;

     m_Width = m_SP_BottomRightX - m_SP_TopLeftX + 1;//add by zcl for debug 0000379
     m_Height= m_SP_BottomRightY - m_SP_TopLeftY + 1;//add by zcl for debug 0000379

     // sec.2 font
     if (m_hWnd!=NULL)
     {
      /*CHARFORMAT*/WPD_CHARFORMAT cf;
      long nStart, nEnd;

      CWnd *pWnd = CWnd::FromHandle(pTxtCtrl->m_hWnd);
      CRichEditCtrlEx *pEdit = (CRichEditCtrlEx *)pWnd;

      pEdit->GetSel(nStart, nEnd);
      pEdit->SetSel(nStart, (nEnd>nStart?nStart+1:nStart));
      pEdit->GetSelectionCharFormat(cf);
      pEdit->SetSel(nStart, nEnd);
     
      // font name
      CObList listButtons;

      CString strFontName;
      if (m_wndFormatBar.GetCommandButtons (IDC_FONTNAME, listButtons) > 0)
      {
       for (POSITION posCombo = listButtons.GetHeadPosition (); posCombo != NULL;)
       {
        CBCGPToolbarFontCombo* pCombo =
         DYNAMIC_DOWNCAST (CBCGPToolbarFontCombo, listButtons.GetNext (posCombo));

        if (pCombo != NULL/* && !pCombo->HasFocus ()*/)
        {
         if ((cf.dwMask & (CFM_FACE|CFM_CHARSET)) == (CFM_FACE|CFM_CHARSET))
         {
    #if _MSC_VER >= 1300
          strFontName = cf.szFaceName;
    #else
          strFontName = A2T(cf.szFaceName);
    #endif
          pCombo->SetFont(strFontName, DEFAULT_CHARSET, TRUE);
         }
         else
         {
          pCombo->SetText(_T(""));
         }
        }
       }
      }

      // font size
      if (m_wndFormatBar.GetCommandButtons (IDC_FONTSIZE, listButtons) > 0)
      {
       for (POSITION posCombo = listButtons.GetHeadPosition (); posCombo != NULL;)
       {
        CBCGPToolbarFontSizeCombo* pCombo =
         DYNAMIC_DOWNCAST (CBCGPToolbarFontSizeCombo, listButtons.GetNext (posCombo));

        if (pCombo != NULL && !pCombo->HasFocus ())
        {
         if (!strFontName.IsEmpty () && pCombo->GetCount () == 0)
         {
          pCombo->RebuildFontSizes (strFontName);
         }

         pCombo->SetTwipSize( (cf.dwMask & CFM_SIZE) ? cf.yHeight : -1);
        }
       }
      }

      // font ID_CHAR_BOLD -- ID_CHAR_UNDERLINE
      for (int i=0; i<3 ; i++)
      {
       UINT nCmdID = m_FontControlPara[i].nCmdID;

       int index = m_wndFormatBar2.CommandToIndex(nCmdID);
       if (index >=0)
       {
        CBCGPToolbarButton *pBtn = m_wndFormatBar2.GetButton(index);
        if ((cf.dwMask & (m_FontControlPara[i].dwMask)) == (m_FontControlPara[i].dwMask ))
        {
         LONG nStyle = pBtn->m_nStyle;
         if (cf.dwEffects &m_FontControlPara[i].dwEffects)
         {
          pBtn->SetStyle(nStyle|TBBS_CHECKED);
         }
         else
         {
          pBtn->SetStyle(nStyle&~TBBS_CHECKED);
         }
        }
       }
      }
      m_wndFormatBar2.Invalidate(TRUE);

      // ParaFormat
      {
       PARAFORMAT pf;
       pEdit->GetParaFormat(pf);
       if ( PFM_ALIGNMENT==(pf.dwMask&PFM_ALIGNMENT) )
       {
        int nCmdID = 0;
        
        if ( PFA_LEFT==pf.wAlignment )
        {
         nCmdID = ID_PARA_LEFT;
        }
        else if ( PFA_CENTER==pf.wAlignment )
        {
         nCmdID = ID_PARA_CENTER;
        }
        else if ( PFA_RIGHT==pf.wAlignment )
        {
         nCmdID = ID_PARA_RIGHT;
        }
        else
        {
         nCmdID = 0;
        }

        if (0==nCmdID)
         return;

        UINT nvCmdID[6];
        nvCmdID[3] = ID_PARA_LEFT;
        nvCmdID[4] = ID_PARA_CENTER;
        nvCmdID[5] = ID_PARA_RIGHT;


        for (int i=3; i<6 ; i++)
        {
         int index = m_wndFormatBar2.CommandToIndex(nvCmdID[i]);
         if (index >=0)
         {
          CBCGPToolbarButton *pBtn = m_wndFormatBar2.GetButton(index);
          UINT nStyle = pBtn->m_nStyle;
          if (nCmdID==nvCmdID[i])
          {
           pBtn->SetStyle(nStyle|TBBS_CHECKED);
          }
          else
          {
           pBtn->SetStyle(nStyle&(~TBBS_CHECKED));
          }
         }
        }

        m_wndFormatBar2.Invalidate();
       }

       this->UpdateData(FALSE);
      }


      
     } // if (m_hWnd!=NULL)

     m_Dis_RollMode = pCtrl->m_Att.m_Dis_RollMode;//Add by zhoufeng
     m_Dis_RollSpeed = pCtrl->m_Att.m_Dis_RollSpeed;//Add by zhoufeng


    }

  • 相关阅读:
    CPP Info Memo part3
    在Google搜索结果显示原始链接(转自 月光博客)
    libc 之 locales
    Git 分支管理与本地 repository 创建
    py2exe issue: ImportError: No module named _fontdata_enc_winansi (http://stackoverflow.com/)
    CPP Info Memo (Part 1)
    CPP Info Memo part2
    HOWTO: Increase write speed by 'aligning' FAT32(通过对齐 FAT32 提高U盘访问速度, 转载)
    (转载)Gentoo中文man乱码
    如何选择开源许可证?(转载)
  • 原文地址:https://www.cnblogs.com/carl2380/p/1915668.html
Copyright © 2011-2022 走看看