为了能实现在同一个页面实现多个页面的切换效果。CPropertySheet要与CPropertyPage一起使用。
首先 新建一个MFC工程--MFC AppWizard(exe), 取名Pagesheet, 选择Dialog based, 然后Finish.
2. 在对话框资源中插入两个对话框IDD_DIALOG1、IDD_DIALOG2,作为两个子页。为这两个对话框增加两个类,分别为CPage1和CPage2,其基类选择CPropertyPage。
3. 增加一个属性页类CMySheet, 其基类选择CPropertySheet。
4. 在类CMySheet中增加两个成员变量m_page1,类型为CPage1,m_page2,类型为CPage2。
5. 在类CMySheet的构造函数中添加如下两句,增加两个页。
CMySheet::CMySheet(LPCTSTRpszCaption, CWnd* pParentWnd, UINTiSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&m_page1);
AddPage(&m_page2);
}
6. 在类CPagesheetApp的初始化函数InitInstance()中添加如下两句,将原来声明的对象去掉。改为
CMySheetdlg("test");
m_pMainWnd = &dlg;
7. 最后别忘了在“Pagesheet.cpp”文件中添加头文件“MySheet.h”。
效果如下:
在**Dlg.h中添加如下代码
CPropertySheet m_sheet; CPage1 m_prop1; CPage2 m_prop2;
在**Dlg.cpp的初始化中添加如下代码
m_sheet.AddPage(&m_prop1); m_sheet.AddPage(&m_prop2); m_sheet.Create(this,WS_VISIBLE|WS_CHILD); m_sheet.SetWindowPos(NULL,630,80,1050,1000,SWP_NOSIZE );//窗口x.y,cx宽,cy高度 SWP_NOSIZE
这样就可以实现两者的切换。
为了方便引用,把CPage1.h和CPage2.h中的类的定义放在了**Dlg.h中。
关于List Control
初始化如下
使用时CRect rect; m_List_CCPA2L.SetExtendedStyle(m_List_CCPA2L.GetExtendedStyle() | LVS_EX_CHECKBOXES);//加入复选框 // 获取编程语言列表视图控件的位置和大小 m_List_CCPA2L.GetClientRect(&rect); // 为列表视图控件添加全行选中和栅格风格 m_List_CCPA2L.SetExtendedStyle(m_List_CCPA2L.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); m_List_CCPA2L.InsertColumn(0, _T("变量"), LVCFMT_CENTER, 2*rect.Width()/5, 0); m_List_CCPA2L.InsertColumn(1, _T("地址"), LVCFMT_CENTER, 2*rect.Width()/5, 1); m_List_CCPA2L.InsertColumn(2, _T("大小"), LVCFMT_CENTER, rect.Width()/5, 2);
为了达到修改list control中数值的目的,添加一个编辑框,关联变量edit,添加消息响应m_List_CCPA2L.InsertItem(0, _T(Par[i])); m_List_CCPA2L.SetItemText(0, 1, _T(ParAddr[i])); m_List_CCPA2L.SetItemText(0, 2, _T(Byte[i]));
ON_NOTIFY(NM_DBLCLK,IDC_LIST_DisPlay, &CPage1::OnNMDblclkList3) ON_NOTIFY( VK_RETURN,IDC_EDIT1, &CPage1::OnNMClickEdit)
void CPage1::OnNMDblclkList3(NMHDR *pNMHDR, LRESULT *pResult) { NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR; CRect rc; m_Row = pNMListView->iItem;//获得选中的行 m_Col = pNMListView->iSubItem;//获得选中列 if (pNMListView->iSubItem != 0) //如果选择的是子项; { m_List_Display.GetSubItemRect(m_Row,m_Col,LVIR_LABEL,rc);//获得子项的RECT; m_edit.SetParent(&m_List_Display);//转换坐标为列表框中的坐标 m_edit.MoveWindow(rc);//移动Edit到RECT坐在的位置; m_edit.SetWindowText(m_List_Display.GetItemText(m_Row,m_Col));//将该子项中的值放在Edit控件中; m_edit.ShowWindow(SW_SHOW);//显示Edit控件; m_edit.SetFocus();//设置Edit焦点 m_edit.ShowCaret();//显示光标 m_edit.SetSel(-1);//将光标移动到最后 } *pResult = 0; } void CPage1::OnNMClickEdit(NMHDR *pNMHDR, LRESULT *pResult) { CString tem; m_edit.GetWindowText(tem); //得到用户输入的新的内容 m_List_Display.SetItemText(m_Row,m_Col,tem); //设置编辑框的新内容 m_edit.ShowWindow(SW_HIDE); //应藏编辑框 }
并添加PreTranslateMessage,用来响应回车
这样下来,鼠标双击数值时就会进入编辑状态,编辑后回车,就会更新数值。BOOL CPage1::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) { CWnd *pWnd = GetFocus(); if (pWnd->GetDlgCtrlID()==(IDC_EDIT1)) { CString tem; m_edit.GetWindowText(tem); //得到用户输入的新的内容 m_List_Display.SetItemText(m_Row,m_Col,tem); //设置编辑框的新内容 m_edit.ShowWindow(SW_HIDE); //应藏编辑框 return TRUE; } } return CDialog::PreTranslateMessage(pMsg); }