MFC: 孙鑫教程7笔记

这节课主要讲对话框

一。模态对话框创建:

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 }
View Code

 

七。输入焦点转移

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 }
View Code

或者

 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 }
View Code

 

八。设置复选内容

EM_SETSEL,具体看视频91分钟

 

其他:静态文本框改变

感觉没什么意义

你可能感兴趣的:(mfc)