[MFC学习笔记]--对话框的设计

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表示返回的是一个无符号类型

 

UpdateData() 是 MFC窗口函数,用来 刷新数据的。
总的来说:操作系统会调用这个函数来初始化对话框中的数据,或者检索或者验证对话框中的数据。
简单说就是:如果Updatedata(TRUE) == 将控件的值赋值给成员变量;Updatedata(FALSE) == 将成员变量的值赋值给控件。

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左右。

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值