积累的VC编程小技巧之按钮

1.资源种创建的控件,对其属性的动态控制:

在对话框类的头文件里创建所要改变属性的控件的对象,如要改变一个Button(其ID为IDC_MyButton)的属性,则需创建Cbutton的对象m_button。然后在.cpp中的DoDataExchange函数里将Button的ID和创建的对象绑定在一起:

//{{AFX_DATA_MAP(CPrintDlg)

              // NOTE: the ClassWizard will add DDX and DDV calls here

       DDX_Control(pDX, IDC_MyButton, m_button);

       //}}AFX_DATA_MAP

然后可以在该函数的最后进行初始化:

       m_button.EnableWindow(FALSE);

到这里已经实现了改变属性。如果要动态改变其属性,可如下实现(通过两个Button的点击改变起属性):

// RadioAll Button的点击响应函数

void CPrintDlg::OnRadioAll()

{

              // TODO: Add your control notification handler code here

              m_button.EnableWindow(TRUE);

}

 

// RadioSelect Button的点击响应函数

void CPrintDlg::OnRadioSelect()

{

              // TODO: Add your control notification handler code here

              m_button.EnableWindow(FALSE);

}

也可以通过一个Check Button的点击来改变,在其点击响应函数里实现:

m_button.EnableWindow(!m_button.IsWindowEnabled());

其余控件属性的改变都如此。

 

2.VC++中的3D按钮的编程

运行AppWizard生成一个基于对话框的test工程,在对话框中加入一个CButton控件。在CButton控件的General属性页将控件的ID改为IDC_3DTEXTBTN,Caption改为“谁与争疯”,在控件Styles属性页选中OwnerDraw,其余设置保持默认。
  用classwizard创建一个新类:C3dTextButton,基类为CButton。为C3dTextButton类添加一个protected的函数void Draw(CDC* pDC, const CRect& rect, UINT state)。如下所示编写代码:
  void C3dTextButton::Draw(CDC *pDC, const CRect &rect, UINT state)
  {
     CString text; GetWindowText(text);
     int l=text.GetLength();
     CRect rectClient=rect;
   
     //获得控件的字体
     CFont* pFont=GetFont();
   
     //确定所选字体有效高度和宽度
     LOGFONT logfont;
     pFont->GetObject(sizeof(LOGFONT),&logfont);
     if(logfont.lfHeight==0)logfont.lfHeight=20;
     logfont.lfWidth=0;//宽度设为0,宽度值由高度确定
     logfont.lfWeight=1000;
     logfont.lfEscapement=logfont.lfOrientation=0;
     CFont tryfont; VERIFY(tryfont.CreateFontIndirect(&logfont));
     CFont* pFontOld=pDC->SelectObject(&tryfont);
   
     //根据控件大小,调整字体的高度,使文本与控件协调
     CSize textSizeClient=pDC->GetTextExtent(text,l);
     if(rectClient.Width()*textSizeClient.cy>rectClient.Height()*textSizeClient.cx)
     {
        logfont.lfHeight=::MulDiv(logfont.lfHeight,rectClient.Height(),textSizeClient.cy);
     }
     else{
        logfont.lfHeight = ::MulDiv(logfont.lfHeight,rectClient.Width(),textSizeClient.cx);
     }
   
     //创建并选择协调后的字体
     CFont font; font.CreateFontIndirect(&logfont);
     pDC->SelectObject(&font);
     textSizeClient=pDC->GetTextExtent(text,l);
     //确定文本与控件边界的距离minx,miny
     int minx=rectClient.left+(rectClient.Width()-textSizeClient.cx)/2;
     int miny=rectClient.top+(rectClient.Height()-textSizeClient.cy)/2;
     int oldBkMode=pDC->SetBkMode(TRANSPARENT);
     COLORREF textcol=::GetSysColor(COLOR_BTNTEXT);
     COLORREF oldTextColor=pDC->SetTextColor(textcol);
     int cx = minx;
     int cy = miny;
     int s=(state&ODS_SELECTED)?-1:+1;
     cx+= 3; cy+= 3;
   
     //实现3D效果
     pDC->SetTextColor(::GetSysColor(COLOR_3DDKSHADOW));
     pDC->TextOut(cx-s*2,cy+s*2,text);
     pDC->TextOut(cx+s*2,cy-s*2,text);
     pDC->TextOut(cx+s*2,cy+s*2,text);
     pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
     pDC->TextOut(cx+s*1,cy-s*2,text);
     pDC->TextOut(cx-s*2,cy+s*1,text);
     pDC->TextOut(cx-s*2,cy-s*2,text);
     pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW));
     pDC->TextOut(cx-s*1,cy+s*1,text);
     pDC->TextOut(cx+s*1,cy-s*1,text);
     pDC->TextOut(cx+s*1,cy+s*1,text);
     pDC->SetTextColor(::GetSysColor(COLOR_3DLIGHT));
     pDC->TextOut(cx,cy-s*1,text);
     pDC->TextOut(cx-s*1,cy,text);
     pDC->TextOut(cx-s*1,cy-s*1,text);
     pDC->SetTextColor(textcol);
   
     //输出标题
     pDC->TextOut(cx,cy,text);
   
     //恢复设备描述表
     pDC->SetTextColor(oldTextColor);
     pDC->SetBkMode(oldBkMode);
     pDC->SelectObject(pFontOld);
  }

  用classwizard重载C3dTextButton类的DrawItem函数。编写代码如下所示:
  void C3dTextButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  {
     CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
     ASSERT_VALID(pDC);
     CRect rectClient=lpDrawItemStruct->rcItem;
     Draw(pDC,rectClient,lpDrawItemStruct->itemState);
  }
  用classwizard为IDC_3DTEXTBTN建立一个C3dTextButton控件变量m_3dTextButton1。

 

把“3dTextButton.h”加入testDlg头文件。编译并测试应用程序。

 

3.将RADIO按钮初始状态设置成为选中

1、  在OnInitialDialog中用CButton::CheckRadioButton(...)
2、  在OnInitialDialog中用CButton::SetCheck(...)

关联一个整型值,在构造函数中设为0。

你可能感兴趣的:(小技巧)