孫鑫VC++視頻學習筆記之6: 對話框編程(1)

轉自:http://webbery.tianyablog.com

   閱讀本文前,我們假設您已經:
   1,知道如何創建一個單文檔的App Wizard
   2,知道C++ 類、函數重載等簡單知識
   3,知道如何給View類或者Doc文檔添加成員變量
   4,會用MFC的IDE調試工具最好,那麼本文的程序您可以copy去調試
   5,知道如何爲某個框架類添加虛函數或消息處理函數
  
  
  
  1,動態創建按鈕
  
   1)增加全局變量 CButton m_btn;
  
   2)在需要創建的地方
  
  //ID號123可以隨意改變
  
   if(!m_btn.m_hWnd)
  
   m_btn.Create("維新",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,CRect(0,0,100,100),this,123);
  
  else
  
   m_btn.DestroyWindow();
  
  2,複製控件
  
  在dlg上添加控件時,按住ctrl鍵,拖動就可以複製一模一樣的控件
  
  3,控件對齊
  
  在對話框上多個控件對齊,可以用layout菜單或者左下角toolbar
  
  4,動態編輯static靜態文本框
  
   CString str;
  
   if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str=="Number1:")
  
  GetDlgItem(IDC_NUMBER1)->SetWindowText("數值1:");
  
  else
  
  GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");
  
  要讓static靜態文本框響應消息,需要複選上notify選項
  
  5,Edit文本框
  
   獲取/設置文本內容
  
   1)方法1
  
   char ch[10];
  
   GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
  
   GetDlgItem(IDC_EDIT3)->SetWindowText(itoa(atoi(ch1),ch1,10));
  
   2)方法2
  
   GetDlgItemText(IDC_EDIT1,ch1,10);
  
   SetDlgItemText(IDC_EDIT3,itoa(atoi(ch1),ch1,10));
  
   3)方法3
  
   SetDlgItemInt(IDC_EDIT3,GetDlgItemInt(IDC_EDIT1));//對整型數字的字符串有用
  
   4)關聯變量法
  
   對每個Edit控件關聯一個變量,設置後記得用UpdateData()
  
   對於顯示數字類的文本框,可以定義value和control兩種類型變量
  
  
  
  DoDataExchange() called by the framework to exchange and validate dialog data
  
   The framework automatically calls UpdateData with bSaveAndValidate set to FALSE when a modal dialog box is created in the default implementation of CDialog::OnInitDialog.
  
   5)利用WM_GETTEXT消息處理獲取文本
  
   char ch1[10];
  
   可以用以下四種方法(m_edit1爲關聯的控制型變量)
  
   ::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);
  
  
  
   利用WM_SETTEXT消息處理設置文本
  
   m_edit3.SendMessage(WM_SETTEXT,0,(LPARAM)ch3);
  
   6)直接對對話框控件進行消息發送
  
   SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);//獲取文本
  
   SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3);//設置文本
  
   SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,-1);
  
   7)利用EM_GETSEL,EM_SETSEL的消息處理
  
  6,對話框收縮
  
   點擊"收縮<<"對話框收縮,點擊"擴展>>"則擴展, 請看例子代碼
  
  7,多個edit框用Enter鍵切換的方法,三種方法
  
   1)捕獲鍵盤消息,在消息函數中處理(未提供)
  
   2)修改Edit的窗口過程:自己寫窗口過程替代原來的窗口過程(比較麻煩的方法)
  
   (1)定義窗口過程類型變量
  
   WNDPROC prevProc;
  
   (2)定義窗口過程函數
  
   LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam )
  
   {
  
   if(uMsg==WM_CHAR && wParam==0x0d)//如果是回車
  
   {
  
   //::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));//獲取下一窗口句柄方法一
  
   //SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));//方法二
  
   SetFocus(::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE));//方法三
  
   return 1;
  
   }
  
   else
  
   return prevProc(hwnd,uMsg,wParam,lParam);
  
   }
  
   (3)添加WM_INITDIALOG對應的函數
  
   (4)在OnInitDialog中添加
  
   prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)WinSunProc);
  
   (5)注意 edit控件 MultiLine複選屬性選/不選的不同
  
   SetWindowLong changes an attribute of the specified window.
  
  
  
   3)在OnOK(default button對應的函數)
  
   GetFocus()->GetNextWindow()->SetFocus();//注意最後一個窗口時要判斷,不然獲取出錯
  
   GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();//注意同上
  
   GetNextDlgTabItem(GetFocus())->SetFocus();
  
   注意: 對話框初始的OK的ID號爲IDOK,即使刪除按鈕(OnOk函數存在),依然會響應OnOk函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章