用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

 


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值