VC++6.0实现多选项卡(PropertySheet及PROPPAGE的使用)

本文详细介绍了如何使用VC++6.0的CPropertySheet和IDD_PROPPAGE来创建多选项卡对话框。通过创建Cpage1、Cpage2、Cpage3三个Dialog类并添加到Cprosheet中,实现选项卡切换。同时讲解了DoModal和ShowWindow两种显示方式的区别,以及如何自定义按钮功能和实现选项卡内容的动态更新。

一,创建

首先在ResourceView中添加Dialog。选中Dialog,右键打开菜单,选择Inert,然后选择Dialog中的IDD_PROPPAGE。在此创建三个Dialog,并为其建立相应的类Cpage1Cpage2Cpage3

然后在ClassView中为整个项目添加新类Cprosheet,基类为CPropertySheet。然后将Cpage1Cpage2Cpage3的三个Dialog添加到Cprosheet中就可实现多个选项卡的对话框。

添加方法如下:

1)先在Cprosheet类中添加Cpage1Cpage2Cpage3的三个全局变量

public:

    Cpage1 m_page1;

    Cpage2 m_page2;

    Cpage3 m_page3;

2)在Cprosheet类的构建函数中添加三个对话框

Cprosheet::Cprosheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)

       :CPropertySheet(pszCaption, pParentWnd, iSelectPage)

{    

       AddPage(&m_page1);

       AddPage(&m_page2);

       AddPage(&m_page3);

}

二,PropertySheet显示

关于Cprosheet对话框的显示有两种方法,一种为DoModal,另一种为ShowWindow。前一种的显示代码如下:

Cprosheet property ("test",this,NULL);

Property. DoModal();

后一种的显示代码如下:

CPropertySheet *property=new   Cprosheet("test",this,NULL);  

property->Create(this, WS_TILEDWINDOW, WS_EX_TOPMOST);

property->ShowWindow(SW_SHOW);

至于两种显示方法显示的对话框的区别我就不说了,相信大家比我都了解。

值得一提的是DoModal显示出来的对话框自带“确定”(IDOK)、“取消”(IDCANCEL)等按钮,而ShowWindow显示的对话框是不带这些按钮的。如果想先显示这些按钮,就需要修改Cprosheet的初始化函数OnInitDialog(),代码如下:

m_bModeless = FALSE;  

m_nFlags |= WF_CONTINUEMODAL;

BOOL bResult = CPropertySheet::OnInitDialog();

// TODO: Add your specialized code here

m_bModeless = TRUE;

m_nFlags &= ~WF_CONTINUEMODAL;

return bResult;

另外,如果不想要某些按钮的话,可以用以下方法:

CWnd *hWnd = GetDlgItem(IDCANCEL); 

hWnd->ShowWindow(false);    //隐藏“取消”(IDCANCEL)按钮

如果想修改按钮的文字可用以下方法:

CWnd *hWnd = GetDlgItem(IDOK); 

hWnd->SetWindowText(_T("按钮1"));   //修改“确定”(IDOK)按钮名称

三,添加按钮功能

    下面简单介绍一下修改“确定”、“取消”等按钮功能的方法。

修改这些按钮的功能,首先要先声明要添加的功能函数OnOkOnCancel。在Cprosheet的头文件中Operations中添加afx_msg void OnOk()afx_msg void OnCancel()两句代码。如下:

// Operations

public:

// Overrides

       // ClassWizard generated virtual function overrides

       //{{AFX_VIRTUAL(Cprosheet)

       public:

       virtual BOOL ContinueModal();

       virtual BOOL OnInitDialog();

       protected:

       virtual void DoDataExchange(CDataExchange* pDX);

       virtual void CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType = adjustBorder);

       virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);

       //}}AFX_VIRTUAL

    afx_msg void OnOk();

afx_msg void OnCancel();

 

然后要将按钮ID与函数对应起来。在Cprosheet类中找到如下代码

BEGIN_MESSAGE_MAP(Cprosheet, CPropertySheet)

       //{{AFX_MSG_MAP(Cprosheet)

              // NOTE - the ClassWizard will add and remove mapping macros here.

       //}}AFX_MSG_MAP

END_MESSAGE_MAP()

在其中添加

ON_BN_CLICKED(IDOK, OnOk)  // IDOK对应 OnOk函数

    ON_BN_CLICKED(IDCANCEL,OnCancel)  // IDCANCEL对应 OnCancel函数

这样就可在void Cprosheet::OnOk()void Cprosheet::OnCancel()种修改功能代码了。

四,选项卡动态更新

在按照以上方法创建的选项卡,我在使用中发现选项卡的内容更新总是不能实时更新。下面的方法是我解决此问题的办法。

1)首先在项目的APP类(我的为CPagesheetApp)中声明全局变量

int pageflag;   //判断显示为哪一页

2)然后在Cpage1Cpage2Cpage3的初始化函数OnInitDialog中更改pageflag的值,用来表示当前为哪一个page

比如在Cpage1这样赋值

 ((CPagesheetApp*)AfxGetApp())->pageflag=1;

对于Cpage2 Cpage3分别赋值为23

3)在Cprosheet中声明全局变量NUMNUM1NUM2,并均赋值为0。最后在OnOk函数种添加如下代码

m_page1.UpdateData(true);

    if(NUM1==0)

       {    

              if(((CPagesheetApp*)AfxGetApp())->pageflag==2)

              {m_page2.UpdateData(true);

             NUM1=1;

              }

    }

    else  {m_page2.UpdateData(true);}

if(NUM2==0)

       {

         if(((CPagesheetApp*)AfxGetApp())->pageflag==3)

         {  m_page3.UpdateData(true);

         NUM2=1;

         }

       }

       else {m_page3.UpdateData(true);}

       NUM++;

这样问题就基本解决了。

      

 

 

数据集可视化效果可参见下方展示。 【数据集概况】 · 检测类别(中文):[保龄球(bowling)] · 训练集:594 张 · 验证集:75 张 · 测试集:74 张 · 总计:743 张 该数据集聚焦于室内保龄球馆场景,系统性采集了多角度、多姿态下保龄球在不同运动阶段的视觉特征,为保龄球运动过程中的球体识别与轨迹分析提供了高质量标注样本,具有明确的体育训练与智能辅助系统开发价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 100 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9938** mAP50-95 | 0.6966 Precision | 0.9740 Recall | 0.9974 train/box_loss | 0.9113 train/cls_loss | 0.2862 val/box_loss | 1.1516 val/cls_loss | 0.3116 【训练过程分析】 100 轮训练后 mAP50 达到 0.9938,模型收敛良好。Loss 曲线前段快速下降,后段趋于平稳,val_loss 无反弹,没有明显过拟合。但 mAP50-95 为 0.6966,和 mAP50 差距 0.30,定位精度仍有优化空间。 【模型性能评估】 Precision 0.9740、Recall 0.9974,精召双高,模型对保龄球的检测能力强。 【预测效果展示】 验证集预测效果较好,检测框基本准确覆盖保龄球,置信度整体偏高。 【改进建议】 1. 丰富场景多样性:补充不同光照、背景和遮挡条件下的样本。 2. 提升输入分辨率:640 ...
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值