您的位置:首页 > 其它

MFC笔记1:对话框学习

2014-03-24 10:53 197 查看

一、 对话框伸缩功能的实现

1、 常用函数

(1) GetDlgItemText:返回对话框中指定ID的控件上的文本;

如:char ch1[10]; CString str;

GetDlgItemText(IDC_BUTTON1,str); GetDlgItemText(IDC_BUTTON1,ch1);

(2) SetDlgItemText:设置对话框中指定ID的空间上的文本;

如:SetDlgItemText(IDC_EDIT3,ch3); SetDlgItemText(IDC_BUTTON1,"扩展>>");

(3) GetWindowRect:获得图像控件窗口的大小和位置;

如:static CRect rectLarge; //初始值为0,保存大矩形坐标

if (rectLarge.IsRectNull())

{

CRect rectSeparator;

GetWindowRect(&rectLarge);//获得大窗口的矩形大小

GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator);

}

(4) SetWindowPos:设置对话框的收缩和扩展之后的大小;

SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);//维持窗口当前位置,当前Z次序

二、 输入焦点的传递

1、常用函数

(1) SetWindowLong:修改窗口已指定的过程函数;如果为指定窗口设定一个新的窗口过程,则该函数将返回先前为该窗口类指定的窗口过程地址。

注意:在程序运行时,当对话框及其上的子控件创建完成,将要显示之前会发送的一个消息:WM_INITDIALOG.因此,在此消息的响应函数中修改编辑框控件的窗口过程比较合适。

(2) GetWindow:获得窗口句柄,返回与指定窗口有特定关系的窗口句柄;第一个参数是开始查找的窗口句柄,第二个参数指定hWnd参数指定的窗口与要获得的窗口之间的关系,取值为:GW_HWNDNEXT,GW_HWNDPREV;

(3) WM_INITDIALOG消息响应函数:

BOOLCTestDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// TODO: Add extra initialization here

prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)NewEditProc);

return TRUE; // return TRUE unless you set the focus to a control

// EXCEPTION: OCX Property Pages should return FALSE

}

(4) 重写窗口过程函数:

WNDPROCprevProc;//定义先前的窗口处理

LRESULTCALLBACK NewEditProc(

HWNDhwnd, // handle to window

UINTuMsg, // message identifier

WPARAMwParam, // first message parameter

LPARAMlParam // second message parameter

) //重写窗口过程函数

{

if (uMsg==WM_CHAR && wParam==0x0d)

{

SetFocus(::GetWindow(hwnd,GW_HWNDNEXT)); //注意,编辑框一般不接受多行,所以在属性中要先选中Multiline,否则回车没反应;

return 1;

}

else

{

returnprevProc(hwnd,uMsg,wParam,lParam);

}

}

(5) GetNextDlgTabItem函数:返回指定控件前面或后面的一个具有WS_TABSTOP风格的控件;如果设置了这个Tabstop,则在对话框中按下Tab键后,输入焦点可以转移到此控件上。

(6) ::表示调用SDK中的全局函数。

(7) 在MFC中,默认情况下,当在对话框窗口中按下回车键时,会调用对话框的默认按钮的响应函数,我们可以再次默认按钮的响应函数中把焦点依次向下传递。但是首先要取消第一个编辑框中的Multiline选项。

如:void CTestDlg::OnOK()

{

// TODO: Add extra validation here

GetNextDlgTabItem(GetFocus())->SetFocus();//获得当前焦点窗口指针的下一个窗口指针,并设置焦点

//CDialog::OnOK();

} 默认OK按钮的ID是:IDOK

三、 逃跑按钮的实现

1、从CButton类派生一个新类,把按钮控件与一个自定义的按钮窗口类关联起来;详见P166-267.

(1)鼠标移动响应中: ShowWindow(SW_HIDE); m_pBtn->ShowWindow(SW_SHOW);

四、属性表单和向导的创建

1、MFC类库作为一个共享库(As a sharedDLL)来使用,编译后生成的文件比较小,但移植到其他系统下有可能因为缺少MFC类库而导致程序不能运行;但作为一个静态链接库(As a statically linked library)来使用,就不会出现这种问题。如果MFC作为共享库使用的,产品开发完成后,发布时可将相关的MFC类库一起打包到产品发布包中。

2、创建属性表单

为了创建一个属性表单,首先需要创建一个CPropertySheet对象,在此对象中为每一个属性页创建一个对象(CPropertyPage类型),并调用AddPage函数添加每一个属性页,然后调用DoModal函数显示一个模态属性表单,或者调用create函数创建一个非模态属性表单。

3、步骤:

(1)为prop程序创建一个属性表单对象;

(2)在属性表单对象中添加属性页;

(3)显示属性表单;

4、向导的创建

创建一个向导类型的对话框,应该遵循创建一个标准属性表单的步骤来实现,但在调用属性表单对象的DoModal函数之前,应该调用SetWizardMode这一函数;

5、UpdateData(TRUE)函数:为真时从对话框获取数据;FALSE时,将数据赋给对话框。

6、控件:组框(Group Box) 单选按钮(Radio Button) 列表框(List Box) 复选框

7、CPropertySheet类提供SetWizardButtons成员函数,用来设置向导对话框上的按钮。

SetWizardButtons(DWORDdwFlags) 参数取值:

PSWIZB_BACK:设置上一个按钮; PSWIZB_NEXT:设置下一个按钮;

PSWIZB_FINISH:设置完成按钮; PSWIZB_DISABLEDFINISH:设置一个禁用按钮;

注意:

在属性页的OnSetActive函数中调用SetWizardButtons这个函数,属性页被选中成为一个活动的页面时,应用程序框架就会调用OnSetActive这个函数,它为一个虚函数,应该在属性页子类中重写这个函数。

8、对一组单选按钮来说,需要设置该组中第一个单选按钮的Group属性,属性中选中该选项。只能增加一个int类型的变量,选中该第一个按钮时,变量m_occupation为0,第二个为1,第三个为2;

9、在MFC编程中,对控件的操作都是通过相关的MFC类来完成的;

10、对于列表框,对应的MFC类为:CListBox; 组合框控件由一个编辑框和一个列表框组成,其对应的MFC类是CComboBox, 有成员函数AddString,用来向组合框控件的列表框中添加字符串选项。 列表框添加字符串在WM_INITDIALOG消息的响应函数中添加。

((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString("3000元以上");

((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0);//选择组合框中列表框中的一项

11、接收用户在向导中的选择

(1)view类中定义变量保存属性页中选择项;

(2)memset(m_bLike,0,sizeof(m_bLike));//字符数组初始化;

(3)一般情况下,CPropertySheet类的DoModal函数的返回值是IDOK或IDCANCEL,但是如果属性表单已经被创建为向导了,该函数返回值为ID_WIZFINISH或IDCANCEL;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: