您的位置:首页 > 其它

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中添加如下代码

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);
}
这样下来,鼠标双击数值时就会进入编辑状态,编辑后回车,就会更新数值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: