这节课主要讲对话框
一。模态对话框创建:
1. 资源图中创建一个dialog,在这个dialog上创建一个类
2. 在资源图中的menu上加一个不是pop up的菜单项,对这个菜单项创建一个消息响应函数,在view中
3. 在这个消息响应函数CView::OnDialog中,实例化刚才dialog类的对象dlg
4. dlg.DoModal();
5. 在view中包含dialog类的头文件
二。非模态对话框创建
其他与上面一样,改变第3, 4步为:
3. CTestDlg *pDlg = new CTestDlg();
4. pDlg->Create(IDD_DIALOG1, this);
pDlg->ShowWindow(SW_SHOW);
这个方法需要在view析构函数里去delete这个指针。另外个办法是创建一个CTestDlg的成员变量,不用指针,指针创建是在heap上,与应用程序生命周期一样
非模态对话框比较麻烦。。。不建议用
三。点击dialog上的add按钮会弹出另外一个button,动态增加按钮
1. 在add按钮上创建一个在dialog类里面的消息响应函数CTestDlg::OnBtnAdd
2. 在CTestDlg类里增加一个CButton的成员变量m_btn和BOOL成员变量m_bIsCreate(初始化为FALSE)(或者直接在函数里做一个static的变量)(或者对m_btn.m_hWnd看看是不是为空,这个最简单)
3. 在OnBtnAdd函数里增加:
if (m_bIsCreate == FALSE) {
m_btn.Create(...);
m_bIsCreate = TRUE;
}
else
{
m_btn.DestroyWindow();
m_bIsCreate = FALSE;
}
四. 得到文本框的内容
char ch1[10];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1, 10);
这里IDC_EDIT1是文本框的ID,ch1是一个buffer。
或者用GetDlgItemText(IDC_EIDT1, ch1, 10);
或者num1 = GetDlgItemInt(IDC_EDIT1)
或者关联成员变量,记得用好UpdateData();
或者关联控件变量
m_edit1.GetWindowText(...);
五. 设置文本框的内容
ch3[10];
GetDlgItem(IDC_EDIT3)->SetWindowText(ch3, 10);
或者用SetDlgItemText(IDC_EDIT3, ch3, 10);
或者SetDlgItemInt(IDC_EDIT3, num3);
或者关联成员变量,记得用好UpdateData();
或者关联控件变量
m_edit3.SetWindowText(..);
六。对话框的扩张与收缩
1. 对扩张收缩按钮增加消息响应函数
2. 在资源的dialog里增加一个picture的分隔符,style选择sunken
3. 还是上code吧
1 void CTestDlg::OnBnClickedButton2() 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 CString str; 5 if (GetDlgItemText(IDC_BUTTON2, str), str == "收缩<<") { 6 SetDlgItemText(IDC_BUTTON2, "扩展>>"); 7 } 8 else { 9 SetDlgItemText(IDC_BUTTON2, "收缩<<"); 10 } 11 12 static CRect rectLarge; 13 static CRect rectSmall; 14 15 if (rectLarge.IsRectNull()) { 16 CRect rectSeparator; 17 GetWindowRect(&rectLarge); 18 GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator); 19 20 rectSmall.left = rectLarge.left; 21 rectSmall.top = rectLarge.top; 22 rectSmall.right = rectLarge.right; 23 rectSmall.bottom = rectSeparator.bottom; 24 } 25 26 if (str == "收缩<<") { 27 SetWindowPos(NULL, 0, 0, rectSmall.Width(), rectSmall.Height(), SWP_NOMOVE | SWP_NOZORDER); 28 } 29 else { 30 SetWindowPos(NULL, 0, 0, rectLarge.Width(), rectLarge.Height(), SWP_NOMOVE | SWP_NOZORDER); 31 } 32 33 }
七。输入焦点转移
1. 给编辑框窗口设置Multi line
2. 贴code
1 WNDPROC prevProc; 2 LRESULT CALLBACK WinSunProc( 3 HWND hwnd, 4 UINT uMsg, 5 WPARAM wParam, 6 LPARAM lParam 7 ) 8 { 9 if (uMsg == WM_CHAR && wParam == 0x0d) { 10 //::SetFocus(::GetNextWindow(hwnd, GW_HWNDNEXT)); 11 //SetFocus(::GetWindow(hwnd, GW_HWNDNEXT)); 12 SetFocus(::GetNextDlgTabItem(::GetParent(hwnd), hwnd, FALSE)); 13 return 1; 14 } 15 else { 16 return prevProc(hwnd, uMsg, wParam, lParam); 17 } 18 } 19 20 BOOL CTestDlg::OnInitDialog() 21 { 22 CDialog::OnInitDialog(); 23 24 // TODO: 在此添加额外的初始化 25 prevProc = (WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd, GWL_WNDPROC, (LONG)WinSunProc); 26 27 return TRUE; // return TRUE unless you set the focus to a control 28 // 异常: OCX 属性页应返回 FALSE 29 }
或者
1 void CTestDlg::OnBnClickedOk() 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 //GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus(); 5 //GetFocus()->GetNextWindow()->SetFocus(); 6 //GetFocus()->GetNextWindow(GW_HWNDNEXT)->SetFocus(); 7 GetNextDlgTabItem(GetFocus())->SetFocus(); 8 9 //OnOK(); 10 }
八。设置复选内容
EM_SETSEL,具体看视频91分钟
其他:静态文本框改变
感觉没什么意义