VC++深入详解之对话框笔记

本文详细介绍了在Windows应用程序中创建和操作对话框控件,包括模态和非模态对话框的创建、按钮事件处理、静态标签添加消息、控件文字修改、数据交换、对话框控件访问、对话框收缩功能实现、输入焦点传递、逃跑按钮的实现等。同时,文章还讲解了如何创建属性页和属性表单,包括样式设置、初始化、属性表单的使用方法,以及如何添加向导功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此文乃作者的笔记,对您无任何作用,请忽略。当然了,如果你硬要看,我也没有办法,但是我已经提醒过了,那我就没有责任了。

创建Modalless对话框: CTestDlg *pDlg = new CTestDlg; pDlg -> Create( IDD_DIALOG1, this ); pDlg-> ShowWindow( SW_SHOW ); 对于模态对话框,关闭以后就自动销毁,而对于非模态对话框,则是将其隐藏,因此对于非模态对黄狂来说,如果有一个ID值为IDOK的按钮,就必须重写基类的OnOK这个虚函数,并在重写的函数中调用DestroyWindow函数,以完成销毁对话框饿工作,同时注意不要再调用基类的OnOK函数。IDCANCEL同理。 判断是个按钮是否存在,最简单的方法就是判断它的句柄: if( ! m_btn.m_hWnd ) { m_btn.Create(_T("New") , BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, CRect( 0, 0, 100, 50) , this, 123); } else { m_btn.DestroyWindow(); } 静态标签添加消息: 修改ID,添加响应消息,修改属性Notify为true。 修改控件(包括静态控件)的文字: 方法一: CString str; GetDlgItem( IDC_NUMBER1) -> GetWindowText( str ); if( str = "Number1:" ) { GetDlgItem( IDC_NUMBER1) -> SetWindowText( _T("数值1:")); } else { GetDlgItem(IDC_NUMBER1) -> SetWindowText( _T("Number1:")); } 方法二: GetDlgItemText( IDC_EDIT1, ch1, 10); SetDlgItemText( IDC_EDIT2, ch3); 将控件与成员变量关联时,会用到DoDataExchange函数。该函数完成数据的关联,然而在程序代码中从来不直接调用这个额函数,而是通过CWnd类的另一个成员函数UpDateData来调用。 BOOL UpdateData( BOOL bSaveAndValidate = TRUE ); 如果其之为TRUE,则说明该函数正在获取对话框的数据,如果其值为FALSE,则说明该函数正在初始化对话框控件,即拷贝变量值到控件去显示。 在函数DoDataExchange中会用到DDX_***和DDV_***其中DDV_***用以验证数据有效性,需出现在其对应的DDX_***之后。 也可以定义控件类型的成员变量,用以代表其本身,使用的时候就不许哟啊GetDlgItem( IDC_EDIT1)这么麻烦了。 声明:CEdit m_edit1; 数据交换:DDX_Control( pDX, IDC_EDIT1, m_edit1); 使用:m_edit1.SetWindowText( ch1); 基于消息(WM_GETTEXT,WM_SETTEXT)的控件数据传递方式: int num1, num2, num3; char ch1[10], ch2[10], ch3[10]; SendDlgItemMessage( IDC_EDIT1, WM_GETTEXT, 10, (LPARAM)ch1); SendDlgItemMessage( IDC_EDIT2, WM_GETTEXT, 10, (LPARAM)ch2); num1 = atoi( ch1); num2 = atoi(ch2); num3 = num2 + num1; itoa( num3, ch3, 10); SendDlgItemMessage(IDC_EDIT3, WM_SETTEXT, 0, (LPARAM)ch3); 访问对话框控件的其中方式: ①GetDlgItem()->Get(Set)WindowText() ②GetDlgItemInt/SetDlgItemText() ③GetDlgItemInt()/SetDlgItemInt() ④将控件和整形变量相关联 ⑤将控件和控件变量相关联 ⑥SendMessage() ⑦SendDlgItemMessage() 对话框收缩功能的实现: void CTestDlg::OnBnClickedButton1() { CString str; GetDlgItem( IDC_BUTTON1 ) ->GetWindowText(str); if( str ==_T( "收缩<<")) { GetDlgItem(IDC_BUTTON1) ->SetWindowText(_T("扩展>>")); } else { GetDlgItem(IDC_BUTTON1) -> SetWindowText(_T("收缩<<")); } static CRect rectLarge; static CRect rectSmall; if( rectLarge.IsRectNull())//检查是否已赋值 { CRect rectSeparator; GetWindowRect( &rectLarge); GetDlgItem(IDC_SEPERATOR)->GetWindowRect( &rectSeparator); rectSmall.left = rectLarge.left; rectSmall.top = rectLarge.top; rectSmall.right = rectLarge.right; rectSmall.bottom = rectSeparator.bottom; } if( str == _T("收缩<<")) { SetWindowPos( NULL, 0, 0, rectSmall.Width(), rectSmall.Height(), SWP_NOMOVE | SWP_NOZORDER ); } else { SetWindowPos(NULL, 0, 0, rectLarge.Width(), rectLarge.Height(), SWP_NOMOVE | SWP_NOZORDER); } } 输入焦点的传递: LONG SetWindowLong( HWND hWnd, int nIndex, LONG dwNewLong); 该函数的作用是改变制定窗口的属性。 在程序运行时,对话框及其子控件穿件完成,将要显示之前会发送一个消息:WM_INITDIALOG vs2008中没有WM_INITDIALOG,不过在CDialog类中已经对此消息响应了,所以我们喜欢响应此消息的时候,只需要改写OnInitDialog()虚函数即可。 逃跑按钮的实现: 添加两个相似的按钮 自定义一个从CButton派生的类CNewButton用以响应MOUSEMOVE函数 在对话框类中添加对应的CNewButton成员变量 在CNewButton中添加一个CNewButton*的指针,用以指向下一个要隐藏的按钮 在对话框类的OnInitDialog为CNewButton*指针赋值 并设置除第一次需要显示的按钮意外的其他按钮为隐藏 响应MouseMove消息: void CNewButton::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your messoage handler code here and/or call default ShowWindow(SW_HIDE); m_pBtn->ShowWindow (SW_SHOWNORMAL); CButton::OnMouseMove(nFlags, point); } 属性页和属性表单: 属性表单的属性: Style:Child(普通对话框:Popup) Border:Thin(普通对话框:Doalog Frame) System menu:为选中(普通对话框:未选中) 首先添加资源:在对话框下面的IDD_PROPPAGE_LARGE 然后绘制属性页 再生成相应的类,生成类的时候基类需为CPropertyPage 可以生成多个属性页,最后定义一个属性表单 属性表单的基类应当为CPropertySheet 再定义相应的成员变量,成员变量的类型就是对应的属性页 然后在属性表单类的构造函数中调用AddPage() 最后就是使用属性表单,只需要在要用的地方定义一个属性表单,调用其DoModal函数即可(类似于对话框的调用) 如果要创建向导,只需要在调用DoModal之前,设置propSheet.SetWizardMode()即可。 在第一页,也会有上一步按钮,所以需要重写OnSetActive()虚函数: BOOL CProp1::OnSetActive() { ((CPropertySheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT); return CPropertyPage::OnSetActive(); } 为了判断使用者是否选择了Radio中的一个,将第一个Radio的Group属性设置为true, 然后添加一个于控件对应的成员变量,当使用者单击下一步的时候,程序将调用OnWizardNext这个虚函数,为了判断使用者是否选择,应当重写此虚函数: LRESULT CProp1::OnWizardNext() { // TODO: Add your specialized code here and/or call the base class UpdateData(); if( m_occupation == -1 ) { AfxMessageBox(_T("请选择你的职业")); return -1; } if ( m_wordAddr == _T("")) { AfxMessageBox(_T("请选择你的工作地点")); return -1; } return CPropertyPage::OnWizardNext(); } 初始化CListBox: BOOL CProp1::OnInitDialog() { CPropertyPage::OnInitDialog(); ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(_T("北京")); ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(_T("上海")); ((CListBox*)GetDlgItem(IDC_LIST1))->AddString(_T("天津")); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } 初始化CComboBox: BOOL CProp3::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: Add extra initialization here ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("1000元以下")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("1000-2000元")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("2000-3000元")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->AddString(_T("3000元以上")); ((CComboBox*)GetDlgItem(IDC_COMBO1))->SetCurSel(0); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } 一般情况下,CPropertySheet类的DoModal函数的返回值是IDOK或IDCANCEL。但是如果属性表单已经被创建为向导了,那么该函数的返回值将是ID_WIZFINISH或IDCANCEL。 设置字体: CFont font; font.CreatePointFont( 300, "华文行楷"); CFont *pOldFont; pOldFont = pDC->SelectObject( &font); //控制绘图位置: TEXTMETRIC tm; pDC->GetTextMetrics( &tm); pDC->TextOut( 0, tm.tmHeight, strTemp );
基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为台+后台模式开发 网站台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值