windows程序设计 「PopPad3」之 POPPRNT.C 打印范例分析 笔记

打印机驱动开发笔记 Windows打印体系结构以打印池为中心,打印机图形dll的打印接口是打印驱动程序的一部分,打印的流程如下: 应用程序通知打印池开始一个新的打印任务; 打印池调用打印机接口DLL显示打印对话框,并将打印设置信息传给它; 应用程序调用GDI进行绘图操作 GDI将应用程序的绘图调用保存在EMF文件中,记录完毕将之发送给打印池; GDI返回应用程序完成一次假脱机打印过程,可以进行其他任务; ... 阅读详情
/*----------------------------------------------
   POPPRNT.C -- Popup Editor Printing Functions
  ----------------------------------------------*/
 
#include <windows.h>
#include <commdlg.h>
#include "resource.h"
 
BOOL bUserAbort ;
HWND hDlgPrint ;
 
BOOL CALLBACK PrintDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
     switch (msg)
     {
     case WM_INITDIALOG :
          // 使系统菜单中的 退出项 不可选
          EnableMenuItem ( GetSystemMenu (hDlg, FALSE ), SC_CLOSE , MF_GRAYED ) ;
          return TRUE ;
         
     case WM_COMMAND :
          bUserAbort = TRUE ;
          // 使对话框父窗口为有效,接受键盘鼠标输入
          EnableWindow ( GetParent (hDlg), TRUE ) ;
          // 摧毁对话框,清除对话框句柄
          DestroyWindow (hDlg) ;
          hDlgPrint = NULL ;
          return TRUE ;
     }
     return FALSE ;
}      
   
/* 参数 hPrinterDC 是打印机设备内容句柄 ,
  如果一切正常, iCode 参数是 0,
  如果 GDI 模块在生成临时文件时耗尽了磁盘空间, iCode 就是 SP_OUTOFDISK,
  如果打印作业继续,那么 AbortProc 必须传回 TRUE (非零) ;
  如果打印作业异常结束,就传回 FALSE (零) .*/
BOOL CALLBACK AbortProc (HDC hPrinterDC, int iCode)
{
     MSG msg ;
     // 如果用户点击 取消打印 则会退出消息检查循环 ,并返回 FALSE
     // PM_REMOVE 表示 PeekMessage 处理后,消息从队列里除掉
     while (!bUserAbort && PeekMessage (&msg, NULL , 0, 0, PM_REMOVE ))
     {
           // 拦截非模态对话框消息
          if (!hDlgPrint || ! IsDialogMessage (hDlgPrint, &msg))
          {
               TranslateMessage (&msg) ;
               DispatchMessage (&msg) ;
          }
     }
     return !bUserAbort ;
}
 
BOOL PopPrntPrintFile (HINSTANCE hInst, HWND hwnd, HWND hwndEdit,
                       PTSTR szTitleName)
{
     static DOCINFO     di = { sizeof (DOCINFO) } ;
     static PRINTDLG    pd ;
     BOOL               bSuccess ;
     int                yChar, iCharsPerLine, iLinesPerPage, iTotalLines,
                        iTotalPages, iPage, iLine, iLineNum ;
     PTSTR              pstrBuffer ;
     TCHAR              szJobName [64 + MAX_PATH ] ;
     TEXTMETRIC         tm ;
     WORD               iColCopy, iNoiColCopy ;
    
     // 指定这个结构的大小
     pd.lStructSize         = sizeof (PRINTDLG) ;

     pd.hwndOwner           = hwnd ;    // 指向对话框所有者窗口的句柄

     /* 包含打印机的设备与环境信息的 DEVMODE 结构的句柄。
       如果 hDevMode 不为 NULL ,则必须分配 DEVMODE 结构可移动的内存块,并初始化它的成员。
       PrintDlg 函数使用输入数据以初始化对话框中的控件。
       当 PrintDlg 返回时, DEVMODE 的成员显示用户的输入。
       如果 hDevMode 输入为 NULL , PrintDlg 为 DEVMODE 结构分配内存,初始化它的成员。
       以指示用户的输入,并返回一个句柄,标识它。 */
     pd.hDevMode            = NULL ;

      /* 包含驱动器名、打印机名和输出端口名的设备名结构 DEVNAMES 的句柄。
       如果 hDevNames 不为 NULL ,你必须分配 DEVNAMES 结构可移动的内存块,并初始化它的成员。
       PrintDlg 函数使用输入数据以初始化对话框中的控件。
       当 PrintDlg 返回时, DEVNAMES 成员包含由用户选择的打印机的信息。
       可以使用此信息来创建一个设备上下文或信息上下文。
       当 hDevNames 成员是 NULL ,在这种情况下, PrintDlg 为 DEVNAMES 结构分配内存,初始化它的成员。
       以指示用户的输入,并返回一个句柄,标识它。 */
     pd.hDevNames           = NULL ;

     /* 一个设备上下文句柄或一个信息上下文,这取决于是否指定旗标成员 PD_RETURNDC 或 PC_RETURNIC 标志。
     如果没有指定标志,这个成员的值是不确定的。如果指定了这两个标志, PD_RETURNDC 优先。 */
     pd.hDC                 = NULL ;

      /* 初始化打印对话框。当对话框返回时,它将会设置这些标志,以指示用户的输入。
       PD_ALLPAGES  默认的标志,指示所有单选按钮的最初选择。
        此标志作为一个占位符,表示 PD_PAGENUMS 和 PD_SELECTION 标志不指定。
       PD_COLLATE  如果这个标志被设置,副本逐份打印 复选框在初始时被选中。
       如果这个标志被 PrintDlg 函数返回时设置,应用程序必须模拟逐份打印方式。
       PD_RETURNDC 告诉 PrintDlg 自动建立打印机的装置或资讯的內容。
       并要求返回一个用户在对话框中选择的设备上下文的句柄。
       PD_NOSELECTION  禁止选择单选按钮。 */
     pd.Flags               = PD_ALLPAGES | PD_COLLATE |
                              PD_RETURNDC | PD_NOSELECTION ;

      /* 保存并初始化起始页面的值 */
     pd.nFromPage           = 0 ;

     /* 保存并初始化结束页面的值 */
     pd.nToPage             = 0 ;

     /* 保存并初始化页面的最低范围值 */
     pd.nMinPage            = 0 ;

     /* 保存并初始化页面的最高范围值 */
     pd.nMaxPage            = 0 ;

     /* 保存并初始化需要打印的份数 */
     pd.nCopies             = 1 ;

      /* 如果 PD_ENABLEPRINTTEMPLATE 或 PD_ENABLESETUPTEMPLATE 标志在 flags 成员设置,
       hInstance 的是一个自定义对话框模板资源被载入内存后的句柄,
       该句柄包含对话框模板由 lpPrintTemplateName 或 lpSetupTemplateName 成员命名。 */
     pd.hInstance           = NULL ;

     /* 应用程序定义的数据,该数据传递到钩子程序由 lpfnPrintHook 或 lpfnSetupHook 成员确定。
       当系统发送 WM_INITDIALOG 消息到钩子程序,该消息的 lParam 参数是一个对话框创建时 PRINTDLG 结构的指针。
       钩子程序可以使用该指针来获取 lCustData 价值。 */
     pd.lCustData           = 0L ;

     /* 一个对 PrintHookProc 钩子程序,处理打印对话框的消息列。
       这个成员被忽略,除非 PD_ENABLEPRINTHOOK 标志在 flags 成员设置。
       如果挂钩函数处理 WM_CTLCOLORDLG 信息,挂钩函数必须返回一个刷子句柄,此刷子用来刷控制背景 */
     pd.lpfnPrintHook       = NULL ;

      /* 一个对 SetupHookProc 钩子程序,处理打印设置对话框消息列。
       这个成员被忽略,除非 PD_ENABLESETUPHOOK 标志在 flags 成员设置。
       如果挂钩函数处理 WM_CTLCOLORDLG 信息,挂钩函数必须返回一个刷子句柄,此刷子用来刷控制背景 */
     pd.lpfnSetupHook       = NULL ;

      /* 指向一个以空字符结束的字符串,字符串是对话框模板资源的名字,
       资源保存在能被 hInstance 成员识别的模块中。此模板替换默认的打印对话框模板。 */
     pd.lpPrintTemplateName = NULL ;

      /* 指向一个以空字符结束的字符串,字符串是对话框模板资源的名字,
       资源保存在能被 hInstance 成员识别的模块中。此模板替换默认的打印设置对话框模板。 */
     pd.lpSetupTemplateName = NULL ;

     /* 如果 PD_ENABLEPRINTTEMPLATEHANDLE 标志在 flags 成员集,
       hPrintTemplate 是一个句柄内存对象,它包含一个对话框模板。此模板替换默认的打印对话框模板。 */
     pd.hPrintTemplate      = NULL ;

     /* 如果 PD_ENABLESETUPTEMPLATEHANDLE 标志在 flags 成员集,
       hSetupTemplate 是一个句柄内存对象,它包含一个对话框模板。此模板替换默认打印设置对话框模板。 */
     pd.hSetupTemplate      = NULL ;
    
      /* 激活打印对话框
        如果用户点击 OK 按钮,返回值为非零值。
       如果用户取消或关闭 Print 或 PrinterSetup 对话框或错误出现,返回值为零 */
     if (!PrintDlg (&pd))
          return TRUE ;

               // 取得编辑控件中文字的行数
     if (0 == (iTotalLines = SendMessage (hwndEdit, EM_GETLINECOUNT , 0, 0)))
          return TRUE ;
 
     // 取得当前打印机的字体信息
     GetTextMetrics (pd.hDC, &tm) ;
     yChar = tm.tmHeight + tm.tmExternalLeading ;
     // 当前打印机每页打印宽度 除以 小写字体的宽度 得到 打印机每行可打印字符数
     iCharsPerLine = GetDeviceCaps (pd.hDC, HORZRES ) / tm.tmAveCharWidth ;
     // 当前打印机每页打印高度 除以 字体的高度 得到 打印机每页可打印行数
     iLinesPerPage = GetDeviceCaps (pd.hDC, VERTRES ) / yChar ;
     // 计算得到需要打印的总页数 ( 取整 )
     iTotalPages   = (iTotalLines + iLinesPerPage - 1) / iLinesPerPage ;
 
     // 为准备打印的一行文本分配一个缓冲区
     pstrBuffer = malloc (sizeof (TCHAR) * (iCharsPerLine + 1)) ;
 
     // 使整个父窗口无效,不接受键盘和鼠标输入
     EnableWindow (hwnd, FALSE ) ;
    
     bSuccess     = TRUE ;
     bUserAbort   = FALSE ;
    
     // 创建 取消打印 非模态对话框
     hDlgPrint = CreateDialog (hInst, TEXT (" PrintDlgBox "),
                                hwnd, PrintDlgProc) ;
                              
     // 设置取消打印对话框中的 IDC_FILENAME 控件显示文本为打开的文件名及扩展名
     SetDlgItemText (hDlgPrint, IDC_FILENAME , szTitleName) ;

     /* 注册放弃打印程序。
       在处理 EndPage 呼叫时 , 亦即 , 在将 metafile 放入设备驱动程序并建立临时打印文件时 ,
       GDI 常常呼叫该 放弃打印程序 。 */
     SetAbortProc (pd.hDC, AbortProc ) ;
 
     // 取得父窗口标题栏文字
     GetWindowText (hwnd, szJobName, sizeof (szJobName)) ;
     // 存储到打印信息结构中,用于显示在打印队列中
     di.lpszDocName = szJobName ;
    
     if ( StartDoc (pd.hDC, &di) > 0)
     {
          for (iColCopy = 0 ;
                /* pd.Flags & PD_COLLATE
                  如果 副本逐份打印 复选框被选择 , 则循环打印实际设置的份数,
                  否则循环一次 , 内层循环中先将当前页打印需要的份数 , 再更新需打印的数据 .*/
               iColCopy < ((WORD) pd.Flags & PD_COLLATE ? pd.nCopies : 1) ;
               iColCopy++)
          {
               // 实现打印文件翻页,更新打印数据
               for (iPage = 0 ; iPage < iTotalPages ; iPage++)
               {
                    for (iNoiColCopy = 0 ;
                         /* pd.Flags & PD_COLLATE
                            如果 副本逐份打印 复选框被选择 , 则打印当前页 1 份;
                            否则将当前页打印实际设置的份数 , 再更新需打印的数据 .*/
                         iNoiColCopy < (pd.Flags & PD_COLLATE ? 1 : pd.nCopies);
                         iNoiColCopy++)
                     {
                         // 如果开始新的一页失败,则设置标记,跳出内层循环
                         if (StartPage (pd.hDC) < 0)
                         {
                              bSuccess = FALSE ;
                              break ;
                          }
                              //iLinesPerPage 为打印机每页可打印行数
                         for (iLine = 0 ; iLine < iLinesPerPage ; iLine++)
                         {
                              // 计算当前应该读取编辑控件中的第几行
                              iLineNum = iLinesPerPage * iPage + iLine ;
                             
                               // 如果读取超过了编辑控件中的文字行数 , 则跳出内层循环
                              if (iLineNum > iTotalLines)
                                   break ;
                                   
                               /*iCharsPerLine 为打印机每行可打印字符数 .
                                该语句是为后面发送 EM_GETLINE 消息做准备 ,
                                pstrBuffer 的第一个字节需要标明该缓冲区的大小 .*/
                              *(int *) pstrBuffer = iCharsPerLine ;
                             
                              // 读取编辑控件中一行的文字 , 发送到打印机设备中
                              TextOut (pd.hDC, 0, yChar * iLine, pstrBuffer,
                                       /* 向编辑控件发送 EM_GETLINE 行复制消息 ,
                                          将 iLineNum 行的文字复制到 pstrBuffer 缓冲区 ,
                                         要复制的字符数在 pstrBuffer 缓冲区的第一个字节中指明 ,
                                         返回值为行的字符长度 .*/
                                       (int) SendMessage (hwndEdit, EM_GETLINE ,
                                       (WPARAM) iLineNum, (LPARAM) pstrBuffer));
                          }
                         /* 结束当前的一页 . 如果失败,则设置标记,跳出内层循环
                           如果 放弃打印程序 的传回值是 FALSE ,则 EndPage 不会传回错误。
                           由于这个原因,在下一页开始之前,要直接测试 bUserAbort .*/
                         if ( EndPage (pd.hDC) < 0)
                         {
                              bSuccess = FALSE ;
                              break ;
                         }
                         // 如果用户点击 取消打印,则跳出内层循环 .
                         if (bUserAbort)
                               break ;
                    }
                    // 用户取消 或 打印指令错误 则跳出内层循环
                    if (!bSuccess || bUserAbort)
                         break ;
               }
               // 用户取消 或 打印指令错误 则跳出内层循环。从此跳出了所有打印循环
               if (!bSuccess || bUserAbort)
                    break ;
          }
     }
     else
          bSuccess = FALSE ;
    
     if (bSuccess)   // 如果打印指令在执行时一切正常,则进行 EndDoc 呼叫 .
          EndDoc (pd.hDC) ;
    
     if (!bUserAbort)  // 如果 AbortProc 消息检查完毕,证明打印指令执行结束
     {
           EnableWindow (hwnd, TRUE ) ;  // 使整个父窗口有效,重新接受键盘和鼠标输入
          DestroyWindow (hDlgPrint) ;     // 摧毁对话框
     }
    
     free (pstrBuffer) ;
     DeleteDC (pd.hDC) ;    // 删除打开的打印机设备句柄
 
     // 逻辑与 用户未取消打印并且打印指令未出错时,返回 TRUE
     return bSuccess && !bUserAbort ;
}
使用Win32 API构建桌面Windows应用文档 立即下载

相关推荐

TI毫米波雷达人体生命体征(呼吸、心跳)信号提取算法(IWR6843ISK+DCA1000EVM)

本篇内容介绍的算法主要为传统的提取算法,但可实现在1m内呈现良好的检测效果,能够提取出非常可观的呼吸和心跳波形,但在超出1m的距离后便不适用这个算法了。远距离检测呼吸和心跳始终是这个领域一个很大的挑战。要实现远距离检测可在提取相位信号、分离呼吸和心跳信号上进行改进处理,例如线性解调提取相位、改进的VMD分离呼吸和心跳算法。

m0_61934621的博客 3万+

打印的简单实现,以及更改打印设置

 void PrintTest(){         CPrintDialog dlg(FALSE, PD_ALLPAGES | PD_COLLATE | PD_NOPAGENUMS | PD_HIDEPRINTTOFILE);         if(dlg.GetDefaults())         {                  DEVMODE FAR *pDe

bluebohe的专栏 1901

手把手教你用OpenCV+Python实现HALCON级模板匹配(附工业案例代码)

本文详细介绍了如何利用开源计算机视觉库OpenCV和Python,构建媲美HALCON商业软件的工业级模板匹配解决方案。通过分析工业检测的核心挑战,文章提供了从模板预处理、多策略融合匹配到应对尺度与旋转的完整代码实现,并附有连接器引脚检测的实战案例,为工业自动化场景下的高精度视觉检测提供了低成本、高可控性的技术路径。

e3f4g5的博客 282

PRINTDLG

<br />typedef struct tagPD{<br />DWORD lStructSize;<br />HWND hwndOwner;<br />HGLOBAL hDevMode;<br />HGLOBAL hDevNames;<br />HDC hDC;<br />DWORD Flags;<br />WORD nFromPage;<br />WORD nToPage;<br />WORD nMinPage;<br />WORD nMaxPage;<br />WORD nCopies;<br />

tg5156的专栏 2941

避坑指南:DeepSeek Function calling流式输出中的常见问题与解决方案

本文深入探讨了在DeepSeek Function Calling中实现流式输出时常见的参数拼接、函数依赖管理和错误处理等核心挑战。针对流式响应中参数碎片化的问题,提供了健壮的参数拼接方案与状态管理策略。同时,文章详细阐述了如何管理函数调用顺序、处理条件性执行,并构建了分阶段的错误处理与重试机制,旨在帮助开发者构建稳定、高效的流式AI应用。

weixin_29062671的博客 202

visual studio 2017编译Triangle库遇到的问题和解决办法

这段时间因为一个项目需要使用到Triangle这个三角剖分工具,需要在windows环境下进行对源码编译,中间踩了很多坑,特此记录下。 1、下载 下载链接是下边这个,需要翻墙 http://www.cs.cmu.edu/~quake/triangle.html 2、编译。。超。。。级。。。麻。。。烦。。。 在ubutu下安装一切顺利,完全没遇到什么麻烦,但是换到windows下就麻烦不断...

csubai07的博客 2438

windows程序设计 「PopPad3」范例分析笔记

Open、Save、Find和Font通用对话框的使用。OPENFILENAME(Open) 、FINDREPLACE(Find & Replace) 、CHOOSEFONT(Font)结构简洁。

孤云出岫, 去留一无所系. 朗镜悬空,静躁两不相干. 3519

iTunes登录协议全解析:从抓包到签名验证(含HTTPDebugger避坑指南)

本文深入解析了iTunes登录协议的核心流程,包括sign-sap-setup-cert和sign-sap-setup-buffer等关键请求,并提供了使用HTTPDebugger等工具进行抓包分析时绕过反调试检测的实战技巧与避坑指南。文章详细拆解了PLIST编解码、请求签名验证机制及密码加密逻辑,为网络安全研究和协议逆向提供了完整的技术路径。

weixin_29224309的博客 330

如何使用cmd进入打印机选项_教你怎么使用打印机(api)

使用打印机为了处理文字和图形而使用视讯显示器时,设备无关的概念看来非常完美,但对于打印机,设备无关的概念又怎样呢?总的说来,效果也很好。在Windows程序中,用于视讯显示器的GDI函数一样可以在印表纸上打印文字和图形,在以前讨论的与设备无关的许多问题(多数都与平面显示的尺寸、分辨率以及颜色数有关)都可以用相同的方法解决。当然,一台打印机不像使用阴极射线管的显示器那么简单,它们使用的是印表纸。它们...

weixin_39719727的博客 2695

stop pin/ignore pin/exclude pin/float pin

stop pin、ignore pin、exclude pin、float pin的区别

m0_61544122的博客 7288

AI 测试工程师 — 6 个月学习计划表

AI 转型测试工程师 —— 6 个月学习计划表

weixin_46453070的博客 1067

11.3 公用对话框

摘录于《Windows程序(第5版,珍藏版).CHarles.Petzold 著》P425         Windows 最初发行时的主要目标之一就是提供一种标准化的用户界面。对于公用菜单项来说,这一目标实现得很快。几乎所有的软件制造商都采用了 Alt-File-Open 组合来打开文件。但是,真正用来打开文件的对话框却经常很不一样。         从 Windows 3.1 开始,这一问

wilim 1174

【DRAM存储器五十一】LPDDR5介绍--DFE与Pre-Emphasis

简述LPDDR5的DFE和预加重应用设置

highman110的博客 703

缓冲区与缓存(buffer与cache)

文章目录缓冲区与缓存(buffer与cache)1.缓冲区buffer缓存区的作用Python中的缓冲缓存区的类型2.缓存cache缓存的适用场景缓存的三种模式Python中的缓存 缓冲区与缓存(buffer与cache) 1.缓冲区buffer 缓冲区(buffer),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓...

兰枫 2590

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

windows程序设计POPPAD3的关键难点详解(二)

好了,我们继续,看下面的一段:

706

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Delphi控制打印机

1、          获取打印机状态信息   下面的代码可以判断所选打印机是否支持双面打印。如返回值为1,则表示支持双面打 印,返回值为0则表示不支持。 DeviceCapabilitiesA(Device,Port,DC_DVPLEX,nil,nil); 下面的代码可以获得一个打印机最多能复制的份数: DeviceCapabilitiesA(Device,Port,DC_COPIE

孤独剑的专栏 7896

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

CPrintDialog 构造函数参数详解

CPrintDialog 构造Windows打印或打印设置对话框(两者不同) 打印对话框 打印设置对话框 格式: CPrintD...

weixin_34092370的博客 318

GDI 映像方式 之 SetViewportOrgEx 与 SetWindowOrgEx 解析

SetViewportOrgEx 与 SetWindowOrgEx 解析

孤云出岫, 去留一无所系. 朗镜悬空,静躁两不相干. 4014

windows程序设计 之 「KeyView1」范例算法分析 笔记

按键消息与字符消息的读取

孤云出岫, 去留一无所系. 朗镜悬空,静躁两不相干. 2567

SDK 实作VS2010复制中文乱码修复

当复制VS2010中带有中文字符的代码到Office(Word, Excel, PowerPoint, Outlook)时,在中文字符后面会被添加一到三个乱码。比如复制"中文字符",粘贴到word就会变成(中D文?字Á?符¤?)。本文通过同时截取CF_UNICODETEXT和RTF两种剪贴板数据,以CF_UNICODETEXT中的正确数据为参照,对比剔除RTF中的乱码。程序添加了全局热键 CTRL+Q 和 监测状态。右下角则是一个动态文字Logo,鼠标移上去就会出现Logo,移开则改为快捷键说明

孤云出岫, 去留一无所系. 朗镜悬空,静躁两不相干. 2121

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

实作正弦波wave波形音频并播放。wave函数的调用方法:waveOutOpen ;waveOutPrepareHeader ;waveOutWrite ;waveOutReset ;waveOutClose ;waveOutUnprepareHeader 。

孤云出岫, 去留一无所系. 朗镜悬空,静躁两不相干. 2067
上一篇: windows程序设计之 「DevCaps2.C」范例分析 笔记
下一篇: Windows程序设计 BITBLT.C--STRETCH.C--BRICKS1.C--BRICKS2.C--BRICKS3.C 范例分析笔记
TypeCool
博客等级 码龄22年 58粉丝 93原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值