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编程小技巧之按钮的更多相关文章

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

    1.删除文件夹 // 删除文件夹及其所有内容void CBaseDoc::RemoveFolder(const CString &strPathName){    CString path = ...

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

    1.如何让对话框中的编辑框接收对话框的消息 ////////////////////////////////////////////////// 如何让对话框中的CEdit控件类接收对话框的消息/// ...

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

    1.窗口最大最小化按纽的控制 ①怎样在程序开始的时候让它最大化? ②vc++做出来的exe文件在窗体的右上方是没有最大化和最小化按钮的,怎样实现这一功能? ③如何在显示窗口时,使最大化按钮变灰?   ...

  4. 积累的VC编程小技巧之框架窗口及其他

    1.修改主窗口风格 AppWizard生成的应用程序框架的主窗口具有缺省的窗口风格,比如在窗口标题条中自动添加文档名.窗口是叠加型的.可改变窗口大小等.要修改窗口的缺省风格,需要重载CWnd::Pre ...

  5. 积累的VC编程小技巧之打印相关

    1.修改打印预览的ToolBar 为AFX_IDD_PREVIEW_TOOLBAR这个ID创建一个DialogBar.则系统就会用新创建的DialogBar代替系统默认的那个 2.关于打印 1.要打印 ...

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

    1.列表框中标题栏(Column)的添加 创建一个List Control,其ID为IDC_LIST,在其Styles属性项下的View项里选择Report.Align项里选择Top.Sort项里选择 ...

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

    1.工具条和状态条中控件的添加: 方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上 ...

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

    1.属性页的添加: 创建对话框的类,该类要从CpropertyPage继承:然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框 ...

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

    1.如何正确的得到ComBox的指针 CComboBox *mComb = (CComboBox*)GetDlgItem(IDC_DuanCB); CComboBox *mComb = (CCombo ...

随机推荐

  1. 基于visual Studio2013解决C语言竞赛题之0510求最大和

     题目

  2. VC++在对话框中加入属性页

    当一个基于对话框的程序中有相当多的控件时,你一定会想到使用属性页来将这些控件分类放置.本文针对这种方法来讨论几种可能实现的方案. 方案一本方案的例子请见源代码打包文件中的Property1部分 在对话 ...

  3. 推断js中的类型:typeof / instanceof / constructor / prototype

    怎样推断js中的类型呢,先举几个样例: var a = "jason"; var b = 123; var c = true; var d = [1,2,3]; var e = n ...

  4. python学习笔记——第三章 串

    第三章 字符串学习 1.字符串不灵活, 它不能被分割符值 >>> format = "hello, %s. %s enough for ya?" >> ...

  5. shell中判断用法

    测试结构: 测试命令可用于测试表达式条件的真假,true,则返回0,false,则返回非0:这一点c/c++有区别:       格式: test  expression #expression是一个 ...

  6. 【转】Lua脚本语法说明简介

    Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱. 所以,我只简单的归纳一下Lua的一些语法规则,使用起来方便好查就可以了.估计看完了,就懂得怎么写Lua程序了. 在Lua中,一切都是变量, ...

  7. 阿里云ECS专有网络产品三个步骤配置教程

    阿里云ECS专有网络产品三个步骤配置教程 阿里云专有网络节点已开通地域:美国硅谷可用区1B,新加坡可用区A,北京可用区A,深圳可用区A,杭州可用区D,上海可用区B 举个栗子:购买 美国硅谷可用区1B  ...

  8. java调用163邮箱发送邮件

    1:注册一个163邮箱,http://mail.163.com 调用发送邮件代码,查询smtp.163.com,作为发送邮件的服务器ip,类似的邮箱服务器应该也可以. MailSenderInfo m ...

  9. JavaScript实现获取table中某一列的值

    JavaScript实现获取table中某一列的值 1.实现源代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/ ...

  10. easyUI相关知识

    $("#sportGroupInfoDialog").dialog("open");//打开一个对话框,设置这个对话框的的布局方式 $('#sportGroup ...