MFC添加属性页杂记
2017-02-21 17:26
661 查看
为了能实现在同一个页面实现多个页面的切换效果。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中添加如下代码
在**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); 使用时
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]));为了达到修改list control中数值的目的,添加一个编辑框,关联变量edit,添加消息响应
ON_NOTIFY(NM_DBLCLK,IDC_LIST_DisPlay, &CPage1::OnNMDblclkList3)
ON_NOTIFY( VK_RETURN,IDC_EDIT1, &CPage1::OnNMClickEdit)
并添加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);
}
这样下来,鼠标双击数值时就会进入编辑状态,编辑后回车,就会更新数值。
首先 新建一个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); 使用时
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]));为了达到修改list control中数值的目的,添加一个编辑框,关联变量edit,添加消息响应
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);
}
这样下来,鼠标双击数值时就会进入编辑状态,编辑后回车,就会更新数值。
相关文章推荐
- MFC中 使用Tab Control 控件在对话框中添加属性页
- 【MFC】为VC中的TabControl容器添加属性页
- MFC之添加属性页
- 为MFC的工具条按钮添加提示文字
- VC++ MFC属性页使用说明(孙鑫视频教程总结)(4)
- 在MFC中手动添加消息处理函数PreTranslateMessage
- MFC 对话框添加菜单
- VS2010/MFC对话框二:为对话框添加控件)
- MFC列表(List Control)中添加项 第二节
- VS2010-MFC下在状态栏中添加进度条用于显示当前文件的读取进度
- MFC中CSplitter的应用以及在View中添加按钮
- directshow filter中添加属性页
- MFC入门学习之控件(5)标签控件List Control的添加和使用(中)
- MFC中添加ToolTip没有响应
- MFC单文档添加背景图片
- 在MFC中怎样添加一个非模态的对话框
- MFC 工具条 CToolBar : 添加控件
- 装了IE8后VS2008添加MFC类出现脚本错误的工具(转)
- directshow filter中添加属性页
- 给MFC程序添加运行时调试窗口