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. ConcurrentQueue对列的基本使用方式

    队列(Queue)代表了一个先进先出的对象集合.当您需要对各项进行先进先出的访问时,则使用队列.当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队. ConcurrentQueue< ...

  2. WCF入门教程系列二

    一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的 ...

  3. struts1:(Struts)ActionForm类及表单数据验证

    在Struts的中央控制器中写了Struts的控制器角色,在这篇介绍下Struts的视图!Struts的视图组件:Struts框架中的视图组件主要包括:JSP页面.ActionForm类.Struts ...

  4. mysql函数全解析

    本文摘自:http://www.cnblogs.com/cocos/archive/2011/05/06/2039469.html mysql函数大全 对于针对字符串位置的操作,第一个位置被标记为1. ...

  5. 火狐浏览器,hostadmin hosts文件访问权限不足

    开始->附件->以管理员身份运行. cacls %windir%\system32\drivers\etc\hosts /E /G Users:W

  6. android 控件的移动

    android 控件的移动 1. Java代码 imagebutton.setOnTouchListener(newOnTouchListener(){ int[]postion=newint[]{0 ...

  7. logstash grok 解析Nginx

    log_format main '$remote_addr [$time_local] "$request" ' '$request_body $status $body_byte ...

  8. COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)

    声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改而来,因此同样遵循Code Project Open L ...

  9. Cache 大致原理

    System.Web.Caching.Cache 根据CPU数量,每一个核心CPU有一个CacheSingle实例,CacheSingle有一个 CacheExpires属性然后CacheExpire ...

  10. 探索PHP+Nginx(二) 安装PHP

    首先,我们简单了解一下什么是PHP,PHP(Hypertext Preprocessor 超文本预处理器) 和Java语言一样,PHP也是属于高级语言,并不能直接在操作系统上运行.Java运行需要虚拟 ...