1.静态文本控件
可显示文本、光标、位图等,CStatic类封装了这个控件,CStatic的Create函数负责创建静态文本。在CStatic类中,还有一些常用的函数,如:SetBitmap函数、SetIcon函数、SetCursor函数、SetEnhMetaFile函数等。
2.图片控件
同样是静态控件,由CStatic维护。
3.EditBox控件
对于EditBox里的内容,用户可以使用剪切、粘贴等命令,而不需要程序员编写额外的代码。CEdit类封装了EditBox的操作,Create函数可以创建编辑框控件。
CEdit类的其余一些重要的成员函数:GetSel函数可以获得当前编辑框中选择的起始字符和终止字符的位置;GetLineCount函数可以获得编辑框的行数;还有Undo函数、Clear函数、Copy函数、Cut函数、Paste函数等等。
4.按钮控件
命令按钮、复选框、单选按钮和组框都是由CButton类来维护的,统称为按钮控件。同样由Create函数来创建按钮,在dwStyle参数里可以设置利用哪种按钮。CButton有一个派生类CBitmapButton,它可以创建一个拥有4幅位图的命令按钮。
其余成员函数:GetState函数、SetState函数、SetCheck函数、SetButtonStytle函数、SetBitmap函数。
5.列表框
分为单选列表框和多重选择列表框,CListBox类负责列表框的实现,Create函数可以创建一个列表框。
一些重要的成员函数:AddString函数在列表框最后增加一个选项;InsertString函数在特定位置插入一个选项;GetSelCount函数获得列表框的选项个数(多选李列表框);GetCurSel获得一个被选中的选项的索引。
6.组合框
分为简易式、下拉式和下拉列表式,CComboBox类封装了组合框的操作。
7.滚动条
CScrollBar封装了滚动条的操作,常用成员函数:
SetRange函数设置滚动条最大最小值;SetPos函数设置滚动条的位置;SetPageSize函数设置滚动条滚动页的大小。
8.对话框种类
一般对话框由两部分组成:对话框模板资源和对话框类,对话框模板资源指定对话框的控件及其分布,而对话框类则用于实现对话框的功能。
对话框可分为模态对话框和非模态对话框。模态对话框使父窗口失效必须在处理完对话框的要求后,才能响应父窗口,非模态对话框没有这个要求。模态对话框不能设置WS_CHILD风格,否则在其弹出时因为父窗口失效,其也会失效。CDialog的Create函数可以创建非模态对话框,DestroyWindow函数可以关闭非模态对话框。
9.控件的Group属性
若一个控件具有Group属性,则这个控件和按Tab键紧随其后的所有控件都属于一组,知道遇到另一个Group属性的kj为止。其一般用于具有多组单选按钮的情况。
10.对话框创建
主要步骤:
1). 添加对话框资源,设计对话框外观
2). 添加对话框类,从CDialog类派生
3). 加入成员函数和成员变量
4). 添加消息处理函数
5). 创建并显示对话框。
显示模态对话框关键代码:
CMyDlg myDlg;
mydlg.DoModal();
11.非模态对话框
显示非模态对话框关键代码:
if(!myDlg.m_hWnd)
{
myDlg.Create(IDD_MYDLG);
}
else
{
myDlg.ShowWindow(SW_SHOW);
在这段代码中,首先判断对话框是否已经创建,若没有创建,则用Create函数创建对话框,都则调用ShowWindow函数显示对话框。
12.对话框数据交换机制
关键函数:CDialog::DoDataExchange函数。用户需要交换数据时,并不需要直接调用该函数,而是调用UpdataData函数,UpdataData(TRUE)将把数据从对话框控件传到数据成员,UpdataData(FALSE)函数将数据成员穿袄对应的控件。示例代码:
UpdataData(TRUE);
m_nSum = m_nNum1+m_nNum2;
UpdataData(FALSE);
在进行数据处理前,最好调用UpdataData函数进行更新。
13.模态对话框和非模态对话框总结
1)非模态对话框必须设置VISABLE风格,否则不可见,更安全的做法是调用ShowWindow函数;
2)非模态对话框必须用new来动态创建或者定义为全局变量。通常的做法是在拥有对话框的窗口类申明指向该对话框的指针成员变量,通过该指针访问该对话框。
3)模态对话框调用DoModal函数是等到对话框关闭才返回,而非模态对话框Create结束后立即返回。所以在Create函数返回后,不能确定对话框是否已经关闭,只能在堆中建立对话框对象,而不能作为局部变量。
4)必须调用DestoryWindow函数删除窗口,而不能依靠默认的CDialog::EndDialog函数。
5)若用new创建了一个对话框的动态对象,则在窗口删除时,框架会调用CWnd::PostNcDestroy函数,在这个函数里,我们可以对动动态创建的对话框进行析构。
6)必须要由一个标志来表明非模态对话框是否已经打开,可以用创建对象的m_hWnd作为标志(对话框句柄)。
14.属性页对话框
一个CPropertySheet包含几个CPropertyPage。
显示属性页对话框例程:
CPage1 page1;
CPage2 page2;
CPage3 page3;
CPropertySheet peopleMessageSheet;
peopleMessageSheet.AddPage(&page1);
peopleMessageSheet.AddPage(&page2);
peopleMessageSheet.AddPage(&page3);
peopleMessageSheet.DoModal();
其中,每页的默认设置在Page的OnInitDialog函数中设置,示例代码如下:
BOOL CPage3::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO: 在此添加额外的初始化
((CListBox*) GetDlgItem(IDC_LIST_CITY))->AddString(TEXT("上海"));
((CListBox*) GetDlgItem(IDC_LIST_CITY))->AddString(TEXT("南京"));
((CListBox*) GetDlgItem(IDC_LIST_CITY))->AddString(TEXT("深圳"));
((CListBox*) GetDlgItem(IDC_LIST_CITY))->AddString(TEXT("苏州"));
((CListBox*) GetDlgItem(IDC_LIST_CITY))->SetCurSel(3); //默认选择
((CButton*) GetDlgItem(IDC_RAD_PRO))->SetCheck(1);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
主要实现步骤:
1)实现Page
2)实现对应Page的类,根据Page上的控件添加成员对象
2)实现Sheet
3)Domodal函数显示
15.通用对话框
CColorDialog、CFileDialog、CFindReplaceDialog、CFontDialog、COleialog、CPageSetupDialog、CPrintDialog
首先可以在栈上构造CFileDialog对象,调用CFileDialog::DoModal()函数创建对话框。构造对话框的属性时可以在CFileDialog的构造函数中完成,也可以通过CFileialog的成员变量m_ofn来实现。
CFileDialog的构造函数:CFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL
);
示例代码:
CFileDialog fileDialog(TRUE);
fileDialog.m_ofn.lpstrFilter = LPCTSTR(_T("TextFiles(*.txt)\0*.txt||All Files(*.*)\0*.*));
fileDlalog.m_ofn.lpstrTitle = LPCTSTR(_T("打开文件 "));
......
这里通过CFileDialog的成员变量m_ofn(OPENFILE结构)来设置对话框,当然也可以直接通过CFileDialog的构造函数直接设置。在对话框关闭后,m_ofn结构将保存文件名等重要信息。
CColorDialog对话框和CFileDialog相似,可以通过CHOOSECOLOR结构的设置颜色对话框的参数,关闭对话框时将保存选择颜色等信息。
CFontDialog构造函数:
CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL );
第二个参数和CHOOSEFONT结构中的Flags参数相同,CFontDialog的m_cf成员就是一个CHOOSEFONT对象,示例代码:
CString m_fontName;
CFontDialog m_fontDialog
if(m_fontDialog.DoModal() == IDOK)
{
m_fontName = fontDialog.m_cf.lpLogFont->lfFaceName;
}