Microsoft  基础类库

                             VC爱好者

MFC 的文档包括对类的引用,全局函数,全局变量和宏组成该库,再加上由MFC开发团队收集书面的技术说明.

 MFC Reference (MFC 参考)
 MFC Technical Notes (MFC 技术说明)
 MFC Sample Programs (MFC 示例程序)
 Hierarchy chart (层次结构图)
 Hierarchy chart categories (类层次结构图)
 About the MFC classes (关于MFC类)

有趣的主页:

 Visual C++ Home (Visual C++ 首页)
 Adding User-Interface Features (添加用户界面功能)
 Adding Program Functionality (添加程序功能)
 Active Template Library (ATL) (活动模板库(ATL))
 OLE DB Templates (OLE DB 模板)


可视对象类:
 1窗口类:CWnd类
   CWnd提供了MFC中所有窗口类的基本功能,是CCmdTarget类的子类
   创建Windows窗口要分两步进行(1引入构造函数,构造一个CWnd对象2调用Create建立窗口并将它连接到CWnd对象上)
 2视类:CView类
  该类表示框架窗口的客户区和显示文档数据并接受输入的客户区其派生类主要有如下几种:
   CScrollView :具有滚动功能的视的基类
   CFormView:其布局再对话资源中定义的滚动
   CEditView:具有文本编辑、查找、替换和滚动功能的视
 3菜单类:CMenu类
  该类是CObject类的子类,用于管理菜单,它是一个Windows HMenu的封装,提供了与窗口有关的菜单资源建立、修改、跟踪及删除的成员函数。
 4对话框类:CDialog类
   由于对话框是一个特殊的窗口,所以该类是从CWnd类中派生出来的。对话框子层次结构包括通用对话框类CDialog以及支持文件选择、颜色选择、字体选择、打印、替换文本的公共对话框子类。
 5控件类
 控件子层次结构包括若干类,使用这些类可以建立静态文本、命令按钮、位图按钮、列表框、组合框、滚动条、编辑框等。这些直观控件为Windows应用程序提供了各种输入和显示界面。
 6控件条类:CControlBar类
  控件条子层次结构为工具条、状态条、对话条和分割窗口建立模型。该类是CToolBar、CStatusBar、CDialogBar的基类,负责管理工具条、状态条、对话条的一些成员函数。控件条指的是连接在主窗口框架的顶部或底部的小窗口。
 7绘画对象类:CGdiObject类
  图形绘画对象子层次结构以CGdiObject类为跟类,可用于建立绘画对象模型,如画笔、刷子、字体、位图、调色板等。
 8设备描述表类:CDC类
  该类及其子类支持设备描述表对象,是CObject类的子类。CDC类是一个较大的类,包括许多成员函数,如映射函数、绘画工具函数、区域函数等,通过CDC对象的成员函数可以完成所有的绘图工作。

 通用类
 此类提供了许多通用服务,例如文件I/O 、诊断和异常处理等。此外还包括如数组和列表等存放数据集的类
 1.文件类: CFile 和 CArchive类用以编写输入输出处理函数
 2.异常类:CException类是所有异常情况的基类不能直接建立CException对象,只能建立派生类的对象,用派生类来捕获指定的异常情况。
 3.模板收集类 这些类可以将多种对象存放到数组、列表和“映射”中但这些收集类是模板,它们的参数确定了存放集合中的对象类型。

OLE类
 对象连接与嵌入子层次结构为支持OLE提供了9个类
 普通类 COleDocuemnt 、COleItem、COleException
 客户类 COleClientDoc 、COleClientItem
 服务器类 COleServer、COleTemplate、COServerDoc、COServerItem

ODBC数据库类
 开放数据库连接连接子层次结构提供了一些类来支持ODBC特征,即开通过这些类可开发数据库应用程序来访问多个数据库文件。

MFC中全局函数与全局变量
以Afx开头的函数除数据库类函数和DDX(Dialog Data Exchange)函数外,在目前的版本中,都表示是一个全局函数。以Afx为前缀的变量都是全局变量。
 函数                 功能
AfxAbort                 无条件终止一个应用程序
AfxBeginThread           创建一个新进程并执行他
AfxEndThread             终止当前正在执行的进程
AfxFormatString          格式化字符串
AfxMessageBox            显示一个Windows消息框
AfxGetApp                返回当前应用程序对象的指针
AfxGetInstanceHandle     返回标识当前对应程序对象的句柄
AfxRegisterWndClass      登记用于创建Windows窗口的窗口类

=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
制作含编辑框的应用程序
编辑框在Windows风格的应用程序中是随处可见的 ,当需要获得来自用户的文本信息,或者要让用户输入或编辑文本时,应该使用编辑控件。

编辑框控件简介
  编辑框控件具有许多功能,Windows中的记事本(Notepad)应用程序就是一个带有控件菜单的编辑框控件
 
  编辑框控件(单行编辑框控件,多行编辑框控件)

CEdit 的层次结构
  +-CObject
    +-CCmdTarget
     +-CWnd
      +-CEdit
 编辑框控件类CEdit的结构很复杂,当创建CEdit对象时,MFC自动赋予该对象一个标准的Windows编辑控件它定义了CEdit对象。
 CEdit所在的头文件 Afxwin.h

  1.class CEdit::public CWnd
  2.{DECLARE_DYNAMIC(CEdit)
  //定义构造函数
  3.public;
  4.CEdit();
  5.BOOL Create(DWORD) dwStyle,const RECT&rect, CWnd*pParentWnd,UINT nID);
//成员函数
  6.BOOL CanUndo() const;
  7.int GetLineCount() const;
  8.BOOL GetModify() const;
  9.void SetModify(BOOL bModified=TRUE);
  10.void GetRect(LPRECT IpRect) const;
  11.DWORD GetSel() const;
  12.void GetSel(int& nStartChar,int& nEndChar) const;
  13.HLOCAL GetHandle() const;
  14.void SetHandle(HLOCAL hBuffer);
 //剪贴板操作
  BOOL Undo();
  void Clear();
  void Copy();
  void Cut();
  void Paste();

  BOOL SetReadOnly(BOOL bReadOnly = TRUE);
  int GetFirstVisibleLine() const;
  TCHAR GetPasswordChar() const;
 
 //Implementation
 public: Virtual ~CEdit(); //虚拟析构函数
};
 
通用CEdit类的方法
方法     说明
CanUndo()    决定一个编辑操作是否可以撤销
Clear()     从编辑控件中删除当前的选择(如果有的话)
Copy()                    将编辑控件当前的选择(如果有的话)以CF_TEXT格式赋值到剪切板中
Cut()     剪下编辑控件中的当前选择(如果有的话)并以CF_TEXT 格式复制到剪切板中
EmptyUndoBuffer()   消除一个编辑控件的“撤销”标志
GetFirstVisibleLine()     确定编辑控件中的最上面的可视行
GetModify()               确定一个编辑控件的内容是否可修改
GetPasswordChar()         当前用户输入文本是,获得编辑控件中显示的密码字符
GetRect()                 获得一个编辑控件的格式化矩形
GetSel()                  获得编辑控件中当前选择的开始和结束字符位置
LimitText()               限定用户可能输入一编辑控件的文本长度
LineFromChar()            获得包含指定字符下标的行的行号
LineLength()              获得编辑控件中的一行的长度
LineScroll()              滚动多行编辑控件的文本
Paste()                   将剪贴板的数据插入到编辑控件作当前的光标位置,只有当前剪切板中数据格式为CE_TEXT是方可插入
ReplaceSel()              用指定文本替代编辑控件中当前选择的部分
SetModify()    设置或清除编辑控件的修改标志
SetPasswordChar()         当用户输入文本时设置或删除一个显示与编辑控件中的密码字符
SetReadOnly()    将编辑控件设置为只读状态
SetSel()                  再编辑控件中选择字符的范围
Undo()                    取消最后一个编辑控件操作
  
多行编辑所支持的CEdit法
方法   说明
FmtLines()              设置在多行编辑控件中包含软件分行符
GetHandle()   获得当前分配给一个多行编辑控件的内存的句柄
GetLine()  从一编辑控件中获得一行文本
GetLineCount()  获得多行编辑控件的行数
LineIndex()  设置多行编辑控件爱你中一行的字符下标
SetHandle()  设置多行编辑控件将要用到的句柄内存句柄
SetRect()  设置多行编辑控件的格式化矩形并更新控件
SetRectNP()  设置多行编辑控件的格式化矩形并且不重绘控件窗口
SetTabStops()  在多行编辑控件中设置制表位(tab)
//这是显示第一个Edit的内容的点击事件
void CNoteEditDlg::OnShow1() 

 //设置编辑框一中的所有内容
 m_Editone.SetSel(0,-1);
 //替换内容为"This is a first edit1!"
 m_Editone.ReplaceSel("This is a first editbox!");
}
//清楚编辑框中内容的单击事件
void CNoteEditDlg::OnClear1() 
{
 //设置选中编辑框中的所有内容
 m_Editone.SetSel(0,-1);
 //替换编辑框中的内容为空
 m_Editone.ReplaceSel("");
}
//显示编辑框2中内容的单击事件
void CNoteEditDlg::OnShow2() 
{
 //选中所有的内容
 m_Edittwo.SetSel(0,-1);
 //然后替换为以下内容
 m_Edittwo.ReplaceSel("This is a two editbox");
}
//清空编辑文本框2中的所有内容按钮的单击事件
void CNoteEditDlg::OnClear2() 
{
 //选中所有内容
   m_Edittwo.SetSel(0,-1);
   //替换内容为空
   m_Edittwo.ReplaceSel("");
}
//退出函数
void CNoteEditDlg::OnExit() 
{
  //退出
  OnOK();
}
//OnTransfer按钮的单击事件
void CNoteEditDlg::OnTransfer() 
{
 //选中文本框1中的内容
 m_Editone.SetSel(0,-1);
 //复制文本框一中的内容
 m_Editone.Copy();
 //选中文本框中2的内容
 m_Edittwo.SetSel(0,-1);
 //替换文本框2中内容
 m_Edittwo.ReplaceSel("");
 //文本框二响应张贴事件
 m_Edittwo.Paste();
}
//Undo按钮的单击事件
void CNoteEditDlg::OnUndo() 
{
 //取消对Editone文本框的上一步操作
  m_Editone.Undo();
 //徐晓对Edittwo文本框的上一步操作
 m_Edittwo.Undo();
}

//单文本框获得焦点的事件
void CMailEditBoxDlg::OnSetfocusSingleBOX() 
{
 //设置变量IFMultilineEditFocus为false
 IFMultilineEditFocus =false;
 //设置变量IFSingleEditFocus=true
 IFSingleEditFocus=true;
}
//富文本框中文本信息发生变化的时候触发的事件
void CMailEditBoxDlg::OnChangeMuilbox() 
{
 //定义一个字符串
 CString METext;
 //定义一个字符创数组
 char Count[6];
 //定义两个整型变量,nCharNum,nLineNum分别用来接收字符数和行数
 int nCharNum,nLineNum;
 //获得富文本框中的所有值
 m_MUILBOX.GetWindowText(METext);
 //获得总的行数
 nLineNum=m_MUILBOX.GetLineCount();
 //获得文件的长度
 nCharNum = METext.GetLength();
 //字符串的长度等于总的字符长度减去字符串中的换行符
 nCharNum -= (nLineNum-1);
 //转换数据
 itoa(nCharNum,Count,10);
 //设置文本
 m_CHARNUM.SetWindowText(Count);
 //转化数据
 itoa(nLineNum,Count,10);
 //设置文本
 m_LINECOUNT.SetWindowText(Count);
 
}
//富文本框获得焦点的时候触发的事件
void CMailEditBoxDlg::OnSetfocusMuilbox() 
{
 //设置变量IFMultilineEditFocus为真
    IFMultilineEditFocus =true;
 //设置变量IFSingleEditFocus为假
 IFSingleEditFocus=false; 
}
//剪切按钮的单击事件
void CMailEditBoxDlg::OnCut() 
{
  //判断如果富文本框中获得焦点
  if(IFMultilineEditFocus) 
   //剪切富文本框中的所有信息
   m_MUILBOX.Cut();
      //判断如果单选框中获得焦点
   else if(IFSingleEditFocus)
      //剪切单文本框中的所有信息
   m_SingleBOX.Cut();
 else;
}
//复制按钮的单击事件
void CMailEditBoxDlg::OnCopy() 
{
 //判断如果富文本框获得焦点
 if(IFMultilineEditFocus)
  //复制富文本框中的所有文字
  m_MUILBOX.Copy();
 //如果单文本框获得焦点
 else if(IFSingleEditFocus)
  //复制单文本框中的所有文字
  m_SingleBOX.Copy();
 else;
}
//粘贴按钮的单击事件
void CMailEditBoxDlg::OnPaste() 
{
 //判断如果富文本框获得焦点
 if(IFMultilineEditFocus)
  //把粘贴板中的信息粘贴到富文本框
  m_MUILBOX.Paste();
 //如果单文本框获得焦点
    else if(IFSingleEditFocus)
  //把粘贴板中的信息粘贴到单文本框中
  m_SingleBOX.Paste();
 else;
}
//撤销按钮的单击事件
void CMailEditBoxDlg::OnUndo() 
{
 //判断如果富文本框获得焦点并且可以撤销
 if(IFMultilineEditFocus && m_MUILBOX.CanUndo())
   //撤销富文本框中的上一个操作
   m_MUILBOX.Undo();
 //如果单文本框获得焦点并且可以撤销
    else if(IFSingleEditFocus && m_SingleBOX.CanUndo())
   //撤销单文本框的上一个操作
   m_SingleBOX.Undo();
 else;
}
//关闭窗体的单击事件
void CMailEditBoxDlg::OnClose() 
{
  //关闭窗体
  OnOK(); 
}

菜单设计
用户与应用程序的交互通常是从菜单栏中选择命令或用键盘加速键的方式,因此菜单和加速键的资源再VC++编程中是很重要的。

菜单的简介
 菜单一般存放在资源脚本中,再程序运行时才调用,一个菜单项一般有两个必要的部分,他们分别是字符串名如file和整数标识符,一般来说,菜单的标识符ID再资源的头文件(Resource.h)中定义,如:
#define IDM_MENU1 129
  其中,前缀IDM指明是菜单项,在菜单资源创建后,必须将它连接到类中,通过提供类方法来处理每个菜单项。

菜单结构
 菜单模板用一种很简单的结构再资源脚本文件中定义下面就是一个菜单资源模板
 IDM_MENU1 MENU DISCAEDABLE
 BEGIN
  POPUP "&File"   //菜单名称
  BEGIN
    MENUITEM "&Voice", IDC_VOICE_MENU //菜单项
    MENUITEM "&SHOW", IDC_SHOW_MENU //菜单项
    MENUITEM SEPARATOR               //分割线
    MENUITEM "&Exit", IDC_EXIT_MENU  //菜单项
  END           //菜单File结束
  POPUP "&Help"   //定义Helper菜单
  BEGIN
    MENUITEM "&About",  IDC_ABOUT_MENU //菜单项
  END  //菜单Help定义结束
 END

=====================================================================================================================
=====================================================================================================================
=====================================================================================================================
CMenu 类
 +-CObject
  +-CMenu
 
CMenu类提供了许多处理菜单和菜单项的方法,他们分别是构造方法、菜单操作方法、菜单项操作方法和虚拟方法。构造方法是用来建立Windows菜单并在运行时将它们附加到CMenu对象上。

CMenu的构造方法
方法   说明
Attach()                把一个标准的Windows菜单句柄附加到CMenu对象上
CreateMenu()  创建一个空菜单并把它附加到CMenu对象上
CreatePopupMenu() 创建一个弹出式菜单并把他附加到CMenu对象上
DeleteTempMap()  删除由FromHandle()构造函数创建的任何临时CMenu对象
DesroyMenu()  去掉附加到CMenu对象上的菜单并释放该菜单占有的任何内存
Deatch()  CMenu对象上拆开Windows菜单句柄并返回该句柄
FromHandle()  当给定Windows菜单句柄时,返回CMenu对象指针
GetSafeHmenu()  返回由CMenu对象封装的菜单句柄成员(m_hMenu)
LoadMenu()  从可执行文件装入菜单资源并把它附加到Cmenu对象上
LoadMenuIndirect()      从内存中的菜单模板中装入菜单并把它附加到CMenu对象上

菜单操作方法中只有两个类方法用来处理菜单的顶层操作
 DelteMenu() 删除某个特定的菜单项(包括附属的级联菜单项)
 TrackPopupMenu()在一个POINT结构索指定的位置显示一个快捷菜单

菜单项特定操作的CMenu类的方法
方法      说明
AppendMenu()                    把一个新项加到给定的菜单的末端
CheckMenuItem()   在弹出式菜单中,把一个校验标记放到下一个菜单项或从一个菜单中取消一个已存在的单选按钮
CheckMenuRadioItem()  再此组中,把一个单选按钮反倒菜单项旁边或从全部其他菜单项里取消一个已存在的单选按钮
EnableMenuItem()  去掉(添加)一个菜单项
GetMenuContextHelpId()  检索与菜单结合的帮助上下文ID
GetMenuItemCount()  在弹出式或顶层菜单中获得项成员
GetMenuItemId()   为设置在指定位置的菜单项获得菜单项标识符
GetMenuState()   获得指定菜单项的状态或弹出式菜单中的菜单项成员
GetMenuString()   获得指定菜单项的标记
GetSubMenu()   获得指向弹出式菜单的指针
InsertMenu()   在指定位置插入心的菜单项,把其他向向下移
ModifyMenu()   在指定位置改变已存在的菜单项
RemoveMenu()   从指定菜单删除与弹出式菜单结合的菜单项
SetMenucontextHelpId()  设置与菜单有关的版主上下文ID
SetMenuItemBitmaps()  与菜单项有关的指定校验标记位图
********************************************************************
// Implementation
protected:
 HICON m_hIcon;

 // Generated message map functions
 //{{AFX_MSG(CMenuOfDilogDlg)
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 afx_msg void OnButton1();
 afx_msg void OnClose();
 afx_msg void OnSum();
 afx_msg void OnAverage();
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP();
private:
 BOOL bAllow;
********************************************************************
BEGIN_MESSAGE_MAP(CMenuOfDilogDlg, CDialog)
 //{{AFX_MSG_MAP(CMenuOfDilogDlg)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
 ON_COMMAND(IDC_Close, OnClose)
 ON_COMMAND(IDM_SUM,OnSum)
 ON_COMMAND(IDM_AVERAGE,OnAverage)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
*******************************************************************
Resource.h //配置
#define IDM_SUM        3265
#define IDM_AVERAGE        3266
*******************************************************************
void CMenuOfDilogDlg::OnAverage()
{}
void CMenuOfDilogDlg::OnSum()
{}
*******************************************************************

//允许计算的按钮的单击事件
void CMenuOfDilogDlg::OnButton1() 
{
 //bAllow为假
 if(!bAllow)
 {
  //获得菜单
  CMenu *pmenu=GetMenu();
  //获得菜单栏中的第一个父节点
  CMenu *pSubmenu=pmenu->GetSubMenu(0);
  //在第一个父节点中添加一个子节点“求和”
  pSubmenu->InsertMenu(0,MF_BYPOSITION,IDM_SUM,"求和");
  //在第一个父节点中添加一个子节点“求平均值”
  pSubmenu->InsertMenu(1,MF_BYPOSITION,IDM_AVERAGE,"求平均值");
  //设置布尔变量bAllow变量为真
  bAllow=true;
  //设置按钮上的文字为禁止计算
  m_Allow.SetWindowText("禁止计算");
 }
 else
 {
  //获得菜单
  CMenu *pmenu=GetMenu();
  //获得菜单栏中的第一个父节点
  CMenu *pSubmenu=GetMenu()->GetSubMenu(0);
  //删除父节点ID为IDM_SUM的节点
  pSubmenu->DeleteMenu(IDM_SUM,MF_BYCOMMAND);
  //删除父节点中子节点ID为IDM_AVERAGE的节点
  pSubmenu->DeleteMenu(IDM_AVERAGE,MF_BYCOMMAND);
  //设置布尔变量bAllow变量为假
  bAllow=false;
  //设置按钮上的文字为禁止计算
  m_Allow.SetWindowText("允许计算");
 }
}
//关闭按钮的单击事件
void CMenuOfDilogDlg::OnClose() 
{
 //关闭窗体
 OnOK(); 
}
//求和菜单的点击事件
void CMenuOfDilogDlg::OnSum()
{
 //定义一个sum变量
 double sum=0;
 //定义一个字符数组用来进行数据类型转化
 char StrOfNum[10];
 //获得第一个文本框中的值
 m_num1.GetWindowText(StrOfNum,10);
 //求和把值相加到sum
 sum =sum+atof(StrOfNum);
 //获得第二个文本框的值
 m_num2.GetWindowText(StrOfNum,10);
 //求和把值相加到sum
 sum =sum+atof(StrOfNum);
 //获得第三个文本框中的值
 m_num3.GetWindowText(StrOfNum,10);
 //求和把值相加到sum
 sum =sum+atof(StrOfNum);
 //获得第四个文本框中的值
 m_num4.GetWindowText(StrOfNum,10);
 //求和把值相加到sum中
 sum =sum+atof(StrOfNum);
 //将字符串装换格式用StrOfNum接收
 sprintf(StrOfNum,"%.3f",sum);
 //设置求和文本框的信息
 m_sum.SetWindowText(StrOfNum);
}
//求平均值的单击事件
void CMenuOfDilogDlg::OnAverage()
{
 //定义一个sum接受和
 double sum=0;
 //定义一个average变量用来计算平均值
 double average;
 //定义一个字符串用来进行数据转化
 char StrOfNum[10];
 //获得第一个文本框中的值
 m_num1.GetWindowText(StrOfNum,10);
 //累加到sum中
 sum =sum+atof(StrOfNum);
 //获得第二个文本框中的值
 m_num2.GetWindowText(StrOfNum,10);
 //累加到sum
 sum =sum+atof(StrOfNum);
 //获得第三个文本框中的值
 m_num3.GetWindowText(StrOfNum,10);
 //累加到sum中
 sum =sum+atof(StrOfNum);
 //获得第四个文本框中的值
 m_num4.GetWindowText(StrOfNum,10);
 //累加到sum中
 sum =sum+atof(StrOfNum);
 //求平均值
 average = sum/4;
 //装换average变量的格式用StrOfNum接收
 sprintf(StrOfNum,"%.3f",average);
 //设置平均值文本框的值
 m_avg.SetWindowText(StrOfNum);
}
 

//退出
void CApplicationDlg::OnExit() 
{
 //退出窗体
 OnOK(); 
}
//菜单中的退出项的命令方法
void CApplicationDlg::OnExitMENU() 
{
 //退出窗体
 OnOK();
}
//Voice的单击事件
void CApplicationDlg::OnVoiceMenu() 
{
 //调用蜂鸣器鸣叫的方法
 MessageBeep((WORD)-1);
 //获得当前时间
 DWORD iTime= GetCurrentTime();
 //循环去调用蜂鸣方法
 while(GetCurrentTime()<(iTime+10))
 {
  //调用蜂鸣方法
  MessageBeep((WORD)-1);
 }
}
//显示消息的命令函数
void CApplicationDlg::OnShowMenu() 
{
 //弹出消息
 MessageBox("this is a simple Exeam!"); 
}
//按钮Show的单击事件
void CApplicationDlg::OnShow() 
{
 //调用菜单中的OnShowMenu函数
  OnShowMenu();
}
//Voice的单击事件
void CApplicationDlg::OnVoice() 
{
 //调用菜单项Vioce的函数
 OnVoiceMenu();
}


///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
制作含滚动条的应用程序

滚动条是一个交互式、高度可视化的控件,它包括一个滑块、滚动条的两端的按钮等。
 
滚动条控件与输入窗口的滚动条是不一样的

滚动条控件
滚动条控件是由用户创建管理和释放的
输入窗口的滚动条
处于窗口的滚动条是由该窗口创建、管理和释放的

作为任何一个窗口的子控件,滚动条可以通过通知代码来创建,但也可以用对话框资源板来创建
 +-CObject
  +-CCmdTarget
   +-CWnd
    +-CScrollBar

CScrollBar 类的方法
方法   说明
EnableScrollBar() 是滚动条的一个或两个箭头有效或无效
GetScrollInfo()  获得滚动条的信息
GetScrollLimit() 获得滚动条的范围
GetScrollPos()  获得滚动条当前的位置
GetScrollRange() 获得滚动条的当前最大的和最小滚动位置
SetScrollInfo()  设置滚动条的消息
SetScrollPos()  设置滚动条当前的位置
SetScrollRange() 设置滚动条的最大和最小滚动位置
ShowScrollBar()  显示或隐藏滚动条

创建与初始化滚动条类

创建CScrollBar对象的一般步骤
1.用C++关键字New和构造函数CScrollBar::CScrollBar()为一个ScrollBar对象分配一个实例
分配一个滚动条控件对象并返回指向该对象的指针
CScrollBar::pMyScroll = new CScrollBar
2.初始化CScrollBar对象,将一个Windows滚动条赋予它,并用CScrollBar::Create()方法设置参数和样式。
调用CScrollBar::Create()方法初始化指针
BOOL Create(DWORD dwStyle,const RECT& rect,CWnd *pParentWnd,UINT nID);
DWORD dwStyle 滚动条窗口的样式
const RECT& rect表示控件的大小和位置
CWnd *pParentWnd指向控件所属窗口的指针
UINT nID父窗口与滚动条通信的标识

在设置滚动条控件时,要通过CScrollBar::SetScrollRange()设置范围

例如设置滚动范围为-100到100的垂直滚动条
pMyScroll->SetScrollRange(SB_VERT,-100,100);

在设置了范围后,还要通过SetScrollPos()设置滚动块当前的位置

例如,滚动块的位置再-100到100的中间,即为0的位置
pMyScroller->SetScrollPos(0);


*****************************************************************************************
BOOL CApplicationofScrollBarDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Add "About..." menu item to system menu.

 // IDM_ABOUTBOX must be in the system command range.
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon
 
 // TODO: Add extra initialization here
 m_scroll.SetScrollRange(0,20);
 m_scroll.SetScrollPos(10);
 char spos[10];
 itoa(m_scroll.GetScrollPos(),spos,10);
 m_edit.SetSel(0,-1);
 m_edit.ReplaceSel(spos);
 UpdateData(false);
 return TRUE;  // return TRUE  unless you set the focus to a control
}
********************************************************************************************
void CApplicationofScrollBarDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
 char spos[10];
 int inowpos;
 switch(nSBCode)
 {
  if(pScrollBar==&m_scroll)
  {
   //SB_THUMBTRACK             滚动条滑块被拖动   
   //SB_THUMBPOSTION         拖动后滚动条滑块被释放   
   case SB_THUMBTRACK:
    //获得滚动块所在的位置
    m_scroll.SetScrollPos(nPos);
    //转化成数字
    itoa(nPos,spos,10);
    //选中编辑框中的所有文字
    m_edit.SetSel(0,-1);
    //替换成当前位置的值
    m_edit.ReplaceSel(spos);
    break;
   //SB_LINEDOWN 向下的小三角形
   case SB_LINEDOWN:
    //获得滚动条所在的位置
    inowpos = m_scroll.GetScrollPos();
    //滚动条的位置加一
    inowpos=inowpos+1;
    //判断滚动条的位置不能大于20
    if(inowpos>20)
    {
     //强行吧inowpos的值赋为20
     inowpos=20;
    }
    //设置滚动块所在的位置
    m_scroll.SetScrollPos(inowpos);
    //数据类型转化
    itoa(m_scroll.GetScrollPos(),spos,10);
    //选择编辑框中的所有的内容
    m_edit.SetSel(0,-1);
    //重新设置内容
    m_edit.ReplaceSel(spos);
    break;
    //SB_LINEUP 向上的小三角形
   case SB_LINEUP:
    //获得滚动块的位置
     inowpos = m_scroll.GetScrollPos();
     //滚动块的位置减一
    inowpos=inowpos-1;
    //判断位置不能小于0
    if(inowpos<0)
    {
     //强行赋值为0
     inowpos=0;
    }
    //设置滚动块的位置为inowpos
    m_scroll.SetScrollPos(inowpos);
    //数据转化
    itoa(m_scroll.GetScrollPos(),spos,10);
    //选中编辑框中所有的内容
    m_edit.SetSel(0,-1);
    //替换文本的内容为滚动块当前所在的位置
    m_edit.ReplaceSel(spos);
    break;
   //SB_PAGEDOWN  单击中心点以下的滚动条
   case SB_PAGEDOWN:
    //获得滚动块目前所在的位置
    inowpos = m_scroll.GetScrollPos();
    //位置加3
    inowpos=inowpos+3;
    //判断位置不能大于20
    if(inowpos>20)
    {
     //强行赋值为20
     inowpos=20;
    }
    //设置滚动块现在所在的位置
    m_scroll.SetScrollPos(inowpos);
    //数据转化
    itoa(m_scroll.GetScrollPos(),spos,10);
    //选中文本框中的所有的数据
    m_edit.SetSel(0,-1);
    //替换文本框中的值为当前滚动块所在的位置
    m_edit.ReplaceSel(spos);
    break;
   //SB_PAGEUP 单击中心点以上的滚动条
   case SB_PAGEUP:
    //获得滚动块所在的位置
    inowpos = m_scroll.GetScrollPos();
    //滚动块的位置减1
    inowpos=inowpos-3;
    //判断滚动块的位置不能小于0
    if(inowpos<0)
    {
     //强行赋值为0
     inowpos=0;
    }
    //设置滚动块所在的位置
    m_scroll.SetScrollPos(inowpos);
    //数据转化
    itoa(m_scroll.GetScrollPos(),spos,10);
    //选中编辑框中的所有的文本
    m_edit.SetSel(0,-1);
    //替换文本
    m_edit.ReplaceSel(spos);
    break;
  }
 }
 CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CApplicationofScrollBarDlg::OnExit() 
{
 //关闭窗口
 OnOK(); 
}

void CApplicationofScrollBarDlg::OnReset() 
{
 //设置滚动块所在的位置
 m_scroll.SetScrollPos(10); 
 //获得文本框中所有的文本
 m_edit.SetSel(0,-1);
 //设置文本为“10”
 m_edit.ReplaceSel("10");
}

void CApplicationofScrollBarDlg::OnUp() 
{
 //设置滚动块的位置为"0"
 m_scroll.SetScrollPos(0);
 //获得文本框中的所有的文本
 m_edit.SetSel(0,-1);
 //设置文本框的值为“0”
 m_edit.ReplaceSel("0");
}

void CApplicationofScrollBarDlg::OnDown() 
{
 //设置滚动块的位置为“20”
 m_scroll.SetScrollPos(20);
 //获得文本框中的所有的信息
 m_edit.SetSel(0,-1);
 //替换文本框中的位置为“20”
 m_edit.ReplaceSel("20"); 
}

***************************************************/


////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
按钮控件与列表框控件
按钮控件
按钮是最常见的控件之一
复选框(Checkboxes) 常用于两种完全相反状态的情况下
单选按钮(Radiobuttons) 适用于同一组属性相同的数据中选一个数据
下压式按钮(Pushbuttons) 适用于消息的发送
分组框(Group boxes) 没有太多的操作只是在窗口中划分区域范围

Cbutton 及 CBitmapButton类再MFC窗口类的层次结构中的位置
+-CObject
 +-CCmdTarget
  +-CWnd
   +-CButton
+-CObject
 +-CCmdTarget
  +-CWnd
   +-CButton
    +-CBitmapButton 
 
CButton类中按钮特有的样式
样式宏      说明
BS_3STATE     此样式为复选框,但是方框可以被选中,也可以变暗(标明复选框无效)
BS_AUTO3STATE     此样式为复选框,但是方框可以被选中,也可以变暗(标明复选框无效),当用户选择方框时,它的选中状态会自动转换
BS_AUTOCHECKBOX    此样式为复选框,当用户选择方框时,他的选中状态会自动装换
BS_AUTORIDIOBUTTON   此样式为单选按钮,当用户选中圆圈时,按钮自动显示自己被选中的状态,同事使其它具有相同样式的同组的单选按钮处于未被选中的状态。
BS_CHECKBOX    创建一个复选框,默认情况下它的右边有标题,当与BS_LEFTTEXT一起使用时,标题再左边
BS_DEFPUSHBUTTON   创建一个下式按钮
BE_LEFTTEXT    当和一个单选按钮或复选按钮一起使用时,使得按钮文字出现再按钮的左边
BS_OWNERDRAW    创建自定义按钮,当按钮视觉被改变时,MFC自动调用DrawItem()方法在使用CBitmapButton类时,这种样式必须被指定
BS_PUSHBUTTON    创建一个下压式按钮,用户单击此按钮时,向系统发送WM_COMMAND消息
BS_RADIOBUTTON    创建单选按钮


CButton的方法
方法     说明
GetBitmap()    获得SetBitmap()设置的位图的句柄
GetButtonStyle()   获得有关按钮控件样式的信息
GetCheck()    获得按钮控件选中的状态 
GetCursor()    获得通过SetCursor()设置的图标句柄
GetIcon()    获得由SetIcon()设置的图标句柄
GetState()    获得按钮控件的选中、选择和聚焦状态
SetBitmap()    指定按钮上显示的位图
SetButtonStyle()   改变按钮样式
SetCheck()    设置按钮控件的选中状态
SetCursor()    指定按钮控件上的光标图像
SetIcon()    指定按钮上显示的图标
SetState()    设置按钮控件的选择状态

CBitmapButton(类定义的两个初始化方法以增强按钮的功能)
LoadBitmaps() 
为CBitmapButton对象附上位图,最多可有4个位图,这些位图用于程序的资源文件中读取
AutoLoad()
将对话框按钮CBitmapButton()对象连写起来

有事必须调整位图的尺寸大小,可以通过SizeToContent()方法进行调整。
MFC调用方法DrawItem()自动再一个按钮的用户区上画上位图,即用户可以自定义按钮


列表框控件
 +-CObject
  +-CCmdTarget
   +-CWnd
    +-CListBox
MFC中CListBox类的层次结构
列表框常用于从总舵数据黄总选某一项
 列表框常用再对话框里,如用列表框选择文件名,目录等。列表框有一个预定义的键盘接口,用户可以用键盘上的箭头和PageUp或PageDown键再列表框中尽心数据的选择,或通过适当的样式设置,允许与Shift或Ctrl键组合使用。

CListBox()控件可用的样式
样式    说明
LBS_DISABLENOSCROLL  当列表框不需要滚动条时,滚动条无效
LBS_EXTENDSEL   允许使用鼠标及特殊键组合进行多项选择
LBS_HASSTRINGS   知名自绘的列表框,其中包括字符串选项
LBS_MULTICOLUMN   指明一个多列列表,它含有一个水平滚动条,可以SetColumnWindth()方法设置的宽度
LBS_MULTIPLESEL   用户通过单击或双击一项进行选择或取消选择
LBS_NOINTEGRALHEINGHT  将列表框设置为创建指定的大小
LBS_NOREDRAW   列表框在变化时不重绘,用户可以再任何时候发送WM_SETREDRAW消息改变这种模式
LBS_NOSEL   知名列表框包含只能看不见选择的项
LBS_NOTIFY   当用户单击或双击时向父窗口发送消息
LBS_OWNERDRAWFIXED  指明列表框的所有者负责填写列表项,且列表框具有相同的高度
LBS_OWNERDRAWVARIABLE  知名列表框的所有者负责填写列表项,且列表框可以不同高度
LBS_SORT   列表项按字母顺序排序
LBS_STANDARD   此样式是 LBS_NOTIFY、LBS_SORT、WS_VSCROLL和WS_BORDER的组合
LBS_USETABSTOPS   告知列表框再加入字符串列表项时加入tab字符
LBS_WANTKEYBOARDINPUT  允许应用程序通过发送WM_VKEYTOITEM 和WM_CHARTOITEM消息给列表框的所有者来处理键盘输入

消息映像项使用下面基本格式
ON_Message(ControlID,ClassMethod)
ControlID 发送消息的列表框控件的子窗口标识
ClassMethod 处理消息的父类方法的名字
所有者类声明中的方法原型
afx_msg void ClassMethod();

CListBox消息的消息映像项

消息映像项   说明
ON_LBN_DBLCLK   当用户双击选项时具有LBS_NOTIFY样式的列表框向所有者发送此消息
ON_LBN_ERRSPACE   列表框不能分贝足够内存以满足要求
ON_LBN_KILLFOCUS  当列表框失去输入焦点时出现此消息
ON_LBN_SELCANCEL  当取消当前列表框选择时,具有LBS_NOTIFY样式的列表框向所有者发送此消息
ON_LBN_SELCHANGE  当列表框中的选择改变时,具有LBS_NOTIFY样式的列表框向它的父窗口发送此通知,如果选择是用CListBox::SetCutSel() 类方法改变的,则不发送通知。对多项选择列表框来说,当用户按箭头键时,即使选择不变也发送此通知

通用方法

 通用方法用来获得和设置列表框数据的值和属性,所有的CListBox 列表框都有这些方法,包括单选列表框、多选列表框和自绘制列表框等

通用CListBox类方法

方法   描述
GetCount()  获得列表框中列表项数目
GetHorizontalExtent() 获得列表框的水平滚动宽度(按像素)
GetITemData()  获得列表框项有关的32为值
GetItemDataPtr() 获得指向列表框项的指针
GetItemHeight()  获得列表框中项的高度


单项选择特定方法
列表框的默认模式是单选项模式;所有的通用方法均使用于单选项列表框。

只有两个类方法专门处理单选项列表框
GetCurSel() 获得当前选择列表框项的下标(基于0)
SetCurSel() 选择列表框字符串

多项选择特定方法
方法    说明
GetAnchorIndex()  获得多选项选择列表框中当前定位项的下标
GetCaretIndex()   获得多项选择列表框中具有贯标矩形的项的下标
GetSelCount()   获得多项选择列表框中当前所选的项的数目
GetSelItems()   将所有当前被选列表框项下标放入一整型数组缓存中
SetItemRange()   切换多项选择列表框项范围的选择状态
SetAnchorIndex()  再多项选择列表框中扩充选择设置开始(定位)项
SetCaretIndex()   在多项选择列表框中指定下标项设置光标矩形 
SetSel()   再多项选择列表框中切换项目的选择状态

字符串指定的方法

方法    说明
AddString()   在列表框中删除一个字符串
DeleteString()   从列表框中删除一个字符串
Dir()    从当前目录加文件名放入列表框
FindString()   再列表框中搜索一字符串
FindStringExact()  在列表框中搜索第一个与指定搜索字符串匹配的字符串
InsertString()   再列表框指定下标处插入一字符串
ResetContent()   清除列表框中的所有项
SelectString()   再单选列表框中搜索并选择一字符串

虚拟方法

CLstBox类还声明了几个虚拟方法,你可以从CListBox类中派生一些类替换到你的类中

方法    说明
CharToItem()   可以替换此方法来为自绘列表框(没有字符串)处理WM-Char
CompareItem()   由MFC调用以得到排序的自绘列表框中的新项的位置
DeleteItem()   当用户从自绘列表框中删除一项时MFC调用此方法
DrawItem()   当确定自绘列表框项必须重绘时MFC调用此方法
MeasureItem()   当一自绘列表框被创建时MFC调用此方法类解决列表框的位数
VKeyToItem()   用户可替换此方法,来处理具有LBS_WANTKEYBOARSINPUT样式的列表框的WM_KEYDOWN

创建和初始化CListBox对象
(1)用C++关键字new 和构造函数CListBox::CListBox()
为CListBox对象分配一个实例

(2)初始化CListBox对象并赋于它一个Windows列表框,通过方法CListBox::Create()设置列表框的参数和样式。
例如:下面代码分配一个CListBox对象并返回指向该对象的指针:
 CListBox *pMyListBox = new ClistBox;
 指针pMyListBox用CListBox::Create()方法进行初始化。
该方法声明如下:
 BOOL Create
(
  DWORD dwStyle, //dwStyle是列表框控件的窗口样式
  const Recy& rect, //是一个矩形,他知名控件的大小和位置
  CWnd* pParentWnd, //pParentWnd是指向控件所有者的指针
  UINT nID      //nID是父窗口用来与列表框能信的控件标识
);

                    更多技术文章请访 www.vc258.com