windows 程序设计之「RECORD2.C」范例分析笔记

2024-05-01 03:18

本文主要是介绍windows 程序设计之「RECORD2.C」范例分析笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*----------------------------------------

   RECORD2.C -- Waveform Audio Recorder

                (c) Charles Petzold, 1998

------------------------------------------*/

 

#include <windows.h>

#include "..//record1//resource.h" // RECORD1.C 中的资源标识符头文件

 

BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;

 

TCHAR szAppName [] = TEXT ("Record2") ;

 

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

                    PSTR szCmdLine, int iCmdShow)

{

     if (-1 == DialogBox (hInstance, TEXT ("Record"), NULL, DlgProc))

     {

          MessageBox (NULL, TEXT ("This program requires Windows NT!"),

                      szAppName, MB_ICONERROR) ;

     }

     return 0 ;

}

 

void ShowError (HWND hwnd, DWORD dwError)

{

     TCHAR szErrorStr [1024] ;

    

     mciGetErrorString (dwError, szErrorStr,

                        sizeof (szErrorStr) / sizeof (TCHAR)) ;

     MessageBeep (MB_ICONEXCLAMATION) ;

     MessageBox (hwnd, szErrorStr, szAppName, MB_OK | MB_ICONEXCLAMATION) ;

}

 

BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

     static BOOL       bRecording, bPlaying, bPaused ;

     static TCHAR      szFileName[] = TEXT ("record2.wav") ;

     static WORD       wDeviceID ;

     DWORD             dwError ;

     MCI_GENERIC_PARMS mciGeneric ;

     MCI_OPEN_PARMS    mciOpen ;

     MCI_PLAY_PARMS    mciPlay ;

     MCI_RECORD_PARMS  mciRecord ;

     MCI_SAVE_PARMS    mciSave ;

    

     switch (message)

     {

     case WM_COMMAND:

          switch (wParam)

          {

          case IDC_RECORD_BEG:

                    // 删除现有的波形文件

               DeleteFile (szFileName) ;

               // 设置MCI_OPEN_PARMS结构

               // dwCallback 低位字指定一个窗口句柄;用于MCI_NOTIFY旗标

               mciOpen.dwCallback       = 0 ;

               // 调用后用于记录使用的设备标识符

               mciOpen.wDeviceID        = 0 ;

               // 常数标识符名称或设备类型

               mciOpen.lpstrDeviceType  = TEXT ("waveaudio") ;

               // 设备元件(通常是一个路径)

               mciOpen.lpstrElementName = TEXT ("") ;

               // 可选设备别名

               mciOpen.lpstrAlias       = NULL ;

               // MCI_OPEN  初始化一个设备或文件

               dwError = mciSendCommand (0, MCI_OPEN,

                   // MCI_WAIT  指导设备的等待,直到完成所要求的行动才返回控制权

                   // MCI_OPEN_TYPE 表示要使用MCI_OPEN_PARMS结构中的LpstrDiviceType参数

                   // MCI_OPEN_ELEMENT 表示LpstrDeviceType参数中的是设备表述字符串

                   // 还可以使用 MCI_OPEN_TYPE_ID 表示LpstrDeviceType参数中的是设备标识符

                                   MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,

                                   // 指向一个结构,它包含命令的消息参数

                                   (DWORD) (LPMCI_OPEN_PARMS) &mciOpen) ;

               if (dwError != 0)

               {

                    ShowError (hwnd, dwError) ;

                    return TRUE ;

               }

                    // 储存设备ID

               wDeviceID = mciOpen.wDeviceID ;

              

                    // 设置用于录制的命令数据

               // dwCallback 低位字指定一个窗口句柄;用于MCI_NOTIFY旗标

               mciRecord.dwCallback = (DWORD) hwnd ;

               mciRecord.dwFrom     = 0 ;

               mciRecord.dwTo       = 0 ;

               // MCI_RECORD 启动录音功能

// MCI_NOTIFY 旗标导致录音结束后系统向mciRecord.dwCallback元素中指定的窗口句柄发送一条MM_MCINOTIFY通知消息

               mciSendCommand (wDeviceID, MCI_RECORD, MCI_NOTIFY,

                               (DWORD) (LPMCI_RECORD_PARMS) &mciRecord) ;

              

                    // 设置按钮是否有效和当前焦点

               EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), FALSE);

               EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), TRUE) ;

               EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG),   FALSE);

               EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE);

               EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END),   FALSE);

               SetFocus (GetDlgItem (hwnd, IDC_RECORD_END)) ;

              

               bRecording = TRUE ;

               return TRUE ;

               

          case IDC_RECORD_END:

                    // 停止录音

               mciGeneric.dwCallback = 0 ;

               // MCI_STOP 命令消息用于停止先前的录音命令

               mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT,

                               (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ;

              

                    // 保存声音文件

               mciSave.dwCallback = 0 ;

               mciSave.lpfilename = szFileName ;

               // MCI_SAVE 命令用于对先前录制在临时文件中的声音文件进行保持

               // MCI_SAVE_FILE 指出保存的文件名在mciSave.lpfilename元素中指定

               mciSendCommand (wDeviceID, MCI_SAVE, MCI_WAIT | MCI_SAVE_FILE,

                               (DWORD) (LPMCI_SAVE_PARMS) &mciSave) ;

              

                    // 关闭打开的设备

               // MCI_CLOSE命令消息用于删除所有的临时文件、释放已经建立的内存块并关闭设备

               mciSendCommand (wDeviceID, MCI_CLOSE, MCI_WAIT,

                               (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ;

 

               // 设置按钮是否有效和当前焦点

               EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), TRUE) ;

               EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE);

               EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG),   TRUE) ;

               EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE);

               EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END),   FALSE);

               SetFocus (GetDlgItem (hwnd, IDC_PLAY_BEG)) ;

               // 录音进行中标记

               bRecording = FALSE ;

               return TRUE ;

              

          case IDC_PLAY_BEG:

                    // 打开波形音频

 

               mciOpen.dwCallback       = 0 ;

               mciOpen.wDeviceID        = 0 ;

               mciOpen.lpstrDeviceType  = NULL ;

               mciOpen.lpstrElementName = szFileName ;

               mciOpen.lpstrAlias       = NULL ;

               

               // MCI_OPEN_ELEMENT 标记表示lpstrElementName字段是一个有效的文件名

               dwError = mciSendCommand (0, MCI_OPEN,

                                         MCI_WAIT | MCI_OPEN_ELEMENT,

                                         (DWORD) (LPMCI_OPEN_PARMS) &mciOpen) ;

              

               if (dwError != 0)

               {

                    ShowError (hwnd, dwError) ;

                    return TRUE ;

               }

                    // Save the device ID

              

               wDeviceID = mciOpen.wDeviceID ;

              

                    // Begin playing

              

               mciPlay.dwCallback = (DWORD) hwnd ;

               mciPlay.dwFrom     = 0 ;

               mciPlay.dwTo       = 0 ;

               // 播放波形音频文件

               // MCI_NOTIFY 旗标导致播放结束后系统向mciPlay.dwCallback元素中指定的窗口句柄发送一条MM_MCINOTIFY通知消息

               mciSendCommand (wDeviceID, MCI_PLAY, MCI_NOTIFY,

                               (DWORD) (LPMCI_PLAY_PARMS) &mciPlay) ;

              

                    // Enable and disable buttons

              

               EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), FALSE);

               EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE);

               EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG),   FALSE);

               EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), TRUE) ;

               EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END),   TRUE) ;

               SetFocus (GetDlgItem (hwnd, IDC_PLAY_END)) ;

              

               bPlaying = TRUE ;

               return TRUE ;

              

          case IDC_PLAY_PAUSE:

              // 如果暂停按钮之前没有被按下则执行暂停操作

               if (!bPaused)

               {

                    mciGeneric.dwCallback = 0 ;

                    // 发出暂停指令

                    mciSendCommand (wDeviceID, MCI_PAUSE, MCI_WAIT,

                                    (DWORD) (LPMCI_GENERIC_PARMS) & mciGeneric);

                    // 设置暂停按钮字样

                    SetDlgItemText (hwnd, IDC_PLAY_PAUSE, TEXT ("Resume")) ;

                    // 标记暂停被按下

                    bPaused = TRUE ;

               }

               // 否者执行继续播放操作

               else

               {

                    mciPlay.dwCallback = (DWORD) hwnd ;

                    mciPlay.dwFrom     = 0 ;

                    mciPlay.dwTo       = 0 ;

                    // MCI_NOTIFY 旗标导致播放结束后系统向mciPlay.dwCallback元素中指定的窗口句柄发送一条MM_MCINOTIFY通知消息

                    mciSendCommand (wDeviceID, MCI_PLAY, MCI_NOTIFY,

                                    (DWORD) (LPMCI_PLAY_PARMS) &mciPlay) ;

                   

                    SetDlgItemText (hwnd, IDC_PLAY_PAUSE, TEXT ("Pause")) ;

                    bPaused = FALSE ;

               }

              

               return TRUE ;

              

          case IDC_PLAY_END:

                    // 停止播放,并关闭设备

              

               mciGeneric.dwCallback = 0 ;

              

               mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT,

                               (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ;

              

               mciSendCommand (wDeviceID, MCI_CLOSE, MCI_WAIT,

                               (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ;

              

                    // Enable and disable buttons

              

               EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), TRUE) ;

               EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE);

               EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG),   TRUE) ;

               EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE);

               EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END),   FALSE);

               SetFocus (GetDlgItem (hwnd, IDC_PLAY_BEG)) ;

               // 播放进行中标记

               bPlaying = FALSE ;

 

               bPaused  = FALSE ;

               return TRUE ;

          }

          break ;

              

     case MM_MCINOTIFY:

          switch (wParam)

          {

          case MCI_NOTIFY_SUCCESSFUL:

              // 如果播放或录音正在进行中,则发送停止消息

               if (bPlaying)

                    SendMessage (hwnd, WM_COMMAND, IDC_PLAY_END, 0) ;

              

               if (bRecording)

                    SendMessage (hwnd, WM_COMMAND, IDC_RECORD_END, 0);

              

               return TRUE ;

          }

          break ;

    

     case WM_SYSCOMMAND:

          switch (wParam)

          {

          case SC_CLOSE:

               if (bRecording)

                    SendMessage (hwnd, WM_COMMAND, IDC_RECORD_END, 0L) ;

              

               if (bPlaying)

                    SendMessage (hwnd, WM_COMMAND, IDC_PLAY_END, 0L) ;

              

               EndDialog (hwnd, 0) ;

               return TRUE ;

          }

          break ;

     }

     return FALSE ;

}

 

 

这篇关于windows 程序设计之「RECORD2.C」范例分析笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/950600

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个