积累的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。

积累的VC编程小技巧之按钮,布布扣,bubuko.com

时间: 2024-08-09 02:09:19

积累的VC编程小技巧之按钮的相关文章

积累的VC编程小技巧之文件操作

1.删除文件夹 // 删除文件夹及其所有内容void CBaseDoc::RemoveFolder(const CString &strPathName){    CString path = strPathName;    if (path.Right(1) != _T("\\"))        path += _T("\\");    path += _T("*.*");    CFileFind ff;    BOOL res =

积累的VC编程小技巧之组合框

1.如何正确的得到ComBox的指针 CComboBox *mComb = (CComboBox*)GetDlgItem(IDC_DuanCB); CComboBox *mComb = (CComboBox*)::GetDlgItem(m_hWnd,IDC_DuanCB); 2.CComboBox控件详解 CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down list). CCom

积累的VC编程小技巧之列表框

1.列表框中标题栏(Column)的添加 创建一个List Control,其ID为IDC_LIST,在其Styles属性项下的View项里选择Report.Align项里选择Top.Sort项里选择None. 然后在该List所在对话框的类(头文件)里创建ClistCtrl的一个对象m_list然后在.cpp文件的OnInitDialog()之类的函数里实现如下代码: CString strname[3]; strname[0]="Screen Name"; strname[1]=&

积累的VC编程小技巧之属性页

1.属性页的添加: 创建对话框的类,该类要从CpropertyPage继承:然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch:最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码: m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0); //使选项卡的按钮在下面 if(m_tabsheet.m_hWnd) m_tabsheet.

积累的VC编程小技巧之工具条和状态条

1.工具条和状态条中控件的添加: 方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上). 其次,新创建一个类CMainToolBar,要从CToolBar继承(创建过程大概如下:选择工程/增加到工程/新的类:也可以选择工程的根,然后点击右键,选择新的类:或者CTL+W,选择增加类/新的类 --- 然后在class type里选择Generic Class,在Name栏里输入新类的名

积累的VC编程小技巧之标题栏和菜单

1.窗口最大最小化按纽的控制 ①怎样在程序开始的时候让它最大化? ②vc++做出来的exe文件在窗体的右上方是没有最大化和最小化按钮的,怎样实现这一功能? ③如何在显示窗口时,使最大化按钮变灰?   ①在App类里的C-App::InitInstance()中把m_pMainWnd->ShowWindow(SW_SHOW)改成m_pMainWnd->ShowWindow(SW_MAXIMIZE); ②在CreateWidnow时用WS_SYSMENU|WS_MINIMIZEBOX|WS_MAX

积累的VC编程小技巧之编辑框

1.如何让对话框中的编辑框接收对话框的消息 ////////////////////////////////////////////////// 如何让对话框中的CEdit控件类接收对话框的消息////////////////////////////////////////////////1.在对话框中增加一个ID 为IDC_EDIT1的CEdit1控件2.通过ClassWizard 生成一个基于CEdit的新类CMyEdit,CMyEdit  m_wndEdit;3.在对话框OnInitDia

积累的VC编程小技巧之对话框

1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) {    //一句话解决问题     SendMessage(WM_SYSCOMMAND,0xF012,0);    CDialog::OnLButtonDown(nFlags, point);} 2.对话框消息映射 有对话框A,B从A中发消息给B然后B处理.准备工作,先定义消息,如下#define WM_B_NOTIFY WM_U

积累的VC编程小技巧之工具提示

1.用鼠标移动基于对话框的无标题栏程序的简单方法 void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point) {    //一句话解决问题     SendMessage(WM_SYSCOMMAND,0xF012,0);    CDialog::OnLButtonDown(nFlags, point);} 2.对话框消息映射 有对话框A,B从A中发消息给B然后B处理.准备工作,先定义消息,如下#define WM_B_NOTIFY WM_U