`
dpr905ds
  • 浏览: 18977 次
社区版块
存档分类
最新评论

Windows SDK笔记-2

 
阅读更多

Windows SDK笔记-2
2011年04月25日
  Windows SDK笔记():模式对话框[/b]
  [b]
一、概述
  对话框是一种特殊的窗口,它依据对话框模板资源而建立。
  它与一般的窗口有些不同,很多过程由系统完成了,虽然用户还是要提供一个消息处理函数,但在此消息处理函数中,不需要将不关心的消息交由缺省消息处理函数。
  实际上,调用缺省处理的过程又系统完成。
  [/b][b]二、对话框消息处理函数
  对话框也需要用户提供一个消息处理函数,但这个处理函数没有普通窗口的消息处理函数"权利大"。
  对话框是一种系统定义的“窗口类”,它已经定义好了对应的消息处理函数。客户所作的消息处理函数,并不是直接与窗口连接,而是对对话框消息处理函数的一种补充,或者说“嵌入”。
  因此,对话框处理函数不需要调用“缺省消息处理函数”。
  当有消息被处理时,返回TRUE,没有消息需要处理时,返回FALSE,此时退出用户消息处理函数后,系统会去调缺省消息处理函数。
  //对话框消息处理函数
  //返回值类型为BOOL,与普通窗口处理函数不同。
  BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  {
  switch (message)
  {
  case WM_INITDIALOG :
  return TRUE ; //返回真,表示消息被处理了。
  case WM_COMMAND :
  switch (LOWORD (wParam))
  {
  case IDOK :
  case IDCANCEL :
  EndDialog (hDlg, 0) ; //使用EndDialog关闭对话框
  return TRUE ; //返回真,表示消息被处理了。
  }
  break ;
  }
  return FALSE ; ////返回假,表示消息未被用户处理,又缺省消息处理函数去处理。
  }
  [/b][b]三、模式对话框建立
  使用DialogBox。
  INT_PTR DialogBox(
  HINSTANCE hInstance,  // handle to module
  LPCTSTR lpTemplate,   // dialog box template
  HWND hWndParent,      // handle to owner window
  DLGPROC lpDialogFunc  // dialog box procedure
  );
  例:
  case WM_COMMAND:
  switch(LOWORD(wParam))
  {
  case ID_ABOUT:
  DialogBox (hinst, MAKEINTRESOURCE(IDD_ABOUT), hwnd, AboutDlgProc) ;
  break;
  }
  return 0;
  [/b][b]四、模式对话框与程序的交互
  模式对话框中,可以对程序中的数据进行更改。
  结束对话框时,在EndDialog第二个参数中传入退出参数
  这个参数将被DialogBox作为返回值,然后对话框的用户根据此返回值作相应的操作。
  1.初始化
  对话框消息处理函数中,在接到WM_INITDIALOG消息时,作一些初始化工作。
  如从全局变量读取初始值来设置各控件状态。
  2.退出时
  若退出时,更改需要生效,(如按了“确定”),则根据控件状态设置全局变量,并相应的在EndDialg中使用一个表示成功的值(如TRUE)。
  若更改不需要生效(如按了“取消”),则不保存结果,并相应的在EndDialg中使用一个表示取消的值(如FALSE)。
  3.对话框用户作出反应
  根据DialogBox的返回值不同,而进行不同的操作
  如,返回TRUE时,重绘窗口:
  if (DialogBox (hInstance, TEXT ("AboutBox"), hwnd, AboutDlgProc))
  InvalidateRect (hwnd, NULL, TRUE) ;
  Windows SDK笔记():非模式对话框[/b]
  [b]
一、概述
  使用DialgBox建立的对话框是“模式对话框”,只有关闭对话框后,程序的其他窗口才能进行操作。
  与此相对应,存在“非模式对话框”,对话框建立后,并不强制要求用户立即反应,而是与其他窗口同时接受用户操作。
  [/b][b]二、建立
  非模式对话框使用CreateDialg建立。
  可以在WinMain中建立主窗口后建立,对话框句柄保存备用。
  hDlgModeless = CreateDialog (
  hInstance,
  TEXT ("ColorScrDlg"),  //对话框模板
  hwnd,
  ColorScrDlg        //对话框消息处理函数
  );
  [/b][b]三、消息循环添加针对非模式对话框的处理
  “非模式对话框”与“模式对话框”不同,模式对话框工作的时候,有其内部的消息泵机制。
  而非模式对话框则象普通窗口一样,由WinMain中书写的消息循环驱动。
  但由于是对话框,它对一些消息有特殊的处理,例如用于在对话框中各子控件间导航的"TAB"键、"ENTER"键等等。
  因此,在消息循环中,需要先给对话框提供截获消息的机会。
  while (GetMessage (&msg, NULL, 0, 0))
  {
  if (hDlgModeless == 0 || !IsDialogMessage (hDlgModeless, &msg))
  {
  TranslateMessage (&msg) ;
  DispatchMessage  (&msg) ;
  }
  }
  如果当前取得的消息是对话框消息的话,IsDialgMessage将它交由对话消息处理函数处理,并返回TRUE。
  不需要在派发了。
  [/b][b]四、非模式对话框的销毁
  使用:
  DestroyWindow (hDlg);
  用户关闭对话框时,对话框消息处理函数将收到WM_CLOSE消息,接到后调用DestroyWindow以销毁非模式对话框。
  Windows SDK笔记():使用对话框资源建立窗口[/b]
  [b]

  [/b][b]一、概述
  在Charles Petzold的书中,介绍了一种直接利用对话框资源建立主窗口的方法。
  使用这种方法,可以方便的在主窗口中安排子控件,而代码的其他部分跟用普通窗口时一样。
  我们知道,对话框是系统预先定义的“窗口类”,它有自己的窗口处理函数,我们自己写的对话框消息处理函数并不是真正的窗口消息处理函数。
  但我们可以在对话框模板脚本中,指定这个对话框使用我们自己定义的窗口类,而不是系统的对话框类,这样,就将对话框的消息处理函数“嫁接”成我们自己定义的消息处理函数了。
  [/b][b]二、书写一个“真正的”窗口消息处理函数
  按照普通窗口的方式书写好消息处理函数。
  (不要漏掉了DefWindowProc)
  [/b][b]三、注册窗口类
  用书写的消息处理函数注册一个窗口类。
  [/b][b]四、建立对话框资源,指定窗口类为自定的窗口类。
  手工书写一个对话框资源,存为单独文件,然后包含到资源文件中去。
  (使用菜单View->Resource Includes弹出对话框,将文件名填入到Compile-time derective一栏,这将在rc文件中添加一行:"#include ""Some.dlg"" ")
  例:
  建立文件Some.dlg
  书写:
  HexCalc DIALOG -1, -1, 102, 122
  STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
  CLASS "HexCalc"    //填写上自己注册的类名称
  CAPTION "Hex Calculator"
  {
  PUSHBUTTON "D",       68,  8,  24, 14, 14
  PUSHBUTTON "A",       65,  8,  40, 14, 14
  //各种控件
  }
  [/b][b]五、使用非模式对话框方式建立主窗口
  建立主窗口的时候,使用CreateDialog。
  hwnd = CreateDialog (
  hInstance,
  szAppName,    //对话框模板
  0,
  NULL) ;
  ShowWindow (hwnd, iCmdShow) ;
  其他各部分,都与普通窗口时相同(注册窗口类、消息循环等)。
  Ⅱ.在对话框中建立自定义子窗口可以自己定义控件,然后在对话框模板中使用
  [/b][b]一、定义"窗口类"与消息处理函数
  在WinMain中
  除了注册主窗口类外,
  另外注册用于对话框的类,指明类对应的消息处理函数
  wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  wndclass.lpfnWndProc   = SomeWndProc ;  //对应的消息处理函数
  wndclass.cbClsExtra    = 0 ;
  wndclass.cbWndExtra    = 0 ;
  wndclass.hInstance     = hInstance ;
  wndclass.hIcon         = NULL ;
  wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
  wndclass.lpszMenuName  = NULL ;
  wndclass.lpszClassName = TEXT ("SomeControl") ;
  ReGISterClass (&wndclass) ;
  同时,还要书写好消息处理函数SomeWndProc。
  [/b][b]二、在对话框模板中添加自定义控件窗口
  在对话框模板上放上"Custom Control",然后设置属性,并填写自己定义的类名称SomeControl。
分享到:
评论

相关推荐

    Windows SDK笔记

    ### Windows SDK笔记详解 在本篇文章中,我们将深入探讨Windows SDK中的几个核心概念与实践技巧,包括窗口类的定义、窗口的创建、消息处理函数的编写以及消息循环的理解与实现。 #### 一、窗口类的定义 在Windows...

    Windows SDK笔记(一):Windows程序基本结构

    根据给定的信息,本文将详细解释“Windows SDK笔记(一):Windows程序基本结构”中的关键知识点,包括Windows程序的基本结构、如何使用Windows SDK编写简单的应用程序等。 ### Windows程序基本结构概述 Windows程序...

    小甲鱼 WindowsSDK编程学习笔记

    Windows SDK(Software Development Kit)即软件开发工具包,它提供了一套API(应用程序编程接口)供开发者使用,以便创建Windows应用程序。学习Windows SDK编程首先需要掌握基础的程序结构和函数调用方式。 #### 2...

    Windows Media Player SDK学习笔记

    ### Windows Media Player SDK 学习笔记 #### 一、引言 Windows Media Player SDK 是一套由微软提供的开发工具,用于创建基于 Windows Media Player 的应用程序。它允许开发者利用 Windows Media Player 的强大...

    directshow_SDK开发笔记(翻译)

    4. **开发笔记**:《directshow_SDK开发笔记(翻译).pdf》很可能是对原版英文文档的详细翻译,涵盖了DirectShow SDK的使用方法、API调用、示例代码等内容。这些笔记对于初学者来说是宝贵的资源,它们通常会以更易于...

    Intel Media SDK 环境搭建笔记

    Intel Media SDK 环境搭建笔记 Intel Media SDK 环境搭建笔记为客户端搭建 Intel Media SDK 环境在 VS2015 中的详细步骤,包括环境配置、软件下载、源码解压缩、库文件编译和错误解决等。 环境配置 本机环境为 ...

    阿里云javasdk源码-best-windows-apps:Recommendeasytouse,excellentWindowsappli

    0、网易云笔记,WPS,Github, Coding, ProcessOn,MindLine(付费),ShowDoc(即将弃用) 1、MarkdownPad 全能 Markdown 编辑器() 在Win10下会出现崩溃,为了修复此问题,需要下载Awesomium 1.6.6 SDK.()。具体方法大家可以...

    Directshow_SDK笔记

    - **VideoInfo2 Format Type**: VideoInfo2 格式的详细解析。 - **手动添加滤镜**: 如何手动添加滤镜到 Filter Graph,并正确地配置它们。 通过以上总结,可以清晰地了解到 DirectShow 的基础知识、核心概念、应用...

    Windows Media Player SDK学习笔记.docx

    Windows Media Player SDK 是一个用于开发与Windows Media Player集成的应用程序的工具包,它允许程序员通过编程方式控制媒体播放器的各种功能。SDK 提供了丰富的属性、方法和事件,以便开发者能创建自定义的媒体...

    WindowsSDK:Windows SDK,用于使用Clang交叉编译到Windows

    Windows交叉编译工具链的Windows SDK...从17763.132.181022-1834.rs5_release_svc_prod1_WindowsSDK.iso提取。 笔记: 删除了对静态链接调试的支持,并发布了通用CRT库,因为它使SDK二进制文件的大小减少了50%以上。

    directshow_SDK开发笔记

    DirectShow SDK 开发笔记主要涉及了使用DirectShow进行多媒体处理的相关知识。DirectShow是微软提供的一个用于Windows平台的流媒体处理开发工具包,通常与DirectX一同发布。它支持多种媒体格式,包括ASF、MPEG、AVI...

    DSHOW SDK 学习笔记

    ### DSHOW SDK 学习笔记知识点汇总 #### 绪言 - **DirectShow SDK简介**:DirectShow是Microsoft Windows操作系统中的一个组件,主要用于媒体文件的播放、捕获、压缩等功能。它采用一种灵活且可扩展的架构来处理...

    nrf51822 sdk12.2空中升级笔记

    gcc for arm 的版本需要和 nRF5_SDK_12.2.0_f012efa\components\toolchain\gcc\Makefile.windows 中的版本相符。MinGW 的安装需要点击链接下载安装,默认安装几个选项就可以了。 三、编译 micro-ecc 库文件 micro-...

    新版Android开发教程&笔记三--环境搭建与解析 .pdf

    ### 新版Android开发教程&笔记三--环境搭建与解析 #### 一、Android开发环境概述 在本章节中,我们将详细介绍如何搭建一个完整的Android开发环境。对于初学者来说,掌握正确的环境搭建步骤至关重要,它不仅能帮助...

    DirectShow SDK 开发笔记

    ### DirectShow SDK 开发知识点详解 #### 一、DirectShow概览 DirectShow是微软推出的一款强大且灵活的媒体框架,旨在为Windows平台上的多媒体应用提供流媒体处理能力。它是DirectX开发包的一部分,主要专注于视频...

    DirectShow SDK学习笔记

    ### DirectShow SDK 学习笔记知识点汇总 #### 一、DirectShow基础 **1.1 设置DSHOW的开发环境** DirectShow是Microsoft提供的一套多媒体框架,主要用于Windows平台上的音视频处理。为了能够进行DirectShow的开发...

    52832 SDK15 DFU升级笔记

    ### 52832 SDK15 DFU升级笔记 #### 概述 本文档旨在为使用nRF52832芯片进行安全固件升级(Secure DFU)的开发者提供一个详细的步骤指南。该指南基于nRF5_SDK_15.0.0_a53641a版本,适用于在Windows 7 64位操作系统...

    游戏开发学习笔记-6.输入控制

    iOS和Android提供了各自的SDK,用于处理这些触摸事件。 最后,跨平台的游戏开发需要注意不同平台的输入差异。例如,键盘布局、鼠标行为和游戏手柄的映射在不同系统间可能存在差异,需要适配处理。 通过以上介绍,...

Global site tag (gtag.js) - Google Analytics