MFC添加属性页杂记

为了能实现在同一个页面实现多个页面的切换效果。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(LPCTSTRpszCaptionCWndpParentWndUINTiSelectPage)

              :CPropertySheet(pszCaptionpParentWndiSelectPage)

{

                     AddPage(&m_page1);

                     AddPage(&m_page2);

}

6.       在类CPagesheetApp的初始化函数InitInstance()中添加如下两句,将原来声明的对象去掉。改为

CMySheetdlg("test");

              m_pMainWnd = &dlg;

7.    最后别忘了在Pagesheet.cpp”文件中添加头文件“MySheet.h”。

效果如下:

 

test


在**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);
}

这样下来,鼠标双击数值时就会进入编辑状态,编辑后回车,就会更新数值。





  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值