WindowsAPI一日一练

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

时间: 2024-10-04 09:17:10

WindowsAPI一日一练的相关文章

【C++】【一日一练】读写文件小实例【20140510】

需要反省,说好一日一练的,昨天周五就偷懒出去逛了逛...吾当一日三省吾身... 今天的练习是写一个小程序,需要用到文件的读写,不过越写越长,又用到了很多乱七八糟的内置类什么的,就当是复习了吧,大概涉及到以下几个知识: enum fstream stringstream vector 渣程序如下: #include <iostream> #include <fstream> #include <string> #include <sstream> // str

Python一日一练102----创建简易博客(下)

继续改博客 接着上一篇继续改咱的博客. 母语不是英语肿么办,博客上面英语好多啊! 更改很简单. 你可以做一个快速更改来观察Django管理工具是否被翻译成你想要的语言. 仅需在settings.py添加'django.middleware.locale.LocaleMiddleware' 到MIDDLEWARE_CLASSES设置中,并确保它在'django.contrib.sessions.middleware.SessionMiddleware'之后就可以了. 建立博客的前台部分 创建模版

【C++】【一日一练】通过友元访问或改变类的私有成员【20140508】

题目来源:Beginners Lab Assignments Code Examples Accessing Private Data Members in C++. This is a flaw in the language /* **Description: Accessing Private Data Members in C++ **Date:2014-05-08 **Author:xyq */ #include <iostream> #include <string>

WindowsAPI每日一练(1) MessageBoxA

WindowsAPI每日一练系列 :https://www.cnblogs.com/LexMoon/category/1246238.html WindowsAPI每日一练(1) WinMain 要跟计算机进行交互,就需要计算机显示信息给人看到,或者发出声音给人听到,然后人看到或听到相应的信息后,再输入其它信息给计算机,这样就可以让计算机进行数据处理,把结果显示给我们.现在就来编写一个最简单的Windows应用程序,让它提示一行文字给我们看到,这就是简单的目标. 1 #include <wind

一日一练-JS rem布局在webview 中错乱

子曰:在实践中学习 今天测试同事说,app 中的h5 页面在Mate Pro 10 中出现错误,不能够占满全屏,只占据了90% 的宽度.这是一个大bug 啊! 开始进行了排查是否是代码问题?rem 的问题?webview 的问题?最后在网络上检索到是参考文档中的内容.这里记录了解决方案. 我们在开发hybrid 应用时,h5 页面的使用rem 进行适配,设计师给出750px 宽度的设计图,在750px 设计图上进行开发.通常在适配时,都是在<head> 标签中加载一段<script>

Python 一日一练: 01

将数字转换为LCD模式 代码如下: 1 # -*- coding:utf-8 -*- 2 ''' 3 Python 小练习-1 : 将数字转换为LCD显示 4 ''' 5 lt = [' __ ', '|__ ', '|__|', ' |', ' __|', '| |', ' '] 6 dt = {0:[0, 5, 2],1:[6, 3, 3], 2:[0, 4, 1], 3:[0, 4, 4], 4:[6, 2, 3], 5:[0, 1, 4], 6:[0, 1, 2], 7:[0, 3, 3

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

功能 自己主动获取CSDN文章列表,并对每篇文章添加点击量. 源代码 import urllib.request import re import time import random from bs4 import BeautifulSoup p = re.compile('/a359680405/article/details/........') #自己的博客主页 url = "http://blog.csdn.net/a359680405" #使用build_opener()是

Python一日一练03----一元二次方程的计算

要求 由用户随意给定一元二次方程系数a.b.c,计算一元二次方程的解 源码 import cmath #包含复数运算 import math import sys def get_float(msg, allow_zero): x = None while x is None: try: x = float(input(msg)) if not allow_zero and abs(x) < sys.float_info.epsilon: #sys.float_info.epsilon是浮点数0

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

在PC硬件体系结构里,速度最快的存储器是CPU里面的寄存器,接着到二级缓存,再到系统RAM内存,最后才到硬盘.因为这种体系结构,就决定了操作系统对文件的操作方式,或者说是最优化的算法.比方操作系统接收到写文件的数据时,就会先把数据保存到RAM里,然后在合适的时间或者合适的数据量时再写到硬盘里.但有时候我们希望数据一定要保存到硬盘里,而不是保存在RAM里,这时就须要使用函数FlushFileBuffers来把RAM里的数据保存到硬盘里.文件的结构是一个有序的队列,有头有尾,当读写文件后,就会移动文