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. C/C++ 内存布局详解(经典)(很久前不知哪儿转载的)

    一个由C/C++编译的程序除了存放函数二进制代码的程序代码段(code段)外,数据占用的内存大致分为以下几个部分: 1.栈区(stack) 存放局部变量.函数参数.返回数据.返回地址等.系统自动分配释 ...

  2. STSR round#1

    乱搞玩出新高度.....#1

  3. Handler.removeMessages的作用,有时候为什么一定要先remove一下呢

    removeMessages会将handler对应message queue里的消息清空,如果带了int参数则是对应的消息清空.队列里面没有消息则handler会不工作,但不表示handler会停止. ...

  4. 仿StackOverflow开发在线问答系统

    仿StackOverflow开发在线问答系统 [第二期11月9日开课]使用Python Flask Web开发框架实现一套类似StackOverflow的在线问答平台LouQA,具备提问,回答,评论点 ...

  5. 基于visual Studio2013解决C语言竞赛题之0609矩阵处理

     题目

  6. 基于visual Studio2013解决C语言竞赛题之0801信息输出

     题目

  7. 【剑指Offer学习】【面试题17 ::合并两个排序的链表】

    题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是依照递增排序的 链表结点定义例如以下: public static class ListNode { int value; List ...

  8. 关于js基础easy忘记的那些事儿

    1.Number() 通过这个函数转化后的值仅仅有两个:数值和NaN,通过parseInt也能转化为数值.可是像"134df"转化后的值为134,而Number("134 ...

  9. IOS引导页的编写

    我们在第一次打开App的时候,通常不是直接进入App主界面,而是会有一个能左右滑动.介绍App功能的界面.我是用NSUserDefaults + UIScrollview实现. 新建一个类,继承UIV ...

  10. android中获取 bitmap 像素的颜色 之吸管取色功能

    本功能是参考android API colorPickerView修改,实现类似与PS中吸管取色功能.也就是可以对图片的任意位置取该位置的RGB.本demo中,完成了色盘取色功能.当点击色盘的某个位置 ...