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. web前端中实现多标签页切换的效果

    在这里,实现多标签页效果的方法有两个,一个是基于DOM的,另一个是基于jquery的,此次我写的是一个对于一个电话套餐的不同,显示不同的标签页 方法一: 首先,我们要把页面的大体框架和样式写出来,ht ...

  2. Struts2中的校验框架

    Struts2提供的客户端校验 尽管这种支持比较弱,但采用Struts2中的客户端校验时需要注意以下几点 1..将<s:form validate="true">的va ...

  3. 从汇编看c++中含有虚基类对象的析构

    c++中,当继承结构中含有虚基类时,在构造对象时编译器会通过将一个标志位置1(表示调用虚基类构造函数),或者置0(表示不调用虚基类构造函数)来防止重复构造虚基类子对象.如下图菱形结构所示: 当构造类B ...

  4. MySql存储引擎介绍

    MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表.若要修改默认引擎,可以修改配置文件中的default-storage-engin ...

  5. CSS3弹性盒模型布局模块介绍

    来源:Robert’s talk原文:http://robertnyman.com/2010/12/02/css3-flexible-box-layout-module-aka-flex-box-in ...

  6. C语言做一个通讯录程序(在console里面运行)

    最近复习C语言的时候看到网上有个C语言通讯录的小项目,于是看了下那个程序实现的大概的功能,然后自己也跟着做了个.代码还算简洁,贴上来给有需要的人. // // main.m // AdressBook ...

  7. 远程访问TeamTalk的Mysql数据库被拒解决方法

    1.A Database Error Occurred 问题如图: 蓝狐给的解答是: 这是访问mysql出错了.解决办法参考:http://www.bkjia.com/jingyan/512248.h ...

  8. phalcon

    phalcon 代码内在sql 内用Ad去取数据库内的ad表. osx上没问题, centos报找不到表. 应该是centos上mysql区分大小写,可改写mysql的配置.

  9. js判断字符串中的英文和汉字

    有时需要判断一个字符是不是汉字,比如在用户输入含有中英文的内容时,需要判断是否超过规定长度就要用到.用 Javascript 判断通常有两种方法. 方法一 正则表达式,test()方法返回true 或 ...

  10. scheme代码高亮

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