MFC(对话框,孙鑫C++第七讲笔记整理)

1.如果在SDI中要调用对话框

 a.先插入一个对话框资源;

 b.然后在ClassWizards中为其创建一个类。其目的是比较方便为添加按纽和消息响应函数。

 c.然后实例化它。在实例化时,必须将其头文件包含进去。

 

2.创建非模态对话框,注意它不能是局部变量。当点击非模态对话框的OnOK按纽时,它并没有关闭,而是隐藏了。需要调用destroyWindow().

 

3.一个对象只能一个按纽。为什么?因为在Wincore.cpp的628行有代码 ASSERT(pWnd->m_hWnd == NULL);   // only do once而创建后它的m_hWnd就不为0了。此处ASSERT的用法是如果括号里面不为真,则程序崩溃。

 

4.如何为静态文本框增加消息响应?首先将IDC_STATIC改名。同时还需要将Notify特性复选中。

 

5.完成加法功能。

 a.GetDlgItem();

 b.GetDlgItemText();

 c.GetDlgItemInt();

 d.将IDC_EDIT1关联CEDIT类型变量

 e.将IDC_EDIT1关联int型变量。注意调用 UpdateData();

 f. //::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);

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

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

 

6.点击按纽改变窗口尺寸

  if(GetDlgItemText(IDC_BUTTON2,str),str=="收缩<<")

 {

 SetDlgItemText(IDC_BUTTON2,"扩展>>");

 static CRect rectLarge;

 static CRect rectSmall;

 

 if(rectLarge.IsRectNull())

 {

 CRect rectSeparator;

 GetWindowRect(&rectLarge);

 GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator); rectSmall.left=rectLarge.left;

 rectSmall.top=rectLarge.top;

 rectSmall.right=rectLarge.right;

 rectSmall.bottom=rectSeparator.bottom;

 }

 if(str=="收缩<<")

 {

 SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),

  SWP_NOMOVE | SWP_NOZORDER);

 }

 else

 {

 SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),

  SWP_NOMOVE | SWP_NOZORDER);

 }

 

7.回车时将输入焦点移动到下一个控件

SetWindowLong()改变窗口的属性。

方法1:

改变控件的回调函数,注意IDC_EDIT1的MultiLine要复选上。

WNDPROC prevProc;

LRESULT CALLBACK WinSunProc(

 HWND hwnd,     // handle to window

 UINT uMsg,     // message identifier

 WPARAM wParam, // first message parameter

 LPARAM lParam  // second message parameter

)

{

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

 {

 //::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));

 //SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));

 CString str;

 str.Format("%d",hwnd);

 AfxMessageBox(str);//, UINT nType = MB_OK, UINT nIDHelp = 0 );

// AfxGetApp()->

 SetFocus(::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE));

 return 1;

 }

 else

 {

 return prevProc(hwnd,uMsg,wParam,lParam);

 }

}

BOOL CTestDlg::OnInitDialog()

{

 CDialog::OnInitDialog();

 

 // TOD Add extra initialization here

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

 (LONG)WinSunProc);//设置回调函数

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

              // EXCEPTION: OCX Property Pages should return FALSE

}

方法2:

在OnOK响应函数中加入代码

 //GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus();

 //GetFocus()->GetNextWindow()->SetFocus();

 //GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();

 GetNextDlgTabItem(GetFocus())->SetFocus();

 

显示一个模态对话框:

显示一个非模态对话框:

[cpp]  view plain copy
  1. void CMyDialogView::OnShowmenue()   
  2. {  
  3.     // TODO: Add your command handler code here  
  4.   
  5.     /*CTestDialog cdlg; 
  6.     cdlg.DoModal();*/  
  7.   
  8.     CTestDialog *cdlg=new CTestDialog();//这里可以设置成成员变量,指针定义,堆栈跟程序一样的声明周期  
  9.     cdlg->Create(IDD_DIALOG1,NULL);  
  10.     cdlg->ShowWindow(SW_NORMAL);  
  11.       
  12.       
  13. }  

 

下面两端代码的效果是一样的:

[cpp]  view plain copy
  1. void CTestDialog::OnButton()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.       
  5.     if(!bIsCreate)  
  6.     {  
  7.         m_btn.Create("按钮",BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,80),this,123);  
  8.         bIsCreate=TRUE;  
  9.     }  
  10.     else  
  11.     {  
  12.         m_btn.DestroyWindow();  
  13.         bIsCreate=FALSE;  
  14.     }  
  15.   
  16.     /*if(!m_btn.m_hWnd) 
  17.     { 
  18.  
  19.     m_btn.Create("按钮",BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,80),this,123); 
  20.     } 
  21.     else 
  22.     { 
  23.         m_btn.DestroyWindow(); 
  24.     }*/  
  25. }  



 几种访问控件的方式:

拉控件:

 

利用

调整位置

 

改变了静态文本的ID,才能添加事件

修改了Notify才能在事件中,改变文本的内容

 

方法一:

[cpp]  view plain copy
  1. void CTestDialog::OnNumber1()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     CString str;  
  5.     GetDlgItem(ID_NUMBER1)->GetWindowText(str);  
  6.     if(str=="number1:")  
  7.     {  
  8.         GetDlgItem(ID_NUMBER1)->SetWindowText("数值1:");  
  9.     }  
  10.     else  
  11.     {  
  12.         GetDlgItem(ID_NUMBER1)->SetWindowText("number1:");  
  13.     }  
  14. }  


方法二:

[cpp]  view plain copy
  1. int num1,num2,num3;  
  2.     char ch1[8],ch2[8],ch3[9];  
  3.     GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,8);  
  4.     GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,8);  
  5.       
  6.     num1=atoi(ch1);//将字符串转化为整数  
  7.     num2=atoi(ch2);  
  8.     num3=num1+num2;  
  9.       
  10.     itoa(num3,ch3,10);//将整数转化为字符串  
  11.       
  12.     GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);  


方法三:

[cpp]  view plain copy
  1. TCHAR ch1[8],ch2[8],ch3[9];  
  2.     GetDlgItemText(IDC_EDIT1,ch1,8);  
  3.     GetDlgItemText(IDC_EDIT2,ch2,8);  
  4.   
  5.     int num1=atoi(ch1);  
  6.     int num2=atoi(ch2);  
  7.     int num3=num1+num2;  
  8.   
  9.     itoa(num3,ch3,10);  
  10.   
  11.     SetDlgItemText(IDC_EDIT3,ch3);  


方法四:

数值关联:

 

[cpp]  view plain copy
  1.         UpdateData();//默认参数是TRUE,不直接调用DodataExchange函数  
  2. m_num3=m_num1+m_num2;  
  3. UpdateData(FALSE);  


方法五:

控制关联:

 

[cpp]  view plain copy
  1. TCHAR ch1[9],ch2[9],ch3[9];  
  2. int num1,num2,num3;  
  3. m_edit1.GetWindowText(ch1,9);  
  4. m_edit2.GetWindowText(ch2,9);  
  5.   
  6. num1=atoi(ch1);  
  7. num2=atoi(ch2);  
  8.   
  9. num3=num1+num2;  
  10.   
  11. itoa(num3,ch3,10);  
  12.   
  13. m_edit3.SetWindowText(ch3);  


方法六:

[cpp]  view plain copy
  1. int num1=GetDlgItemInt(IDC_EDIT1);  
  2.     int num2=GetDlgItemInt(IDC_EDIT2);  
  3.     int num3=num1+num2;  
  4.   
  5.     SetDlgItemInt(IDC_EDIT3,num3);  


方法七:

[cpp]  view plain copy
  1. /*TCHAR ch1[10],ch2[10],ch3[10]; 
  2.     ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); 
  3.     ::SendMessage(GetDlgItem(IDC_EDIT2)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch2); 
  4.  
  5.     int num1=atoi(ch1); 
  6.     int num2=atoi(ch2); 
  7.     int num3=num1+num2; 
  8.  
  9.     itoa(num3,ch3,10); 
  10.  
  11.     ::SendMessage(GetDlgItem(IDC_EDIT3)->m_hWnd,WM_SETTEXT,0,(LPARAM)ch3);*/  
  12.   
  13.   
  14.     /*TCHAR ch1[10],ch2[10],ch3[10]; 
  15.     GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1); 
  16.     GetDlgItem(IDC_EDIT2)->SendMessage(WM_GETTEXT,10,(LPARAM)ch2); 
  17.  
  18.     int num1=atoi(ch1); 
  19.     int num2=atoi(ch2); 
  20.     int num3=num1+num2; 
  21.      
  22.     itoa(num3,ch3,10); 
  23.  
  24.     SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3); 
  25.     SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,2); 
  26.     GetDlgItem(IDC_EDIT3)->SetFocus();*/  
  27.   
  28.       
  29.     TCHAR ch1[10],ch2[10],ch3[10];  
  30.     SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);  
  31.     SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)ch2);  
  32.   
  33.     int num1=atoi(ch1);  
  34.     int num2=atoi(ch2);  
  35.     int num3=num1+num2;  
  36.       
  37.     itoa(num3,ch3,10);  
  38.   
  39.     SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3);  
  40.     SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,2);  
  41.     GetDlgItem(IDC_EDIT3)->SetFocus();  


 

伸缩效果:

拉入一个picture:

 

[cpp]  view plain copy
  1. void CTestDialog::OnShensuo()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     CString cst;  
  5.     if(GetDlgItemText(ID_SHENSUO,cst),cst=="缩小<<")  
  6.     {  
  7.         SetDlgItemText(ID_SHENSUO,"扩展>>");  
  8.     }  
  9.     else  
  10.     {  
  11.         SetDlgItemText(ID_SHENSUO,"缩小<<");  
  12.     }  
  13.   
  14.     static CRect crectLarge,crectSmall;  
  15.       
  16.     if(crectLarge.IsRectNull())  
  17.     {  
  18.         GetWindowRect(&crectLarge);  
  19.         CRect ctemp;  
  20.           
  21.         GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&ctemp);  
  22.   
  23.         crectSmall.left=crectLarge.left;  
  24.         crectSmall.top=crectLarge.top;  
  25.         crectSmall.right=crectLarge.right;  
  26.         crectSmall.bottom=ctemp.bottom;  
  27.   
  28.     }  
  29.   
  30.     if(cst=="缩小<<")  
  31.     {  
  32.         SetWindowPos(NULL,0,0,crectSmall.Width(),crectSmall.Height(),SWP_NOZORDER|SWP_NOMOVE);  
  33.     }  
  34.     else  
  35.     {  
  36.           
  37.         SetWindowPos(NULL,0,0,crectLarge.Width(),crectLarge.Height(),SWP_NOZORDER|SWP_NOMOVE);  
  38.     }  
  39.   
  40. }  


 回车响应SetFocus()只能一次 multiline

 

[cpp]  view plain copy
  1. WNDPROC prevProc;  
  2. LRESULT CALLBACK DialogProc(  
  3.                             HWND hwnd,      // handle to window  
  4.                             UINT uMsg,      // message identifier  
  5.                             WPARAM wParam,  // first message parameter  
  6.                             LPARAM lParam   // second message parameter  
  7.                             )  
  8. {  
  9.     if(uMsg==WM_CHAR && wParam==0x0d)  
  10.     {  
  11.         //::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));  
  12.         //::SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));  
  13.         ::SetFocus(::GetNextDlgTabItem(GetParent(hwnd),hwnd,FALSE));  
  14.         return 1;  
  15.     }  
  16.     else  
  17.     {  
  18.         return prevProc(hwnd,uMsg,wParam,lParam);  
  19.     }  
  20. }  
  21.   
  22.   
  23. BOOL CTestDialog::OnInitDialog()   
  24. {  
  25.     CDialog::OnInitDialog();  
  26.       
  27.   
  28.     // TODO: Add extra initialization here  
  29.     prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)DialogProc);  
  30.       
  31.       
  32.     return TRUE;  // return TRUE unless you set the focus to a control  
  33.                   // EXCEPTION: OCX Property Pages should return FALSE  
  34. }  


 

[cpp]  view plain copy
  1. void CTestDlg::OnOK()   
  2. {  
  3.     // TODO: Add extra validation here  
  4.     //GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus();  
  5.     //GetFocus()->GetNextWindow()->SetFocus();  
  6.     //GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();  
  7.     GetNextDlgTabItem(GetFocus())->SetFocus();  
  8. //  CDialog::OnOK();  
  9. }  

你可能感兴趣的:(MFC)