1.我们可以先建立一个单文档工程,然后“Inset->Resource->Dlg”就可以插入一个对话框。然后设计一个对话框的类,接下来,我们来看看我们设计的对话框的类的一些成员函数。
2.析构函数。
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
} // 我们可以看出,调用了base类的析构,传入了IDD,也就是对话框的资源ID
3.void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
} // 完成一些数据交换
4.创建一个对话框的窗口
创建一个模态对话框
void CMFCDlgView::OnDlalog()
{
// TODO: Add your command handler code here
CTestDlg dlg;
dlg.DoModal();
}
创建一个非模态对话框 用CDialog::DoModal();
创建一个模态对话框的时候,可以用CDialog::Create();
在定义一个模态对话框的时候,我们不可以将对象定义成为局部变量。有两种方法可以解决:
1.将CDialog Dlg; 将Dlg定义成为View类的成员变量。
2.定义成一个指针,在堆上分配内存
CTestDlg *pDlg = new CTestDlg;
pDlg->Create(IDD_DIALOG1,this);
pDlg-> ShowWindow(SW_SHOWNORMAL);
指针是一个局部变量,在离开作用域后,分配的内存也就释放了,可以把指针定义为成员变量,在析构函数中delete掉就行了。
然而在非模态对话框中,你如果按下OK或者Cancel Button,对话框其实是没被销毁的,而是隐藏了起来。
所以尽量用modul对话框。
先定义一个CButton 的对象,m_btn。然后
void CTestDlg::OnBtnAdd() //添加一个动态显示的按钮
{
// TODO: Add your control notification handler code here
m_btn.Create("微信",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123 );//创建一个窗口
}
如果没有用WS_VISIBLE 那么一定要用showwindow函数将窗口显示出来
如果再次点击Add按钮,那么就会重复创建 ,那么我们需要一个BOOL变量来判断是否重复创建。
// TODO: Add your control notification handler code here
if (m_blsCreate == FALSE)
{
m_btn.Create("微信",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123 );
m_blsCreate = TRUE;
}
else
{
m_btn.DestroyWindow();
m_blsCreate = FALSE;
}
还可以定义一个局部的变量来判断。
函数 CWnd::GetDlgItem();函数可以获得一个子窗口的指针。比如,我们在读取一个静态文本框的内容的时候,我们首先就需要获得这个文本框的指针,然后才好调用GetWindowText();这个函数。
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)->SetWindowText("Number1:");
}
}
在Add Button上 设计了一个加法器。
void CTestDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
// if (m_blsCreate == FALSE)
// {
// m_btn.Create("微信",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123 );
// m_blsCreate = TRUE;
// }
// else
// {
// m_btn.DestroyWindow();
// m_blsCreate = FALSE;
// }
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);
/*GetDlgItem(IDC_EDIT3)->GetWindowText(ch3,10);*/
//转换char到数值类型 用atoi()函数
num1 = atoi(ch1);
num2 = atoi(ch2);
num3 = num1 + num2;
//将NUM3的数值转换成为一个char类型 用itoa;
itoa(num3,ch3,10);//10说明采用十进制
GetDlgItem(IDC_EDIT3)->SetWindowText(ch3); //这个地方用的是SetWindowText,注意了!
}
用方法二来实现
void CTestDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
// if (m_blsCreate == FALSE)
// {
// m_btn.Create("微信",BS_DEFPUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,100),this,123 );
// m_blsCreate = TRUE;
// }
// else
// {
// m_btn.DestroyWindow();
// m_blsCreate = FALSE;
// }
// int num1,num2,num3;
// char ch1[10],ch2[10],ch3[10];
//
// GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
// GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,10);
// /*GetDlgItem(IDC_EDIT3)->GetWindowText(ch3,10);*/
// //转换char到数值类型 用atoi()函数
// num1 = atoi(ch1);
// num2 = atoi(ch2);
// num3 = num1 + num2;
//
// //将NUM3的数值转换成为一个char类型 用itoa;
// itoa(num3,ch3,10);//10说明采用十进制
//
// GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);//这个地方用的是SetWindowText,注意了!
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
GetDlgItemText(IDC_EDIT1,ch1,10); //和GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);一个作用
GetDlgItemText(IDC_EDIT2,ch2,10);
num1 = atoi(ch1);
num2 = atoi(ch2);
num3 = num1 + num2;
itoa(num3,ch3,10);
SetDlgItemText(IDC_EDIT3,ch3); //和GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);一个意思
}
用方法三来实现
UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) const;
函数介绍。自己查看MSDN;
void CTestDlg::OnBtnAdd()
{
int num1,num2,num3;
num1 = GetDlgItemInt(IDC_EDIT1); //获取控件中里面字符串并转换成int类型返回
num2 = GetDlgItemInt(IDC_EDIT2);
num3 = num1+num2;
SetDlgItemInt(IDC_EDIT3,num3,TRUE); //该函数将uValue的值设为对话框控件的文本。TRUE表示返回的是一个无符号类型
void CTestDlg::OnBtnAdd()
{
UpdateData(TRUE);
m_num3 = m_num1 + m_num2;
UpdateData(FALSE);
}
用方法四来实现
DDX_Text(pDX, IDC_EDIT1, m_num1); 将ID和成员变量关联在一起。
1.首先,“View -> ClassWizard -> Member Variables ->Add Variable” ,就能增加成员变量,然后用DDX_Text();来绑定。
//DoDataExchange(); Never call this function directly.It is called by the UpdateData() 在用DoDataExchange(); 要先调用UpdateData()
方法五来实现加法
首先选中 edit框 右击鼠标,选到“class wizard”,然后
将“Category”从value选为control 然后就可以用以下代码来实现了。
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
m_edit1.GetWindowText(ch1,10);
m_edit2.GetWindowText(ch2,10);
num1 = atoi(ch1);
num2 = atoi(ch2);
num3 = num1 + num2;
itoa(num3,ch3,10);
m_edit3.SetWindowText(ch3);
有两种方式能够获取编辑框的句柄:
1.用GetDlgItem(IDC_EDIT1); // 获取标识号为IDC_EDIT1控件的句柄
2.采用上一中方式,将控件成员变量的Category 选为 Control,这样,就定义了一种控件类型,用 . 操作 就能得到句柄。
比如
::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
可以写成
::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1);
m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);
第六方式
/**********************************************************/
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);
m_edit2.SendMessage(WM_GETTEXT,10,(LPARAM)ch2);
num1 = atoi(ch1);
num2 = atoi(ch2);
num3 = num1+num2;
itoa(num3,ch3,10);
m_edit3.SendMessage(WM_SETTEXT,0,(LPARAM)ch3);
//
An application sends a WM_SETTEXT message to set the text of a window.
/**********************************************************/
第七种方式
用SendDlgItemMessage\
/**************************************************************/
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);
SendDlgItemMessage(IDC_EDIT1,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);
/**************************************************************/
学习 EM_SETSEL 消息
int num1,num2,num3;
char ch1[10],ch2[10],ch3[10];
SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);
SendDlgItemMessage(IDC_EDIT1,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);
SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,1,3);
m_edit3.SetFocus();
加上后面的代码。也是就说EM_SETSEL可以选定,输出字符,从1到3
效果如下
选择 0 和 -1 那么就选定所有的输出字符。。。。
我们接下来做一个收缩框。
点击收缩的时候,会把下面的切出来的部分收缩起来。
那么怎么画出那条线呢。工具里面,选择”picture“这个选项,然后,在properties里面,把”Sunken“选上。这一部分如果想详细了解,就去看孙鑫C++ 07。大约1.30左右。