首页 > 代码库 > WindowsAPI一日一练
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 = http://www.mamicode.com/FindResource(NULL,lpszResName,RT_DIALOG);>很多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一日一练
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。