1.SetWindowLong和GetWindowLong

函数原型:

  1. LONG SetWindowLong(
  2. __in HWND hWnd,
  3. __in int nIndex,
  4. __in LONG dwNewLong
  5. );
  6.  
  7. LONG GetWindowLong(
  8. __in HWND hWnd,
  9. __in int nIndex
  10. );

这两个函数用于改变和获取窗口属性的功能。 其中参数nIndex中有很多种选择值,其中

GWL_USERDATA可以在不同窗口中共享数据。

例如:在创建Tab Control时,每个选项页中嵌入的对话框句柄可以保存到父对话框中

(1)定义结构体

  1. typedef struct
  2. {
  3. WORD dlgVer;
  4. WORD signature;
  5. DWORD helpID;
  6. DWORD exStyle;
  7. DWORD style;
  8. WORD cDlgItems;
  9. short x;
  10. short y;
  11. short cx;
  12. short cy;
  13. } DLGTEMPLATEEX;
  14.  
  15. typedef struct tag_dlghdr
  16. {
  17. HWND hwndTab;
  18. HWND hwndDisplay;
  19. RECT rcDisplay;
  20. DLGTEMPLATEEX *apRes[C_PAGES];
  21. } DLGHDR;

(2)在主窗口的初始化中

  1. DLGHDR *pHdr = (DLGHDR *)LocalAlloc(LPTR,sizeof(DLGHDR));
  2. SetWindowLong(hwndDlg,GWL_USERDATA,(LONG)pHdr);

其中hwndDlg是主窗口的句柄

(3)创建好Tab Control后,处理TCN_SELCHANGE消息

  1. VOID WINAPI OnSelChanged(HWND hwndDlg)
  2. {
  3. DLGHDR *pHdr = (DLGHDR *)GetWindowLong(hwndDlg,GWL_USERDATA);
  4. int iSel = TabCtrl_GetCurSel(pHdr->hwndTab);
  5.  
  6. //Destroy the current child dialog box,if any.
  7. //如果已经创建子对话框时
  8. if(pHdr->hwndDisplay != NULL)
  9. DestroyWindow(pHdr->hwndDisplay);
  10.  
  11. //Create the new child dialog box.
  12. pHdr->hwndDisplay = CreateDialogIndirect(g_hInst,(LPCDLGTEMPLATE)pHdr->apRes[iSel],hwndDlg,ChildDialogProc);
  13. }

可以获得每个选项页对应的对话框的信息。

2.获取自定义的资源

在资源管理器中定义好了对话框模板,如要果获得这个资源,可以使用FindResource和LoadResource

  1. DLGTEMPLATEEX* WINAPI DoLockDlgRes(LPCTSTR lpszResName)
  2. {
  3. HRSRC hrsrc = FindResource(NULL,lpszResName,RT_DIALOG);
  4. HGLOBAL hglb = LoadResource(g_hInst,hrsrc) ;
  5. return (DLGTEMPLATEEX *)LockResource(hglb);
  6. }

很多MSDN教程中,LockResource获得指针往往转换成DLGTEMPLATE指针,如果对话框模板为DIALOGEX,如下图

使用

  1. (DLGTEMPLATE *)LockResource(hglb);

很多数据是获取不到的,像窗体的长度和宽度,然后使用CreateDialogIndirect类似函数来创建对话框是不会达到你想要效果

  1. HWND CreateDialogIndirect(
  2. __in HINSTANCE hInstance,
  3. __in LPCDLGTEMPLATE lpTemplate,
  4. __in HWND hWndParent,
  5. __in DLGPROC lpDialogFunc
  6. );

解决办法是,定义DLGTEMPLATEEX结构(参考MFC类库)

  1. typedef struct
  2. {
  3. WORD dlgVer;
  4. WORD signature;
  5. DWORD helpID;
  6. DWORD exStyle;
  7. DWORD style;
  8. WORD cDlgItems;
  9. short x;
  10. short y;
  11. short cx;
  12. short cy;
  13. } DLGTEMPLATEEX;

此时使用

  1. return (DLGTEMPLATEEX *)LockResource(hglb);

可以获得想要的数据,然后使用CreatDialogIndirect函数就可以创建对话框了。

  1. pHdr->hwndDisplay = CreateDialogIndirect(g_hInst,(LPCDLGTEMPLATE)pHdr->apRes[iSel],hwndDlg,ChildDialogProc);

以上所有代码参考:http://msdn.microsoft.com/zh-cn/library/hh298366(v=VS.85).aspx

WindowsAPI一日一练的更多相关文章

  1. WindowsAPI每日一练(2) 使用应用程序句柄

    WindowsAPI每日一练系列 :https://www.cnblogs.com/LexMoon/category/1246238.html WindowsAPI每日一练() WinMain Win ...

  2. WindowsAPI每日一练(1) MessageBoxA

    WindowsAPI每日一练系列 :https://www.cnblogs.com/LexMoon/category/1246238.html WindowsAPI每日一练(1) WinMain 要跟 ...

  3. Halcon一日一练:读取文件目录图像的三种方法

    第一种方法: 读了一个单一图像: read_image(Image,'fabrik') 这种方式可以快速的读取软件自身携带的库图像文件,系统设定了库图像映像文件的快速读取方式,我们也可以通过绝对地址的 ...

  4. Windows API一日一练(55)FlushFileBuffers和SetFilePointer函数

    在PC硬件体系结构里,速度最快的存储器是CPU里面的寄存器,接着到二级缓存,再到系统RAM内存,最后才到硬盘.因为这种体系结构,就决定了操作系统对文件的操作方式,或者说是最优化的算法.比方操作系统接收 ...

  5. Python一日一练05----怒刷点击量

    功能 自己主动获取CSDN文章列表,并对每篇文章添加点击量. 源代码 import urllib.request import re import time import random from bs ...

  6. Halcon一日一练:创建三通道图像

    首先理解一个什么是三通道图像: 三通道图像就是彩色图像,我们之前黑白相机或黑白电视机都是彩用的灰阶图像,即单通道图像,一般是2的8次方个灰阶,即256个灰阶.彩色图像采用RGB,红绿蓝三个通道来合成彩 ...

  7. Halcon一日一练:Halcon异常判断方法

    1.TryCatch tryCatch处理的方式如下: try *可能会出现错误的语句 .... catch(Exception) *获取错误代码 ErrorCode:=Exception[] **对 ...

  8. Halcon一日一练:图像、变量实时更新

    某些场合,我们需要刷新图像来识别图像处理过程的差异性,便于调试判断问题和预测.Halcon提供了图像刷新操作,这些操作不会改变程序的最终处理结果. 例程: **实时刷新图像 dev_update_wi ...

  9. Halcon一日一练:图像分辨率与像素

    1.图像像素: 像素是指由图像的小方格即所谓的像素(pixel)组成的,这些小方块都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置就决定该图像所呈现出来的样子.像素是构成图像的基本单元 ...

随机推荐

  1. CSS 设计彻底研究(三)深入理解盒子模型

    第三章 深入理解盒子模型 盒子模型是CSS控制页面的基础.需要清楚“盒子”的含义是什么,以及盒子的组成.此外,应该理解DOM的基本概念,以及DOM树是如何与一个HTML文档对应的,在此基础上充分理解“ ...

  2. C++ 语言特性的性能分析

    转载:http://www.cnblogs.com/rollenholt/archive/2012/05/07/2487244.html      大多数开发人员通常都有这个观点,即汇编语言和 C 语 ...

  3. 【solr专题之四】关于VelocityResponseWriter

    一.关于Velocity的基本配置 在Solr中,可以以多种方式返回搜索结果,如单纯的文本回复(XML.JSON.CSV等),也可以返回velocity,js等格式.而VelocityResponse ...

  4. JVM学习积累

    1. Java代码编译和执行的整个过程包含了三个重要的机制: Java源码编译机制 类加载机制 类执行机制 2. 关于Java源码编译机制 Java源码编译由以下三个过程组成: 分析和输入符号表 注解 ...

  5. regular expression 基本语法

    正则检测网址: http://regexpal.isbadguy.com/   (不包含界定符)   或  http://tool.chinaz.com/regex unicode转换工具 : htt ...

  6. python之3内置容器

    所谓内置容器,就是不需要第三方模块,就可以使用的. 1.list容器,一个有序序列,类似于数组,但比数组强大很多 1.1.如何初始化list,直接一个[]即可,这是一个空的list >>& ...

  7. Python变量和数据类型

    十六进制用0x前缀和0-9 a-f表示   字符串是以''或""括起来的任意文本   一个布尔值只有True和False两种值   布尔值可以用and or not运算   空值是 ...

  8. scheme代码高亮

    (defun iedit-symbol-in-defun () "Enter `iedit-mode' to rename the symbol in current function, o ...

  9. GitHub好站点

    https://github.com/XingCloud/stream_processor

  10. 互斥体与互锁 <第五篇>

    互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)).互斥体禁止多个线程同时进入受保护的代码“临界区”.因此,在任意时刻,只有一个线程被允许进入这 ...