对话框和控件编程
- 格式:doc
- 大小:2.04 MB
- 文档页数:5
如何实现控件随对话框大小变化而自动调整大小和位置VC++ 2009-12-28 20:27:42 阅读461 评论0字号:大中小订阅1. 处理对话框的WM_SIZE,然后用MoveWindow或者SetWindowPos来把对话框上面的控件重新调整新位置和大小。
2. 基本的做法就是响应WM_SIZE消息,并按照窗口大小比例来调整控件的位置和大小,控件的大小最好设置成窗口的百分之几,这样的话,就可以根据窗口的大小随时调整了。
3. 每次OnSize 即可获得一个CRect,然后根据这个CRect来确定这些控件的位置和大小,使用函数MoveWindow 或SetWindowpos实现。
4.1)通过下面两个函数获取的是显示屏幕的大小【屏幕的分辨率】(不包括任务栏等区域):int nFullWidth=GetSystemMetrics( SM_CXFULLSCREEN ); //屏幕宽度int nFullHeight=GetSystemMetrics( SM_CYFULLSCREEN ); //屏幕高度2)这两个函数获取的是真正屏幕的大小【屏幕的分辨率】(包括任务栏等区域):int cx = GetSystemMetrics( SM_CXSCREEN );int cy = GetSystemMetrics( SM_CYSCREEN );如:用前两个函数获取的大小可能是1024*687 ,而用下边两个获取的就是1024*768。
5. 在OnSize() 中调用:GetClientRect() 和GetWindowRect() 函数可获取窗口大小,但需注意得到的是设备坐标,如果需要画图什么的还需要转换成逻辑坐标。
6. 字体大小随窗口变化而自动变化,比如说始终使字的高度始终占窗口的1/3。
使用:1). 在Creat中将nHeight设成窗口长度或者宽度的一定比值就行了(最好在onsize函数中设置);2). 使用WM_FONTCHANGE 消息。
VBA对话框设计和使用技巧VBA(Visual Basic for Applications)是一种用于Microsoft Office应用程序的编程语言。
它可以用于自动化任务、增强功能以及创建用户界面。
在处理各种应用程序任务时,对话框是一个重要的交互工具。
本文将介绍如何使用VBA来设计和使用对话框,以提高用户体验和效率。
一、对话框设计基础1. 对话框的目的:在开始设计对话框之前,我们需要明确对话框的目的。
对话框是用于与用户进行交互的窗口,可以用于输入数据、显示信息、进行选择等。
因此,我们需要确定对话框的用途和功能,以便正确地设计和使用它。
2. 对话框类型:VBA提供了几种常见的对话框类型,如消息框、输入框、文件对话框和用户自定义对话框等。
我们可以根据需要选择不同类型的对话框,以实现特定的功能。
3. 对话框控件:对话框由一系列控件组成,用于显示内容和接收用户的输入。
常见的对话框控件包括标签(Label)、文本框(TextBox)、复选框(CheckBox)、单选按钮(OptionButton)和按钮(CommandButton)等。
了解各种控件及其属性对于设计和定制对话框非常重要。
二、使用VBA创建对话框1. 创建基本对话框:在VBA中,我们可以使用`UserForm`对象来创建基本的用户界面。
打开VBA编辑器(Alt + F11),点击插入菜单中的用户窗体,选择“用户窗体”选项,即可创建一个新的用户窗体。
我们可以通过在用户窗体上添加控件、设置属性和编写代码来自定义对话框。
2. 控件添加和布局:通过拖拽和放置控件,我们可以向用户窗体中添加所需的控件。
可以使用“工具箱”中的工具来添加各种控件,并使用鼠标和键盘调整控件的大小和位置。
为了使对话框布局合理、美观,需要仔细选择和排列控件。
3. 设置控件属性:控件的属性决定了其外观和行为。
通过右键单击控件并选择“属性”,我们可以设置控件的名称、标签、大小、颜色、字体、可见性等属性。
第五章对话框对话框是一种用户界面,它的主要功能是输出信息和接收用户的输入。
对话框与控件是密不可分的,在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互。
一个典型的对话框例子是选择了File-Open命令后弹出的文件对话框。
5.1对话框和控件的基本概念5.1.1对话框的基本概念对话框(Dialog)实际上是一个窗口。
在MFC中,对话框的功能被封装在了CDialog类中,CDialog类是CWnd类的派生类。
对话框分为模态对话框和非模态对话框两种。
大部分读者都会有这样的经历,当你通过File-Open命令打开一个文件对话框后,再用鼠标去选择菜单将只会发出嘟嘟声,这是因为文件对话框是一个模态对话框。
模态对话框垄断了用户的输入,当一个模态对话框打开时,用户只能与该对话框进行交互,而其它用户界面对象收不到输入信息。
我们平时所遇到的大部分对话框都是模态对话框。
非模态对话框的典型例子是Windows95提供的写字板程序中的搜索对话框,搜索对话框不垄断用户的输入,打开搜索对话框后,仍可与其它用户界面对象进行交互,用户可以一边搜索,一边修改文章,这样就大大方便了使用。
本节主要介绍模态对话框,在第四节将介绍非模态对话框。
从MFC编程的角度来看,一个对话框由两部分组成:1.对话框模板资源。
对话框模板用于指定对话框的控件及其分布,Windows根据对话框模板来创建并显示对话框。
2.对话框类。
对话框类用来实现对话框的功能,由于对话框行使的功能各不相同,因此一般需要从CDialog类派生一个新类,以完成特定的功能。
5.1.2控件的基本概念图5.1对话框中的控件控件(Control)是独立的小部件,在对话框与用户的交互过程中,控件担任着主要角色。
控件的种类较多,图5.1显示了对话框中的一些基本的控件。
MFC的控件类封装了控件的功能,表5.1介绍了一些常用的控件及其对应的控件类。
表5.1控件实际上都是窗口,所有的控件类都是CWnd类的派生类。
实验1 创建对话框应用程序及控件使用一.实验目的1.掌握使用“MFC应用程序向导”创建对话框应用程序框架的方法2.掌握给对话框添加控件的方法,以及使用“MFC类向导”为控件通知消息映射消息处理函数的方法3.掌握使用“MFC类向导”为控件添加控件变量的方法4.掌握控件变量与控件的数据交换机制以及使用控件变量访问和控制控件的方法5.掌握对话框中添加自定义消息的方法二.实验内容1.创建一个Windows对话框应用程序,其界面要求实现以下功能:在下部的文本编辑框(Edit Control )中输入内容后,单击“添加”按钮,文本编辑框的内容被作为一个条目添加到上部的列表框(List Box)中2.为上一步创建的程序添加一条自定义消息,消息名为WM_MYMESSAGE,也可自己命名。
单击“添加”按钮时,将发送盖消息,该消息的处理函数将删除编辑框中已输入的所有内容。
三.实验步骤1.使用“MFC应用程序向导”创建一个对话框应用程序,项目名称编程者自己确定。
2.将主动生成的对话框中的静态文本控件和“取消”命令按钮删除,在窗口上部添加一个列表框(List Box)控件,在列表框中的静态文本控件和“取消命令按钮删除,在窗口上部添加一按钮左侧添加一个命令按钮(Button)控件.3.将“确定”按钮的caption属性修改为“退出”,新添加的命令按钮的caption属性修改为“添加”,修改对话框窗口的caption属性为“实验1”,调整各控件的大小和布局如上图所示。
4.为列表框控件添加一个控制变量,类别为control,变量名编程者自己确定,这里取名为m_list,为编辑框控件添加一个控制变量,类别为value,类型Cstring,变量名为m_Edit,也可由编程者自己确定。
5.为“添加”按钮添加并编写BN_CLICKED消息的消息处理函数,该函数代码如下:Void CShiyanDlg : : OnBnclickedButton1( ){//TODO:在此添加控件通知处理程序代码UpdateData(true); //将控件中的数据交换至控件变量If(!m_Edit . ISEmpty()) //如果编辑框内容不空,则将内容添加至列表框M_List . Addstring(m_Edit);}6.编译运行程序,在文本编辑框中输入内容并单击“按钮”,观察执行结果。
对话框与控件编程
一、对话框编程
●创建一个基于单文档视图框架的应用程序。
●执行菜单命令:视图/资源视图,进入资源视图窗口,点击Dialog资源项,右键添加一
个对话框资源。
●在对话框资源窗口上右键,添加对话框类。
●在主菜单资源的视图菜单中添加新菜单项,用于显示对话框。
将新添加的菜单项的消息
处理函数映射到View类中。
一、添加对话框类
●在新加的菜单消息处理函数中添加代码
●CDlgExam1 dlg;
dlg.DoModal();
通过调用Cdialog类的DoModal()函数显示的对话框都是模态对话框。
“模态对话框”指对话框被弹出后,用户必须在对话框中作出相应的操作,在退出对话框之前,对话框所在应用程序的其他操作不能继续执行。
“非模态对话框”指对话框被弹出后,一直保留在屏幕上,用户可继续在对话框所在应用程序中执行其他操作。
当需要使用对话框时,只需像激活窗口一样单击对话框所在区域即可。
非模态对话框的编写和使用
1.添加一个新的对话框资源
2.添加一个新的对话框类CDlgNonModal
3.为对话框添加一个静态整型变量NumOfInstance,初始化为0;
3.重载对话框类的OnCancel和PostNcDestroy函数
void CDlgNonModal::OnCancel(){
DestroyWindow();
CDlgNonModal::NumOfInstance = 0;
}
void CDlgNonModal::PostNcDestroy(){
CDialog::PostNcDestroy();
delete this;
}
int CDlgNonModal::NumOfInstance = 0;
CDlgNonModal::CDlgNonModal(CWnd* pParent /*=NULL*/)
: CDialog(CDlgNonModal::IDD, pParent){
CDlgNonModal::NumOfInstance++;
}
4. 在View类中添加菜单命令处理函数
if (CDlgNonModal::NumOfInstance == 0){
CDlgNonModal* pDlg = new CDlgNonModal(0);
pDlg->Create(IDD_DIALOG1);
pDlg->ShowWindow(SW_SHOW);
}
思考:如果需要在对话框类的成员函数中调用View类的成员函数?应该如何设计对话框类?在对话框类的成员函数中如何获取应用程序的View类实例的指针?
只要为新创建的对话框类的构造函数添加一个View类的指针,在创建对话框类时,传入View 的指针即可。
二、按钮控件
●1、单选按钮
●添加group box控件
●将单选按钮控件放在group box控件中
●将每个group box控件中的第一个单选按钮的Group属性值设为true,保证不同group
box控件中的单选按钮互不影响
初始化单选按钮的选择状态
重载对话框的OnInitDialog()函数,使用对话框成员函数CheckRadioButton(…)初始化一个group box中的单选按钮选择状态。
void CheckRadioButton(int nIDFirstButton,
int nIDLastButton,
int nIDCheckButton)
获取一个group box中的单选按钮选择值:
使用对话框的GetCheckedRadioButton(…)成员函数获取选中的单选按钮的ID号,使用对话框的GetDlgItemTextW(…)获取单选按钮的文本。
int GetCheckedRadioButton(int nIDFirstButton,
int nIDLastButton);
长春理工大学计算机科学技术学院陈纯毅
CheckRadioButton(IDC_RADIO_MALE,IDC_RADIO_FEMALE,IDC_RADIO_MALE);
void CDlgExam1::OnBnClickedButOk(){
int nID=GetCheckedRadioButton(IDC_RADIO_MALE, IDC_RADIO_FEMALE);
CString strAge,strSex;
GetDlgItemTextW(nID,strSex);
CDialog::OnOK();
MessageBox(CString(L"你的选择是:")+strSex);
}
2、复选框按钮
一个group box中的复选框按钮的初始化
使用对话框类的GetDlgItem(…)获得复选框按钮对象的指针,将该指针转换成Cbutton类型指针,使用Cbutton的SetCheck成员函数设置复选框按钮。
获取一个group box中被勾选的复选框按钮的文本
将所有复选框按钮的ID号存在一个数组中。
通过循环,使用GetDlgItem(…)获得每个复选框按钮对象的指针,并转换成Cbutton指针,通过CButton的GetCheck(…)判断复选框是否被勾选,使用Cbutton的GetWindowText(…)获取复选框文本。
CButton* pBut = (CButton*)GetDlgItem(IDC_CHECK1);
pBut->SetCheck(1);
void CDlgExam1::OnBnClickedButOk(){
int nIDs[3]={IDC_CHECK1, IDC_CHECK2,IDC_CHECK3};
CButton* pBut;
CString buf,strPrefer=L"";
for(int i=0;i<3;i++){
pBut=(CButton*) this->GetDlgItem(nIDs[i]);
if(pBut->GetCheck()){
pBut->GetWindowTextW(buf);
strPrefer = strPrefer + CString(L" ") + buf;}}
CDialog::OnOK();
MessageBox(CString(L"你的选择是:")+strPrefer);
}
三、编辑框
(1)多行编辑框
将编辑框的Multiline和Want Return属性同时设置为true。
为编辑框控件绑定一个CEdit类型的变量。
使用CEdit的GetLineCount()获取文本的行数,使用CEdit的LineLength(…)获取指定行的字符数,使用Cedit的GetLine(…)获取指定行的字符。
例程:
TCHAR str[100];
if(m_edit.GetLineCount()>=2) {
int nChars;
nChars = m_edit.LineLength(1);
m_edit.GetLine(1,str,nChars);
str[nChars] = '\0';
MessageBox(str);
}
(2)密码输入编辑框
重载对话框的OnInitDialog();
为编辑框控件绑定一个CEdit类型的变量,使用CEdit的SetPasswordChar(…)设置密码显示字符
例程:
m_edit.SetPasswordChar('*');
长春理工大学计算机科学技术学院陈纯毅
幻灯片22
(3)数字输入编辑框
设置编辑框控件的Number属性为True。
只能输入数字和小数点?
(1)在解决方案中添加一个新的MFC类CNumEdit, CNumEdit继承自CEdit。
(2)为CNumEdit添加WM_CHAR消息处理函数
void CNumEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){
if(nChar == '.' || (nChar>='0' && nChar <='9'))
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
(3)为编辑框绑定一个CNumEdit类型的控件变量。
(4)带旋转按钮的编辑框
在添加编辑框后,接着就添加一个Spin Control控件,设置Spin Control的Auto Buddy 属性为True,设置Set Buddy Integer属性为True。
为Spin Control绑定一个CSpinButtonCtrl变量,通过调用CSpinButtonCtrl的SetPos(…)和SetRange(…)来设置CSpinButtonCtrl的当前值和变化范围。
综合演示
学生信息输入框
姓名(输入框)
性别(单选)
爱好(复选)
成绩(带旋转按钮的输入框)
将输入信息显示到视图中。
CDC类成员函数
TextOutW(int x, int y, const Cstring& str)。