null第5章 对话框与控件第5章 对话框与控件对话框的基本概念
通用对话框类
各种控件的基本用法
图像列
的例子
树控件的例子对话框的概念(1)对话框的概念(1)对话框(Dialog)是收集信息或提供反馈的窗口,它通过控件与用户交互
控件(Controls)是执行用户动作的窗口,通常为其父窗口(对话框、边框窗口、视图或控件栏)所有对话框的概念(2)对话框的概念(2)消息对话框用于显示提示信息
AfxMessageBox("Overwrite existing file?",MB_YESNOCANCEL|MB_ICONQUESTION)
返回值:IDYES、IDNO、IDOK、IDCANCEL、 IDABORT、IDIGNORE与IDRETRY对话框的概念(3)对话框的概念(3)模态对话框
最常见的对话框类型,不允许对话框打开时执行其它操作
用DoModal加载
与显示对话框
非模态对话框
允许对话框打开时执行其它操作
自己编写构造#
数#,用Create加载模板,用ShowWindow显示对话框对话框的概念(4)对话框的概念(4)模态对话框
非模态对话框CMyDialog *Dlg;
Dlg=new CMyDialog(this);
Dlg->Create(IDD_MYDIALOG);
Dlg->ShowWindow(SW_SHOW);CMyDialog Dlg;
Dlg.DoModal();对话框的概念(5)对话框的概念(5)设置对话框背景颜色
SetDialogBkColor(RGB(200,200,200), RGB(0,0,0))
处理对话框中的消息
OnInitDialog():初始化对话框
OnOk():确定按钮
OnCancel():取消按钮对话框的概念(6)对话框的概念(6)用对话框编辑器设计对话框
用ClassWizard创建对话框类
为对话框中的控件与对话框类中的消息处理函数建立映射
用ClassWizard添加与控件相关成员变量
创建对话框模板并显示对话框对话框的例子(1)对话框的例子(1)设计对话框控件对话框的例子(2)对话框的例子(2)为控件添加对应的成员变量对话框的例子(3)对话框的例子(3)在CTestDialog::OnInitDialog()中
在CTestDialog::OnTest()中CString str;
str.Format("年龄:%d",m_Age);
str="学号:"+m_ID+"\n姓名:"+m_Name+"\n"+str;
MessageBox(str);m_ID="1001";
m_Name="Zhang";
m_Age=20;
UpdateData(false);对话框的例子(4)对话框的例子(4)通用对话框类(1)通用对话框类(1)通用对话框是预定义对话框,执行各种标准操作(CCommonDialog)通用对话框类(2)通用对话框类(2)CFontDialog是字体对话框,m_cf用于初始化字体,其类型为CHOOSEFONT
GetColor:获得字体颜色
GetFaceName:获得字体名字
GetCurrentFont:获得选择的字体
IsBold:字体是否为粗体
IsItalic:字体是否为斜体
IsUnderline:字体是否带下划线通用对话框类(3)通用对话框类(3)在CTestView类中添加数据成员
在CTestView构造函数中初始化LOGFONT m_Font;
COLORREF m_Color;m_Font.lfHeight=30;
m_Font.lfEscapement=0;
m_Font.lfWeight=FW_NORMAL;
m_Font.lfCharSet=GB2312_CHARSET;
m_Color=RGB(255,0,0);通用对话框类(4)通用对话框类(4)在CTestView::OnDraw()中CFont NewFont;
NewFont.CreateFontIndirect(&m_Font);
pDC->SelectObject(&NewFont);
pDC->SetTextColor(m_Color);
pDC->TextOut(50,50,"显示字体属性");通用对话框类(5)通用对话框类(5)在CTestView::OnDialog()中CFontDialog Dlg;
if(Dlg.DoModal()==IDOK)
{
Dlg.GetCurrentFont(&m_Font);
m_Color=Dlg.GetColor();
Invalidate(true);
}通用对话框类(6)通用对话框类(6)通用对话框类(7)通用对话框类(7)CColorDialog是颜色对话框,m_cc用于初始化颜色,其类型为CHOOSECOLOR
GetColor:获得颜色RGB值
GetSavedCustomColors:获得自定义颜色
SetCurrentColor:设置所选颜色通用对话框类(8)通用对话框类(8)CFileDialog是文件对话框,m_ofn用于初始化文件,其类型为OPENFILENAME
CFileDialog Dlg(true,NULL,NULL, OFN_READONLY,"C++ source|*.cpp")
GetFileName:获得文件名
GetPathName:获得文件路径
GetFileExt:获得文件扩展名
GetStartPosition:获得文件列表起始位置通用对话框类(9)通用对话框类(9)CPrintDialog是打印对话框,m_pd用于初始化打印,其类型为PRINTDLG
CPrintDialog Dlg(true)
GetDefaults:获得默认打印机信息
GetCopies:获得打印份数
GetFromPage:获得打印起始页
GetToPage:获得打印终止页通用对话框类(10)通用对话框类(10)CFindReplaceDialog是查找对话框,m_fr用于初始化查找,类型为FINDREPLACE
非模态对话框:CFindReplaceDialog *pDlg=new FindReplaceDialog()
FindNext:是否查找字符串下一次出现
GetFindString:获得查找字符串
GetReplaceString:获得替换字符串
MatchCase:是否精确匹配字符串控件类型(1)控件类型(1)控件类型(2)控件类型(2)控件类型(3)控件类型(3)静态控件(1)静态控件(1)静态控件(CStatic)用于显示文本、图标、位图等,通常不进行输入与输出
通过CStatic成员函数操作静态控件,例如将静态控件变为输入
IDC_STATIC到IDC_CTRLID、IDC_CTRLNAME、IDC_CTRLAGE静态控件(2)静态控件(2)为静态控件添加成员变量
在CTestDialog::OnTest()中m_CtrlID.SetWindowText("ID");
m_CtrlName.SetWindowText("NAME");
m_CtrlAge.SetWindowText("AGE");静态控件(3)静态控件(3)按钮控件(1)按钮控件(1)按钮控件(CButton)是一种子窗口,通过单击或双击执行某种操作,主要包括:复选框、单选钮和下压按钮
通过CButton成员函数操作按钮控件
GetIcon()、GetCursor()、GetBitmap()、 GetButtonStyle()、GetState()、GetCheck()与对应的Set函数按钮控件(2)按钮控件(2)修改按钮控件属性
选中IDC_TEST的Icon属性
为按钮控件添加成员变量
IDC_TEST对应于m_Test
在CTestDialog::OnInitDialog()中HICON hIcon;
hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_Test.SetIcon(hIcon);按钮控件(3)按钮控件(3)按钮控件(4)按钮控件(4)增加一个复选框控件
IDC_MYCHECK属于按钮控件
在CTestDialog::OnMyCheck()中CButton *pCheck=(CButton*)GetDlgItem (IDC_MYCHECK);
CString str;
str.Format("复选框状态:%d",pCheck-> GetCheck());
MessageBox(str);组合框控件(1)组合框控件(1)列表框控件(CListBox)
用于显示列表项,查看和选择列表项
编辑框控件(CEdit)
用于输入文本信息
组合框控件(CComboBox)
由静态控件、列表框和编辑框控件组成组合框控件(2)组合框控件(2)CComboBox的成员函数
GetCurSel:获得列表框当前项位置
GetLBText:获得列表框指定项内容
SetCurSel:设置列表框指定项位置
AddString:列表框结尾添加字符串
InsertString:列表框插入字符串
DeleteString:列表框删除字符串
ResetContent:删除列表框中所有项组合框控件(3)组合框控件(3)设计对话框控件组合框控件(4)组合框控件(4)设置IDC_NUMBER的Data属性
添加数据First、Second与Third
设置IDC_NUMBER的Type属性
DropDown与DropList
为IDC_NUMBER添加成员变量组合框控件(5)组合框控件(5)在CTestDialog类定义中
在CTestDialog::OnInitDialog()中GetDlgItem(IDC_DISPLAY)->GetWindowRect (&m_Rect);
ScreenToClient(&m_Rect);
m_CtrlNumber.SetCurSel(0);
m_CtrlNumber.GetLBText(m_CtrlNumber. GetCurSel(),m_Number);private:
CRect m_Rect;组合框控件(6)组合框控件(6)在CTestDialog::OnPaint()的else中
在CTestDialog::OnSelchangeNumber()中m_CtrlNumber.GetLBText(m_CtrlNumber. GetCurSel(),m_Number);
InvalidateRect(&m_Rect);CPaintDC dc(this);
dc.SetTextColor(RGB(0,0,255));
dc.TextOut(m_Rect.left+20,m_Rect.top+20, m_Number);组合框控件(7)组合框控件(7)在CTestDialog::OnEditchangeNumber()中m_CtrlNumber.GetWindowText(m_Number);
InvalidateRect(&m_Rect);
或者
CComboBox* pComb=(CComboBox *)GetDlgItem (IDC_NUMBER);
pComb->GetWindowText(m_Number);
InvalidateRect(&m_Rect);组合框控件(8)组合框控件(8)在CTestDialog::OnLine()中
在CTestDialog::OnEllipse()中CDC* pDC; pDC=GetDC();
pDC->MoveTo(m_Rect.left+20,m_Rect.top+20);
pDC->LineTo(m_Rect.right-20,m_Rect.bottom-20);
ReleaseDC(pDC);CDC* pDC; pDC=GetDC();
pDC->Ellipse(m_Rect.left+20,m_Rect.top+20, m_Rect.right-20,m_Rect.bottom-20);
ReleaseDC(pDC);组合框控件(9)组合框控件(9)标准模板库标准模板库STL(Standard Template Library)是标准模板类库,它是基于模板的容器类库
STL包括数据结构,例如链表、队列和栈;也包括通用的算法,例如排序和查找列表框控件(1)列表框控件(1)定义类模板
CTypedPtrList
m_pDataList列表框控件(2)列表框控件(2)m_pDataList的成员函数
GetHeadPosition()与GetTailPosition()
GetAt()、GetPrev()与GetNext()
AddTail()与RemoveHead()
InsertAfter()与InsertBefore()
RemoveAt()与RemoveAll()
IsEmpty()列表框控件(3)列表框控件(3)设计对话框控件列表框控件(4)列表框控件(4)在StdAfx.h中
添加CStudent类,基类为CObject#include "stdafx.h"
#include "Student.h"
class CStudent : public CObject
{
public:
CString m_sID; CString m_sName;
CStudent(CString sID,CString sName);
};#include 列表框控件(5)列表框控件(5)为控件添加成员变量
在CTestDialog类定义中private:
POSITION m_CurPos;
CTypedPtrList m_pDataList;列表框控件(6)列表框控件(6)在CTestDialog::OnAdd()中BOOL bSucc=UpdateData(true);
if(!bSucc) return;
if(m_ID.GetLength()==0)
{ MessageBox("ID cannot empty!");
(CEdit*)GetDlgItem(IDC_ID)->SetFocus(); return; }
if(m_Name.GetLength()==0)
{ MessageBox("Name cannot empty!");
(CEdit*)GetDlgItem(IDC_NAME)->SetFocus(); return; }
CStudent *pStudent; //向链表追加结点
pStudent=new CStudent(m_ID,m_Name);
m_pDataList.AddTail(pStudent);
m_CurPos=m_pDataList.GetTailPosition();
CString str; //向ListBox追加字符串
str=m_ID+" "+m_Name; m_CtrlList.AddString(str);
m_CtrlList.SetCurSel(m_CtrlList.GetCount()-1);列表框控件(7)列表框控件(7)在CTestDialog::OnPrevious()中if(m_CurPos!=NULL)
{ //计算上一条记录在链表中位置
if(m_CurPos==m_pDataList.GetHeadPosition())
m_CurPos=m_pDataList.GetTailPosition();
else m_pDataList.GetPrev(m_CurPos);
//从链表中取出上一条记录
CStudent *pStudent=m_pDataList.GetAt(m_CurPos);
m_ID=pStudent->m_sID; m_Name=pStudent->m_sName;
UpdateData(false);
//计算上一条记录在ListBox中位置并选中
int nCur=m_CtrlList.GetCurSel();
if(nCur==0) nCur=m_CtrlList.GetCount()-1;
else nCur--;
m_CtrlList.SetCurSel(nCur); }
else { MessageBox("No Item!"); }列表框控件(8)列表框控件(8)在CTestDialog::OnNext()中:if(m_CurPos!=NULL)
{ //计算下一条记录在链表中位置
if(m_CurPos==m_pDataList.GetTailPosition())
m_CurPos=m_pDataList.GetHeadPosition();
else m_pDataList.GetNext(m_CurPos);
//从链表中取出下一条记录
CStudent *pStudent=m_pDataList.GetAt(m_CurPos);
m_ID=pStudent->m_sID; m_Name=pStudent->m_sName;
UpdateData(false);
//计算下一条记录在ListBox中位置并选中
int nCur=m_CtrlList.GetCurSel();
if(nCur==m_CtrlList.GetCount()-1) nCur=0;
else nCur++;
m_CtrlList.SetCurSel(nCur); }
else{ MessageBox("No Item!"); }列表框控件(9)列表框控件(9)在CTestDialog::OnClose()中
在CTestDialog::OnDestroy()中
在CTestDialog::OnInitDialog()中if(MessageBox("Close Dialog?","Close", MB_OKCANCEL|MB_ICONQUESTION)==IDOK)
CDialog::OnCancel();if(!m_pDataList.IsEmpty())
delete m_pDataList.RemoveHead();m_CurPos=NULL;列表框控件(10)列表框控件(10)列表框控件(11)列表框控件(11)通过状态图来控制按钮状态enum STATE
{
STARTSTATE, //开始状态
BROWSESTATE, //浏览状态
ADDSTATE, //增加状态
MODIFYSTATE, //修改状态
FINALSTATE, //结束状态
};列表框控件(12)列表框控件(12)绘图程序的例子(1)绘图程序的例子(1)通过画笔在视图窗口画一个矩形
增加画笔对话框,改变画笔的风格与宽度
增加颜色对话框,改变画笔的颜色
增加菜单项与工具栏按钮,打开两种对话框绘图程序的例子(2)绘图程序的例子(2)设计对话框控件绘图程序的例子(3)绘图程序的例子(3)为控件添加成员变量
在CTestDialog类定义中protected:
CRect m_Sample;绘图程序的例子(4)绘图程序的例子(4)在CTestDialog类定义前
在CTestDialog::OnInitDialog()中enum {PEN_STYLE_SOLID,PEN_STYLE_DASH, PEN_STYLE_DOT};GetDlgItem(IDC_SAMPLE)->GetWindowRect (&m_Sample);
ScreenToClient(&m_Sample);绘图程序的例子(5)绘图程序的例子(5)在CTestDialog::OnSolid()中
在CTestDialog::OnDash()中
在CTestDialog::OnDot()中m_Style=PEN_STYLE_SOLID;
InvalidateRect(&m_Sample);m_Style=PEN_STYLE_DASH;
InvalidateRect(&m_Sample);m_Style=PEN_STYLE_DOT;
InvalidateRect(&m_Sample);绘图程序的例子(6)绘图程序的例子(6)在CTestDialog::OnChangeWidth()中int tmp;
tmp=GetDlgItemInt(IDC_WIDTH);
if((tmp>0)&&(tmp<7))
{
m_Width=tmp;
InvalidateRect(&m_Sample);
}绘图程序的例子(7)绘图程序的例子(7)在CTestDialog::OnPaint()中CPen NewPen;
switch(m_Style) {
case PEN_STYLE_SOLID:
NewPen.CreatePen(PS_SOLID,m_Width,RGB(0,0,0)); break;
case PEN_STYLE_DASH:
NewPen.CreatePen(PS_DASH,m_Width,RGB(0,0,0)); break;
case PEN_STYLE_DOT:
NewPen.CreatePen(PS_DOT,m_Width,RGB(0,0,0)); break;
default:
NewPen.CreatePen(PS_SOLID,m_Width,RGB(0,0,0)); break; }
dc.SelectObject(&NewPen);
dc.MoveTo(m_Sample.left+20,m_Sample.top+50);
dc.LineTo(m_Sample.right-20,m_Sample.top+50);绘图程序的例子(8)绘图程序的例子(8)在Resourse View中增加菜单项
ID_OPTION_PEN Pen(E) Ctrl+E
ID_OPTION_COLOR Color(L) Ctrl+L
在Resourse View中增加快捷键
ID_OPTION_PEN Ctrl+E VIRTKEY
ID_OPTION_COLOR Ctrl+L VIRTKEY
在Resourse View中增加工具栏按钮
ID_OPTION_PEN
ID_OPTION_COLOR绘图程序的例子(9)绘图程序的例子(9)在CTestDoc类定义中
在CTestDoc构造函数中public:
int m_Width;
int m_Style;
COLORREF m_Color;m_Width=1;
m_Style=PEN_STYLE_SOLID;
m_Color=RGB(0,0,0);绘图程序的例子(10)绘图程序的例子(10)在CTestDoc::OnOptionPen()中
在CTestDoc::OnOptionColor()中CPenDialog PenDlg;
PenDlg.m_Width=m_Width;
PenDlg.m_Style=m_Style;
if(PenDlg.DoModal()==IDOK)
{ m_Width=PenDlg.m_Width;
m_Style=PenDlg.m_Style; }CColorDialog ColorDlg;
if (ColorDlg.DoModal()==IDOK)
m_Color=ColorDlg.GetColor();绘图程序的例子(10)绘图程序的例子(10)在CTestDoc::OnOptionPen()中
在CTestDoc::OnOptionColor()中CPenDialog PenDlg;
PenDlg.m_Width=m_Width;
PenDlg.m_Style=m_Style;
if(PenDlg.DoModal()==IDOK)
{ m_Width=PenDlg.m_Width;
m_Style=PenDlg.m_Style; }CColorDialog ColorDlg;
if (ColorDlg.DoModal()==IDOK)
m_Color=ColorDlg.GetColor();绘图程序的例子(11)绘图程序的例子(11)绘图程序的例子(12)绘图程序的例子(12)在CTestView::OnLButtonDown()中CTestDoc *pDoc=GetDocument();
CPen NewPen;
switch(pDoc->m_Style) {
case PEN_STYLE_SOLID:
NewPen.CreatePen(PS_SOLID,pDoc->m_Width,pDoc->m_Color);
break;
case PEN_STYLE_DASH:
NewPen.CreatePen(PS_DASH,pDoc->m_Width,pDoc->m_Color);
break;
case PEN_STYLE_DOT:
NewPen.CreatePen(PS_DOT,pDoc->m_Width,pDoc->m_Color);
break; }
CDC* pDc=GetDC(); pDc->SelectObject(&NewPen);
pDc->Rectangle(20,20,200,200);绘图程序的例子(13)绘图程序的例子(13)旋转框控件(1)旋转框控件(1)旋转框控件(Spin)称为UP_DOWN控件,通常与编辑框控件一起使用
添加编辑框控件和Spin控件,使编辑控件的tab次序在Spin控件之前
Spin控件的Alignment值设为Right。
选中Auto Buddy和Set Buddy Integer复选框
不能为Spin控件设定Tab Stop属性旋转框控件(2)旋转框控件(2)CSpinButtonCtrl用于管理Spin控件
为控件添加成员变量m_Spin
SetRange()用于改变取值范围
在CTestDialog::OnInitDialog()中m_Spin.SetRange(0,50);
m_Spin.SetPos(25);滑动条控件滑动条控件滑动条控件(Slider)在两个点之间移动
选中Auto Ticks和Tick Marks复选框
CSpinButtonCtrl用于管理Slider控件
为控件添加成员变量m_Slider
SetRange()用于改变取值范围
在CTestDialog::OnInitDialog()中m_Slider.SetRange(0,100);
m_Slider.SetTicFreq(10);进展条控件(1)进展条控件(1)进展条控件(Progress)指示程序的进展
风格有Border、Vertical与Smooth
CSpinButtonCtrl用于管理Progress控件
为控件添加成员变量m_Progress
SetRange()用于改变取值范围进展条控件(2)进展条控件(2)按钮(IDC_TEST)用于控制Progress控件
在CTestDialog::OnTest()中m_Progress.SetRange(0,100);
m_Progress.SetStep(5);
for(int i=0;i<20;i++)
{
m_Progress.StepIt();
Sleep(100);
}进展条控件(3)进展条控件(3)当滑动条控件移动时,发送WM_VSCROLL和WM_HSCROLL消息给父窗口
通过滑动条控件的滚动消息更新进展条控件
在CTestDialog::OnInitDialog()中
在CTestDialog::OnHScroll()中m_Progress.SetPos(m_Slider.GetPos());m_Slider.SetRange(0,100);
m_Slider.SetTicFreq(10);
m_Progress.SetRange(0,100);进展条控件(4)进展条控件(4)直接创建控件(1)直接创建控件(1)在CTestView类定义中
private: CSliderCtrl m_Slider;
在CTestView类定义前
#define IDC_SLIDER 101
在CTestView::OnCreate()中m_Slider.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|TBS_AUTOTICKS|TBS_BOTH|TBS_HORZ,CRect(40,40,300,80),this,IDC_SLIDER);直接创建控件(2)直接创建控件(2)创建滑动条的范围与刻度间隔
在CTestView::OnHScroll()中m_Slider.SetRange(0,100);
m_Slider.SetTicFreq(10);CSliderCtrl* Slider=(CSliderCtrl*)pScrollBar;
CString m_Pos;
m_Pos.Format("%d",Slider->GetPos());
CClientDC dc(this);
dc.TextOut(40,20,m_Pos);直接创建控件(3)直接创建控件(3)在CTestView类定义中
private: CProgressCtrl m_Progress;
在CTestView类定义前
#define IDC_PROGRESS 102
在CTestView::OnCreate()中m_Progress.Create(WS_CHILD|WS_VISIBLE|WS_BORDER,CRect(400,40,700,80),this,IDC_PROGRESS);直接创建控件(4)直接创建控件(4)创建进展条的范围、步长和进度值
在CTestView::OnLButtonDown()中m_Progress.SetRange(0,100);
m_Progress.SetStep(10);
m_Progress.SetPos(50);for(int i=0;i<5;i++)
{ m_Progress.StepIt();
Sleep(100); }动画控件(1)动画控件(1)设计对话框控件动画控件(2)动画控件(2)在CTestDialog::OnBrowse()中CFileDialog dlg(true,NULL,NULL,OFN_READONLY,"Animation(*.avi)|*.avi|");
if(dlg.DoModal()==IDOK)
{
CString FileName=dlg.GetPathName();
m_CtrlAnimate.Stop();
m_CtrlAnimate.Close();
m_CtrlAnimate.Open(FileName);
}动画控件(3)动画控件(3)在CTestDialog::OnPlay()中
m_CtrlAnimate.Play(0,0xFFFF,1);
在CTestDialog::OnStop()中
m_CtrlAnimate.Stop();
在CTestDialog::OnDisp()中
m_CtrlAnimate.Seek(5);动画控件(4)动画控件(4)图像列表与位图(1)图像列表与位图(1)图像列表类似于位图数组,每个位图都有一个索引,用于查找特定图像
CImageList类用于创建、显示和管理图像列表图像列表与位图(2)图像列表与位图(2)在ResourceView中加载多个位图或ICON
定义一个图像列表
CImageList *m_pImageList;
创建图像列表
m_pImageList=new CImageList();
m_pImageList->Create(16,16,ILC_MASK,5,1);
将图像装载到m_pImageList
m_pImageList->Add(&bmp,RGB(255,255,255));图像列表与位图(3)图像列表与位图(3)在Resource View中加载位图
IDB_CLASS、IDB_STUREC、IDB_COMPUTERDEPT、 IDB_SELECTEDCLASS、IDB_SELECTEDSTUREC与
在CTestDialog类定义中private:
CImageList *m_pImageList;
void AddBitmapToImageList(UINT nBitmap);图像列表与位图(4)图像列表与位图(4)在CTestDialog类构造函数中m_pImageList=new CImageList();
m_pImageList->Create(16,16,ILC_MASK,0,1);
AddBitmapToImageList(IDB_COMPUTERDEPT);
AddBitmapToImageList(IDB_CLASS);
AddBitmapToImageList(IDB_SELECTEDCLASS);
AddBitmapToImageList(IDB_STUREC);
AddBitmapToImageList(IDB_SELECTEDSTUREC);图像列表与位图(5)图像列表与位图(5)在CTestDialog::AddBitmapToImageList()中
在CTestDialog::OnDestroy()中CBitmap bmp;
bmp.LoadBitmap(nBitmap);
m_pImageList->Add(&bmp,RGB(255,255,255));
bmp.DeleteObject();delete m_pImageList;图像列表与位图(6)图像列表与位图(6)在CTestDialog::OnPaint()的else中CPaintDC dc(this);
CPoint pt1(10,10),pt2(10,60);
int nCount=m_pImageList->GetImageCount();
for(int i=0;iDraw(&dc,i,pt1,ILD_NORMAL);
m_pImageList->Draw(&dc,i,pt2,ILD_MASK);
pt1.x+=50; pt2.x+=50;
}树状控件(1)树状控件(1)树状控件(Tree)通过树或分层结构显示信息
树的顶部称为父条目,其下条目称为子条目
用户可以展开或折叠树条目,以控制需要显示的信息
当需要更多的水平或竖直控件时,树控件会自动显示滚动条树状控件(2)树状控件(2)树状控件的风格属性
TVS_HASLINES:在父/子结点间绘制连线
TVS_LINESATROOT:在根/子结点间绘制连线
TVS_HASBUTTONS:在结点前添加按钮,表示结点是否被展开
TVS_EDITLABELS:结点的显示字符可编辑
TVS_SHOWSELALWAYS:在失焦时显示当前结点
TVS_DISABLEDRAGDROP:不允许Drag/Drop 树状控件(3)树状控件(3)CTreeCtrl用于管理树状控件
SetImageList()与InsertItem()
GetSelectedItem()与SelectItem()
GetItemText()与SetItemText()
DeleteItem()与DeleteAllItems()
GetRootItem()、GetChildItem()、GetParentItem()与GetNextSiblingItem()树状控件(4)树状控件(4)树状控件的消息映射
TVN_SELCHANGED:选中结点发生改变
TVN_ITEMEXPANDED:选中结点被展开
TVN_BEGINLABELEDIT:开始编辑结点字符
TVN_ENDLABELEDIT:结束编辑结点字符
TVN_GETDISPINFO:需要得到某结点信息树状控件(5)树状控件(5)设计对话框控件
Tree Control风格
Has Button(增加按钮)、Has Lines(增加父子连线)、Lines at root(增加根连线)
Edit Box风格
Multiline(显示多)、Want return(回车)树状控件(6)树状控件(6)在Resource View中加载位图文件
IDB_CLASS、IDB_STUREC、IDB_COMPUTERDEPT、 IDB_SELECTEDCLASS与IDB_SELECTEDSTUREC
在CTestDialog类定义中private:
CImageList *m_pImageList;
void AddBitmapToImageList(UINT nBitmap);
void InitNodeTree();树状控件(7)树状控件(7)在CTestDialog类定义中struct CStudent
{
CString ID; CString Name; int Age;
CStudent(CString sID, CString sName, int nAge)
{ ID=sID; Name=sName; Age=nAge; };
};树状控件(8)树状控件(8)在CTestDialog类构造函数中m_pImageList=new CImageList();
m_pImageList->Create(16,16,ILC_MASK,0,1);
AddBitmapToImageList(IDB_COMPUTERDEPT);
AddBitmapToImageList(IDB_CLASS);
AddBitmapToImageList(IDB_SELECTEDCLASS);
AddBitmapToImageList(IDB_STUREC);
AddBitmapToImageList(IDB_SELECTEDSTUREC);树状控件(9)树状控件(9)在CTestDialog::AddBitmapToImageList()中
在CTestDialog::OnInitDialog()中CBitmap bmp;
bmp.LoadBitmap(nBitmap);
m_pImageList->Add(&bmp,RGB(255,255,255));
bmp.DeleteObject();InitNodeTree();树状控件(10)树状控件(10)在CTestDialog::InitNodeTree()中m_CtrlTree.SetImageList(m_pImageList,TVSIL_NORMAL);
HTREEITEM hRoot=m_CtrlTree.InsertItem("Computer Deptment",0,0);
HTREEITEM hClass=m_CtrlTree.InsertItem("Software", 1,2,hRoot);
HTREEITEM hCurNode;
CStudent *pStu;
pStu=new CStudent("1001","zhang",18);
hCurNode=m_CtrlTree.InsertItem(pStu->Name,3,4, hClass);
m_CtrlTree.SetItemData(hCurNode,(DWORD)pStu);
pStu=new CStudent("1002","wang",19);树状控件(11)树状控件(11)hCurNode=m_CtrlTree.InsertItem(pStu->Name,3,4, hClass);
m_CtrlTree.SetItemData(hCurNode,(DWORD)pStu);
hClass=m_CtrlTree.InsertItem("Application",1,2, hRoot);
pStu=new CStudent("1003","li",20);
hCurNode=m_CtrlTree.InsertItem(pStu->Name,3,4, hClass);
m_CtrlTree.SetItemData(hCurNode,(DWORD)pStu);
pStu=new CStudent("1004","zhao",21);
hCurNode=m_CtrlTree.InsertItem(pStu->Name,3,4, hClass);
m_CtrlTree.SetItemData(hCurNode,(DWORD)pStu);
m_CtrlTree.Expand(hRoot,TVE_EXPAND); 树状控件(12)树状控件(12)在CTestDialog::OnSelchangedNodetree()中HTREEITEM hSelectedNode=m_CtrlTree. GetSelectedItem();
if(m_CtrlTree.GetItemData(hSelectedNode))
{ CStudent *pStu=(CStudent*)m_CtrlTree. GetItemData(hSelectedNode);
m_Info.Format("\r\nAge: %d",pStu->Age);
m_Info="ID:"+pStu->ID+"\r\nName:"+pStu->Name +m_Info;
UpdateData(false); }
else
{ m_Info=m_CtrlTree.GetItemText(hSelectedNode);
UpdateData(false); }树状控件(13)树状控件(13)在CTestDialog::OnDestroy()中HTREEITEM hRootNode=m_CtrlTree.GetRootItem();
HTREEITEM hCurClassNode=m_CtrlTree.GetChildItem (hRootNode);
while(hCurClassNode)
{
HTREEITEM hCurStuNode=m_CtrlTree.GetChildItem (hCurClassNode);
while(hCurStuNode)
{
CStudent *pStu=(CStudent*)m_CtrlTree. GetItemData(hCurStuNode);树状控件(14)树状控件(14) delete pStu;
hCurStuNode=m_CtrlTree.GetNextSiblingItem (hCurStuNode);
}
hCurClassNode=m_CtrlTree.GetNextSiblingItem (hCurClassNode);
}
m_CtrlTree.DeleteAllItems();
delete m_pImageList;树状控件(15)树状控件(15)树状控件拖放功能(1)树状控件拖放功能(1)在树状控件中实现拖放功能
TVN_BEGINDRAG:树控件的父窗口拖动已经开始
WM_MOUSEMOVE:移动鼠标时发送
WM_LBUTTONUP:释放鼠标左按钮时发送树状控件拖放功能(2)树状控件拖放功能(2)设计对话框控件
设置树控件的风格
Has Button(增加+、-按钮)
Has Lines(增加父子条目间连线)
Lines at root(增加根条目连线)树状控件拖放功能(3)树状控件拖放功能(3)在CTestDialog类定义中private:
CImageList *m_pImageList;
BOOL m_bDragging;
HTREEITEM m_hDragItem;
HTREEITEM m_hDragTarget;
void AddBitmapToImageList(UINT nBitmap);
void InitNodeTree();树状控件拖放功能(4)树状控件拖放功能(4)在CTestDialog::InitNodeTree()中m_CtrlTree.SetImageList(m_pImageList,TVSIL_NORMAL);
HTREEITEM hRoot=m_CtrlTree.InsertItem("Computer Deptment",0,0);
HTREEITEM hClass=m_CtrlTree.InsertItem("Software", 1,2,hRoot);
m_CtrlTree.InsertItem("zhang",3,4,hClass);
m_CtrlTree.InsertItem("wang",3,4,hClass);
hClass=m_CtrlTree.InsertItem("Application",1,2, hRoot);
m_CtrlTree.InsertItem("li",3,4,hClass);
m_CtrlTree.InsertItem("zhao",3,4,hClass);
m_CtrlTree.Expand(hRoot,TVE_EXPAND);树状控件拖放功能(5)树状控件拖放功能(5)在CTestDialog::OnInitDialog()中
在CTestDialog::OnDestroy()中InitNodeTree();
m_bDragging=FALSE;
m_hDragTarget=NULL;
m_hDragItem=NULL;m_CtrlTree.DeleteAllItems();
delete m_pImageList;树状控件拖放功能(6)树状控件拖放功能(6)在CTestDialog::OnBegindragNodetree()中m_hDragItem=pNMTreeView->itemNew.hItem;
int nLayer=0; //被拖动结点层数
HTREEITEM hItem=m_hDragItem;
while(hItem)
{ hItem=m_CtrlTree.GetParentItem(hItem);
nLayer++; }
if(nLayer==3) //学生结点
{ CImageList *pDragImage;
pDragImage=m_CtrlTree.CreateDragImage (m_hDragItem);树状控件拖放功能(8)树状控件拖放功能(8)在CTestDialog::OnBegindragNodetree()中 m_CtrlTree.SelectItem(m_hDragItem);
pDragImage->BeginDrag(0,CPoint(0,0));
pDragImage->DragEnter(&m_CtrlTree, pNMTreeView->ptDrag);
SetCapture();
m_bDragging=true;
delete pDragImage;
}树状控件拖放功能(9)树状控件拖放功能(9)在CTestDialog::OnMouseMove()中if(m_bDragging)
{
CPoint pt(point);
MapWindowPoints(&m_CtrlTree,&pt,1);
CImageList::DragMove(pt);
UINT uHitTest=TVHT_ONITEM;
m_hD