1.SetWindowLong和GetWindowLong

函数原型:

LONG SetWindowLong(
__in HWND hWnd,
__in int nIndex,
__in LONG dwNewLong
); LONG GetWindowLong(
__in HWND hWnd,
__in int nIndex
);

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

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

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

(1)定义结构体

typedef struct
{
WORD dlgVer;
WORD signature;
DWORD helpID;
DWORD exStyle;
DWORD style;
WORD cDlgItems;
short x;
short y;
short cx;
short cy;
} DLGTEMPLATEEX; typedef struct tag_dlghdr
{
HWND hwndTab;
HWND hwndDisplay;
RECT rcDisplay;
DLGTEMPLATEEX *apRes[C_PAGES];
} DLGHDR;

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

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

其中hwndDlg是主窗口的句柄

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

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

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

2.获取自定义的资源

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

DLGTEMPLATEEX* WINAPI DoLockDlgRes(LPCTSTR lpszResName)
{
HRSRC hrsrc = FindResource(NULL,lpszResName,RT_DIALOG);
HGLOBAL hglb = LoadResource(g_hInst,hrsrc) ;
return (DLGTEMPLATEEX *)LockResource(hglb);
}

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

使用

(DLGTEMPLATE *)LockResource(hglb);

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

HWND CreateDialogIndirect(
__in HINSTANCE hInstance,
__in LPCDLGTEMPLATE lpTemplate,
__in HWND hWndParent,
__in DLGPROC lpDialogFunc
);

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

typedef struct
{
WORD dlgVer;
WORD signature;
DWORD helpID;
DWORD exStyle;
DWORD style;
WORD cDlgItems;
short x;
short y;
short cx;
short cy;
} DLGTEMPLATEEX;

此时使用

return (DLGTEMPLATEEX *)LockResource(hglb);

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

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. hdu1754 基础线段树

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. vb.net中存储过程的使用

    在机房收费系统过程中,试着使用了存储过程,离之前数据库的学习已经有些日子了.之前对于存储过程的了解也是听过而已,非常不清楚.因此,写这篇博客! 专业概念:存储过程是一个SQL语句和控制结构的集合,创建 ...

  3. 纯js实现积木(div)拖动效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 超大文件上传到Azure Linux虚拟机最佳实践

    客户在实际进行迁移的时候,往往碰到需要将本地数据中心的超大文件,比如单个200GB的文件,或者总共1TB的无数文件上传到Azure上的情况,尤其是传到Azure的Linux虚拟机的场景,这种场景包括: ...

  5. c#实现生产者消费者模式

    ;            }            Environment.ExitCode = result;        }    }}

  6. 使用TypeScript实现简单的HTML5贪吃蛇游戏

    TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构师,已 ...

  7. jQuery 序列化表单数据 serialize() serializeArray()

    1.serialize()方法 格式:var data = $("form").serialize(); 功能:将表单内容序列化成一个字符串. 这样在ajax提交表单数据时,就不用 ...

  8. C语言随笔_fopen

    有同学问我,以下代码会输出“===”,为什么呀? if( (fp = fopen("data.dat","r"))==NULL){ printf("= ...

  9. Google API v3 设置Icon问题处理

    1.查看API实现 //虽然比较符合API实现的思想但这个没法; //会产生Uncaught TypeError: undefined is not a function //google API n ...

  10. LeeCode-Same Tree

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...