您的位置:首页 > 编程语言

MFC学习笔记.day04-静态文本框, 检索控件句柄,UpdateData函数,七种编辑框加法编程

2015-07-24 11:11 441 查看

对话框:

操作环境:MFC应用程序——mybole(文件名)——单文档——完成——编译

对话框的分类:模态对话框和非模态对话框

所谓模态对话框是指当它在显示时,其它应用程序会被暂停,直到我们关闭模态对话框时,系统才会执行其它程序。

一个非模态对话框当它在运行时,它可以允许程序转而执行其它任务,而不要将非模态对话框关闭。

由于在MFC中对资源的操作都是通过一个类来完成的,那么我们首先来创建一个对话框的类,创建的具体过程有两种,第一,你可以直接在你要创建类的对话框上双击鼠标左键;第二,你可以点击View,再点击ClassWizard,然后选择你要创建类的资源的ID即可。

下面我们来实践一下模态对话框的创建过程:

1、在资源里面插入一个对话框的资源

2、建立这个资源的类(ClassWizard)

3、再在资源里面找到Menu在最后增加一个对话框的菜单,并对他建立命令响应

4、在OnDialog中写入如下代码:

CTestDlg dlg;
dlg.DoModal();


注意:我们在这里要包括一个头文件 #include “TestDlg.h”,否则,系统会报错。

下面我们来创建一个非模态对话框:

前面第一步到第三步写法都是一样的,只是第四步略有差异,首先创建非模态对话框不用DoModal函数,它用Create函数,其次,dlg这个对象不能定义成局部变量,要么把它定义成view类的成员变量,要么把它定义成指针CTestDlg *pDlg=new CTestDlg()。

注意:当我们点击对话框上的OK按钮时,此时这个对话框只是不可见,但是他并未被销毁,所以我们一般还是用模态对话框方便,不太用非模态对话框。

下面我们要求在对话框上放置一个Button然后对他建立鼠标点击的命令响应:

1、在Resource中找到这个对话框然后在她的上面放置Button控件

2、对其进行属性的修改

3、对他建立鼠标单机的消息响应

4、在这个鼠标单击的响应函数中编写代码,创建一个弹出框

第一到第三步这里就不多说了,在前面几个课中我们经常碰到,主要讲讲第四步,因为在第四步中我们往往会遇到很多的问题,首先我饿们来看看下面这个代码,也许你不觉得他有设么不一样:m_btn.Create(“王吉利”,BS_DEFPUSHBUTTON | WS_CHILD

| WS_VISIBLE ,CRect(0,0,100,100) ,this,123 );

但是当我们点击完一次这个按钮以后再次点击我们发现系统会出错,这是什么原因?

我们仔细阅读代码就会发现原来当我们第一次点击这个按钮时,系统已经对m_btn创建好了,当我们第二次点击时就相当于是重复定义了,故会出错,那么我们该如何来避免这个经常碰到的问题呢?

其实说起来也很简单,主要设一个记录状态的变量即可,如下所示:

if (m_Index==false)
{

m_btn.Create("王吉利",BS_DEFPUSHBUTTON   | WS_CHILD
| WS_VISIBLE ,CRect(0,0,100,100) ,this,123 );
m_Index=true;
}
else
{
m_btn.DestroyWindow();
m_Index=false;
}


当然我们要将这个m_Index变量定义成这个函数的成员变量,否则,等这个鼠标单击的响应函数响应完了,这个变量就会被销毁,有起不到记录状态的作用了。当然我们还可以有其他的方法来避免这个问题,比如我们可以讲这个变量设置成静态的变量,如下:

static  bool  m_Index=false
if (m_Index==false) { m_btn.Create("王吉利",BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE ,CRect(0,0,100,100) ,this,123 ); m_Index=true; } else { m_btn.DestroyWindow(); m_Index=false; }
这样也是可以的,当然如果我们对MFC的内部机制了解很清楚的话,我们还可以利用m_hWnd,具体代码如下:
if (!m_btn.m_hWnd)
{
m_btn.Create("王吉利",BS_DEFPUSHBUTTON | WS_CHILD
| WS_VISIBLE ,CRect(0,0,100,100) ,this,123 );

}
else
{
m_btn.DestroyWindow();
}


我们对于从CWND派生出来的类来说,其内部有一个成员变量叫做h_Wnd,保存了和这个C++对象相关的一个窗口句柄。当我们MFC中的C++对象跟我们的窗口相关联的时候,我们这个h_Wnd就有值了,当这个对象没有跟任何窗口相关联的时候,这个h_Wnd就没有值了,因此我们可以利用这个参数来判断是否已经创建了,这样会很简单的。

静态文本框

对于我们的静态文本框来说他是不能够接受 我们的通道消息的,我们必须将其styles中的Notify前的复选框给选上,这样才可以相应。

下面我们来制作一个静态文本框制作的魔术变换按钮:

1、首先我们在对话框上添加一个静态文本框

2、然后记得一定要改这个静态文本框的属性,否则无法建立鼠标点击的相应

3、建立鼠标点击的响应

4、最后书写代码

代码如下:

void CTestDlg::OnNumber1()
{
// TODO: Add your control notification handler code here
CString str;
if (GetDlgItem( IDC_NUMBER1)->GetWindowText(str),str=="number1:")
{
GetDlgItem(IDC_NUMBER1)->SetWindowText("数值1");
} else{
GetDlgItem( IDC_NUMBER1)->GetWindowText(str),str=="number1:";
}
}


GetDlgItem检索指定的对话框中的控件句柄

函数功能:该函数检索指定的对话框中的控件句柄。   

函数原型:
HWND GetDlgltem(HWND hDlg,int nlDDlgltem);
  

参数:   hDlg:标识含有控件的对话框。   

nlDDlgltem:指定将被检索的控件标识符。   

返回值:如果函数调用成功则返回值为给定控件的窗口句柄。如果函数调用失败,则返回值为NULL,表示为一个无效的对话框句柄或一个不存在的控件。若想获得更多错误信息,请调用GetLastError函数。   

备注:可以通过使用任何父子窗口对来使用GetDlgltem函数,而不仅只是对话框。只要hDlg参数指定一个父窗口,且子窗口有一个独立的标识符(象CreateWindow中hMenu参数指定的或创建子窗口的CreateWindowEx指定的那样),GetDlgltem就会返回一个有效的句柄到子窗口。

CWnd::GetWindowText

int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;


Parameters

lpszStringBuf

Points to the buffer that is to receive the copied string of the window’s title.

nMaxCount

Specifies the maximum number of characters to be copied to the buffer. If the string is longer than the number of characters specified in nMaxCount, it is truncated.

UpdateData函数

对UpdateData函数做这样的解释:

UpdateData()参数只有一个,默认为TRUE。   

UpdateData(TRUE)   ——刷新控件的值到对应的变量。(外部输入值交给内部变量)   即:控件的值—>变量。   

UpdateData(FALSE)   —— 拷贝变量值到控件显示。(变量的最终运算结果值交给外部输出显示)   即:变量值—>控件显示。

函数原型:

SendDlgItemMessage

The SendDlgItemMessage function sends a message to the specified control in a dialog box.
LRESULT SendDlgItemMessage(
HWND hDlg,     // handle to dialog box
int nIDDlgItem, // control identifier
UINT Msg,      // message to send
WPARAM wParam, // first message parameter
LPARAM lParam   // second message parameter
);


注意:如果你将WPARAM 和LPARAM设置成0和-1,这样会把整个编辑框都选上的。

七种编辑框加法编程:简单的加法器:

方法一:

1、我们先是创建三个编辑框,用来输入数值

2、定义三个变量用来存放说输入的值

3、将值的类型进行转化

4、获取相关的值

5、点击Add按钮,然后将和值放入第三个编辑框中

6、编写代码

具体操作步骤如下:

创建编辑框这个就不多说了,这个简单,我们只要在资源里面找到Dialog,然后添加就行了;

定义变量:

int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];//将值的类型进行转化:
num1=atoi(ch1);
num2=atoi(ch2);
num3=num1+num2;
itoa(num3,ch3,10);//获取相关的值:
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);
//点击Add按钮,然后将和值放入第三个编辑框中
GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);


方法二:(利用GetDlgItemText和SetDlgItemText)

Int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];

GetDlgItemText(IDC_EDIT1,ch1,10);
GetDlgItemText(IDC_EDIT2,ch2,10);

num1=atoi(ch1);
num2=atoi(ch2);
num3=num1+num2;
itoa(num3,ch3,10);
SetDlgItemText(IDC_EDIT3,ch3);


这些代码就不多说了,这个简单,大家可以很好理解的!

方法三:(利用函数GetDlgItemInt、SetDlgItemInt)

int num1,num2,num3;
num1=GetDlgItemInt(IDC_EDIT1);
num2=GetDlgItemInt(IDC_EDIT2);

num3=num1+num2;
SetDlgItemInt(IDC_EDIT3,num3);


方法四:

这种方法是利用将编辑框先关联各自的变量,然后我们可以利用访问变量来访问这些编辑框,这样访问起来是最方便的。

1、先是将编辑框关联变量

2、再通过变量来访问编辑框的值

3、注意调用函数 UpdateData();

具体操作步骤如下:

1、关联编辑框的变量这个我就不多说了,在Classwizard中找到你要关联变量的ID号,然后直接关联变量就可以了

2、访问值: m_num3=m_num1+m_num2;

3、调用函数,进行将相关的值放入编辑框和将值放进编辑框

UpdateData();//这里是为了将编辑框中的值传给与之相关联的变量

……….

UpdateData(false);//这里是将变量的值放入编辑框

方法五:

这里我们铜过对编辑框建立各自的控件变量,然后我们来对这个控件变量进行访问,从而来访问这个编辑框的值。

1、对编辑框建立控件变量

2、利用这些控件变量来访问

3、进行运算、数据类型的转化

4、输出结果

具体操作的步骤如下:

1、对编辑框建立控件变量这根建立普通变量是一某一样的,只是在选择类型的时候选择Control即可;

2、访问 :

m_edit1.GetWindowText(ch1,10);
m_edit2.GetWindowText(ch2,10);


3、进行运算和转化

num1=atoi(ch1);
num2=atoi(ch2);
num3=num1+num2;
itoa(num3,ch3,10);


4、输出结果:

m_edit3.SetWindowText(ch3);


方法六:(我们利用发送消息来实现)

1、先建立变量

2、编辑框来发送消息,来获得编辑框的值

3、进行运算和相关的数据类型的转化

4、编辑框来发送消息,将变量的值显示在编辑框中

具体操作如下:

1、建立变量

int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];


2、编辑框来发送消息

A、::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
B、::SendMessage(m_edit1->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);借助控件变量
C、GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1);
D、m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);借助控件变量


这里写的是四种常用的发送消息的方法

3、进行加法运算和变量类型的转化

num1=atoi(ch1);
num2=atoi(ch2);
num3=num1+num2;
itoa(num3,ch3,10);


4、将变量的值显示在编辑框中

m_edit3.SendMessage(WM_SETTEXT,0,(LPARAM)ch3);//(借助于控件变量)


方法七:(我们利用发送消息来实现)

与方法六类似只是里面用到的函数不太一样,思路是一样,这里就不多说了。

具体操作如下:

int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];

SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);

SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)ch2);

num1=atoi(ch1); num2=atoi(ch2); num3=num1+num2; itoa(num3,ch3,10);

SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3);


下面我再来学习一下如何在编辑框中来设置一下复选上的效果:

这里我们要再次发送消息,和利用函数SetFocus();

具体代码这样写:

SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,-1);
m_edit3.SetFocus();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: