第7课 对话框1

0 对话框分类:Modal 和 Modeless 

1. 如果在 SDI  中要调用对话框
  a. 先插入一个对话框资源;
  b. 然后在 ClassWizards  中为其创建一个类。其目的是比较方便为添加按纽和消息响应函数。
  c. 然后实例化它。在实例化时,必须将其头文件包含进去。

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

3. 一个对象只能一个按纽。为什么?因为在  Wincore.cpp628 行有代码 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_EDIT1MultiLine 要复选上。
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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值