`

噢,我的第一个基于SDK的窗口(续)

阅读更多

        首先,我要自我检讨一下,在学习的过程对于细节问题没有足够的重视,以致于忽视了问题产生的根源,同时也对自己解决问题的方法感到惭愧。期待自己能够尽快改正这些缺点,取得更大的进步。
        我想,通常一个问题存在的原因不仅仅是单个方面的,它有可能是多个因素共同影响产生的结果。在面对问题的时候,应该冷静下来列举出导致问题发生的几种可能性,接着逐个排除,如果可能性都排除之后,就接着再列举可能性,如此反复,直至发现根本原因为止。
        举一个最近的例子吧,今天大半天的时间都在学习如何利用Windows SDK的API去创建一个窗口,遇到了不少的问题,最后需要解决的就是在点击了关闭按钮之后,窗口消失了但是进程中仍然存在该应用程序的问题。上一篇blog中给出了解答,而这个解答对于那篇blog中的代码而言是正确的,因为那里的代码是第二个版本。然而,这个解答对于我的第一个版本的代码是不起作用的,大家可以先看一下第一个版本代码的关键部分:

for (;;)
{
 
if  (PeekMessage( & msg,hwnd, 0 , 0 ,PM_REMOVE))
    

       
if  (msg.message  ==  WM_QUIT)
           
break ;   
    TranslateMessage(
& msg);  
    DispatchMessage(
& msg);
    }
 
}


在这样消息处理的基础上,虽然我在处理消息的回调函数中,增加了处理WM_DESTROY消息的代码,仍然是没有将问题解决的。当时我查阅了很多资料,都没有找到答案,后来找到了一个与自己代码十分相近的例子,然后在其基础上进行修改,结果就成为了我的第二版本的代码。而第二版本的代码则是可以工作得很好。尽管我写下了创建一个基于SDK窗口的体会,但是这个问题依然让我觉得如梗在喉。由于两个版本的代码在结构上都是类似的,我几乎找不到代码的问题出在哪里。最后只能祭出每行代码对比的法宝了,真丢脸啊!还好代码比较短,我很快就发现了差别所在,问题的所在。
        问题就出在PeekMessage函数的第二个参数上。第一个版本是hwnd,就是被创建的窗体的句柄,而第二个版本则是NULL。这个参数如果指定了某个窗口的句柄,函数就只会在消息队列中取出发送至该句柄对应的窗体的消息,如果指定为NULL,则没有这个限制。当发现了这个差别之后,问题的原因也就很明显了。如果是在其他的消息处理过程中,两者的区别并不大,但是如果在点击了关闭按钮之后, 在DestroyWindow函数被调用了之后,窗口句柄hwnd就不复存在了。如果PeekMessage函数指定了窗口句柄,又如何能够得到由DestroyWindow方法发送至消息队列的WM_DESTROY消息呢?因此,只有将第二个参数设为NULL,才能得到WM_DESTROY消息并在回调函数中进行处理了。
        最后回头总结一下,其实自己在看API的时候,也有注意到PeekMessage方法的参数,却没有放在心上,以致于在解决问题的时候出此下策,真是惭愧啊!Anyway,问题解决了,就是好事。我会继续努力的,不仅是技术积累,更加重要的是思维方式的提高。

分享到:
评论

相关推荐

    《白手起家Win32SDK应用程序》第四篇 注册一个窗口类

    **第一步:填写“申请表”** 为了创建一个窗口,我们需要首先定义一个窗口类。在Win32 SDK中,窗口类的信息通常存储在一个名为`WNDCLASSEX`的结构体中。 1. **定义结构体**:`WNDCLASSEX`是一个包含了12个成员变量...

    一个基于win sdk 的截图 静态链接库

    在这个项目中,我们关注的是一个特别的组件——一个基于Windows SDK的截图静态链接库。 静态链接库(Static Link Library)是编程中的一种资源,它包含了可重用代码,这些代码在编译时会被整合到最终的可执行文件中...

    C++ MFC SDK实现透明窗口的功能

    在IT领域,C++ MFC(Microsoft Foundation Classes)是一个基于Windows平台的应用程序开发框架,它为开发者提供了构建桌面应用程序的强大工具。MFC SDK(Software Development Kit)是微软提供的开发库,包含了开发...

    WinSdk电子书集合

    5. **Windows编程基础**:对于初学者,电子书中会介绍如何设置开发环境,创建第一个Windows程序,以及基本的编程概念,如事件处理和线程管理。 6. **调试和测试工具**:Windows SDK还包括一系列的调试和测试工具,...

    《白手起家Win32SDK应用程序》第六篇 显示你创建的窗口

    "这是我的第一个窗口", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, 0, 400, 400, NULL, NULL, hinstance, NULL); if (!hWnd) return 0; ShowWindow(hWnd, ncmdshow); // 显示窗口 return 0; ...

    基于Qt和海康SDK的监控demo,实现预览、回放、抓图和布防报警,C++实现

    总之,这个基于Qt和海康SDK的监控demo是一个全面的实践项目,涵盖了从基础的GUI设计到复杂的音视频处理和设备控制等多个方面的技能,对于提升C++和音视频开发能力非常有帮助。对于想要开发类似应用的人来说,这是一...

    windows sdk 编程例题

    3. **窗口类和窗口实例**: 创建Windows应用程序的第一步是定义窗口类,包括窗口样式、回调函数等。然后创建窗口实例,这个过程涉及CreateWindowEx函数。 4. **消息循环和消息处理**: 消息循环是Windows程序的基石,...

    俄罗斯方块SDK源码

    在这个案例中,俄罗斯方块SDK提供了一套用于开发基于C语言的俄罗斯方块游戏的工具和资源,使得开发者可以更方便地实现游戏逻辑,而无需从头构建底层架构。 纯C语言的实现意味着该SDK具有高度的跨平台潜力,因为...

    SDK画图程序

    SDK画图程序是一种基于C语言开发的图形用户界面应用程序,它允许开发者利用软件开发工具包(SDK)来创建和编辑图形。在这个特定的程序中,SDK主要被用来提供底层的图形绘制功能,使得程序员可以控制像素级别的细节,...

    windowsSDK编程mp3播放器

    总结,开发一个基于Windows SDK的MP3播放器涵盖了音频编码解码、音量控制、播放进度管理、用户界面设计等多个方面,需要深入理解和应用Windows API及相关多媒体技术。在实际开发过程中,不断学习和优化,确保代码的...

    S32K3 IDE&SDK.pdf

    然后选择S32DS开发工具,接着在页面中选择第一个平台分区,并在下拉菜单中选择V3.4版本进行下载。文档还提供了下载编译器激活码的链接以及百度网盘的下载链接和提取码。在安装过程中,用户需要根据指引下载并安装IDE...

    windows sdk api写的ide

    构建一个基于Windows SDK API的IDE,首先需要考虑的基本组件包括: 1. **编辑器**:这是IDE的核心部分,负责代码的输入和编辑。可以使用RichEdit控件或者自定义文本编辑器实现,同时需要支持语法高亮、自动完成等...

    wwsdk 旺旺SDK二次开发包

    1. **API接口**:旺旺SDK提供了一系列的API接口,这些接口允许开发者调用旺旺的功能,如发送文本、图片、文件消息,以及接收消息、管理会话、获取用户信息等。通过这些API,开发者可以自定义旺旺在应用中的展现形式...

    Android_SDK_Windows安装简单教程

    对于开发者来说,掌握如何在Windows环境下安装Android SDK(Software Development Kit)是进行Android应用开发的第一步。本文将详细介绍如何在Windows系统下安装配置Android SDK及相关开发工具。 #### 二、准备工作...

    《白手起家Win32SDK应用程序》第五篇

    "这是我的第一个窗口", // 窗口标题 WS_OVERLAPPEDWINDOW, // 窗口样式 0, 0, // 初始位置 400, 400, // 初始大小 NULL, // 父窗口句柄 NULL, // 菜单句柄 hinstance, // 应用程序实例句柄 NULL); // 额外...

    nwjs-0.35.1版本 sdk

    在标题中提到的"nwjs-0.35.1版本 sdk",是指nw.js的一个特定发行版本,0.35.1。SDK(Software Development Kit)通常包含了开发者需要的所有工具和资源,如头文件、库、示例代码和文档,以便于进行应用程序开发。...

    WinSDK编程入门

    通过这个电子书,你可以逐步学习如何设置开发环境,创建第一个Windows应用程序,理解消息循环和消息处理,以及如何利用Win32 API实现更复杂的功能。 总的来说,WinSDK编程需要对操作系统底层工作原理有基本的理解,...

    VS2022 SDK CreateDialog非模态对话框做启动窗口 适用于简单程序的模板 自用

    创建非模态对话框的第一步是创建一个新的项目。在Visual Studio中,选择“文件”>“新建”>“项目”,然后选择“Visual C#”或“Visual Basic”下的“Windows Desktop”类别,找到“WinForms应用程序”模板,为你的...

Global site tag (gtag.js) - Google Analytics