0 对话框分类:Modal 和 Modeless
1.
如果在
SDI
中要调用对话框
a.
先插入一个对话框资源;
b.
然后在
ClassWizards
中为其创建一个类。其目的是比较方便为添加按纽和消息响应函数。
c.
然后实例化它。在实例化时,必须将其头文件包含进去。
2.创建模态对话框:CTestDlg dlg; dlg.DoModal();
创建非模态对话框:
CTestDlg dlg;
dlg不能是局部变量
。当
点击非模态对话框的
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();