码迷,mamicode.com
首页 > Windows程序 > 详细

WindowsAPI一日一练

时间:2014-11-29 11:49:49      阅读:345      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   ar   os   使用   sp   strong   

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,如下图

bubuko.com,布布扣

使用

(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一日一练

标签:des   style   blog   http   ar   os   使用   sp   strong   

原文地址:http://www.cnblogs.com/cpointer/p/4130202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!