getclasslong

本文详细介绍了GetClassLong函数的功能及使用方法。该函数能够获取指定窗口类的WNDCLASSEX结构中的特定32位值,如窗口类的背景刷子句柄、图标句柄等。文章还解释了如何通过不同的nlndex参数来获取所需信息。
  name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1193665761703&lmt=1193665780&format=336x280_as&output=html&correlator=1193665761687&url=http%3A%2F%2Fwww.codeguru.cn%2Fpublic%2Fiframe%2Fwinapiiframe.htm&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=FFFFFF&color_border=FFFFFF&ad_type=text&ga_vid=1285758818.1193665762&ga_sid=1193665762&ga_hid=111695597&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_his=8&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency">     函数功能:该函数返回与指定窗口相关的WNDCLASSEX结构的指定32位值。

    函数原型:DWORD GetClassLong(HWND hWnd,int nlndex);

    参数:

    hWnd:窗口句柄间接给出的窗口所属的类。

    nlndex:指定要恢复的32位值。从额外的类存储空间恢复一个32位的值,指定的一个大于等于0的被恢复值的偏移量。有效值为从0开始到额外类存储空间字节数一4。例如,若指定了12位或多于12位的额外类存储空间,则应设为第三个32位整数的索引位8。要从WNDCLASSEX结构中恢复任何值,需要指定下面值之一:

    GCSW原子:获得一个唯一标识窗口类的原子值,该值与RegisterClassEx函数的返回值相同。

    GCL_CBWNDEXTRA:获得与类中的每个窗口相关的额外窗口中内存空间的字节大小,进入该存储空间的方法请参看GetWindwoLong。

    GCL_HBRBACKGROUND:获得与类有关的背景刷子的句柄。

    GCL_HCURSOR:获得与类有关的光标的句柄。

    GCL_HICON:获得与类有关的图标的句柄。

    GCL_HICONSM:获得与类有关的小图标的句柄。

    GCL_HMOUDLE:获得注册该类的模块的句柄。

    GCL_MENUNAME:获得菜单名字符串的地址,该字符串标识了与类有关的菜单资源。

    GCL_STYLE:获得窗口类的风格位。

    GCL_WNDRPOC:获得与类有关的窗口过程的地址。

    返回值:如果函数成功,返回值是所需的32位值;如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。

    备注:通过使用函数RegisterClassEx将结构WNDCLASSEX中的cbCIsExtra单元指定为一个非O值来保留额外类的存储空间。Windows CE:nlndex参数是一个字节偏移量,但是必须为 4的倍数。Windows CE不支持unaligned access。nlndex参数中只可设定为GCL_HICON和GCL_STYLE。 如果使用了Windows CE的 lconsurs组件,该组件支持在适当的目标平台上的鼠标,也可以在nlndex中使用GCL_HCURSOR。 注意支持鼠标的 Windows CE版本包含 Iconcurs和 Mcursor而不是 Icon和 Cursor组件。

    速查:Wiodows NT:3.1以上版本;Windows:95以上版本:Windows CE:1.0以上版本:头文件:Winuser.h;库文件:USer32.lib:Unicode:在 Windows NT上实现为 Unicode和ANSI两种版本。
// 公用窗口过程:所有本类对象(窗体)都用此函数作为窗口过程 // CBForm 类的友元函数 static BOOL WINAPI CBForm_DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // ======================================================================= // 本函数中不得 PostQuitMessage // 因为在一个对话框中 PostQuitMessage 后,整个程序就都关闭了,而不是只有 // 这一个对话框被关闭 // ======================================================================= switch (uMsg) { case WM_INITDIALOG: // =================================================================== // lparam 应为一个对象的地址,将此地址与 hwnd 关联的关系存入哈希表 if (lParam) { // ================================================================= // ============ 有新窗体创建:将其信息记录到 ms_hashWnd ============ // ================================================================= // 容错:若哈希表中已存在键为 hwnd 的项目,则先删除它,再用新的内容覆盖 if (CBForm::ms_hashWnd.IsKeyExist((long)hWnd)) CBForm::ms_hashWnd.Remove((long)hWnd, false); // 向哈希表中添加新项(Key=hwnd,Data=对象地址, // ItemLong=加速键句柄,ItemLong2=受模态对话框影响的 Enabled 状态) CBForm::ms_hashWnd.Add(lParam, (long)hWnd, 0, 0); // 设置对象中的 m_hWnd 成员为 窗口句柄 ((CBForm*)lParam)->m_hWnd = hWnd; // 设置对象中的 类名成员 memset(((CBForm*)lParam)->m_ClassName, 0, sizeof(((CBForm*)lParam)->m_ClassName)); ((CBForm*)lParam)->m_atom = GetClassLong(hWnd, GCW_ATOM); GetClassName(hWnd, ((CBForm*)lParam)->m_ClassName, sizeof(((CBForm*)lParam)->m_ClassName) / sizeof(TCHAR) - 1); // 将所有子窗口控件子类处理:参数 lParam 设为本窗体的句柄 m_hWnd EnumChildWindows(hWnd, EnumChildProcSubClass, (LPARAM)hWnd); // 触发 Form_Load 事件 ((CBForm*)lParam)->EventsGenerator(WM_INITDIALOG, wParam, lParam); } return 1; // 返回 True, Windows 会自动将输入焦点放到第一个有 WS_TABSTOP 的控件上 break; default: // =================================================================== // 调用各自对象的 EventsGenerator,后者处理这些消息,必要时生成事件 // 本函数返回 EventsGenerator 的返回值 // =================================================================== CBForm* pForm; pForm = 0; if (CBForm::ms_hashWnd.IsKeyExist((long)hWnd)) { pForm = (CBForm*)CBForm::ms_hashWnd.Item((long)hWnd, false); if (pForm) { return pForm->EventsGenerator(uMsg, wParam, lParam); } } } return 0; } HWND CBForm::Load(HWND hwndOwner/*=NULL*/, bool fRaiseErrIfFail/*=true*/) { // 一律以“非模态”方式加载窗体:调用 CreateDialogParam // 将 dwInitParam 参数设为本对象地址即this, // 此将作为 WM_INITDIALOG 的 lParam 参数传给 CBForm_DlgProc HWND hwnd; hwnd = CreateDialogParam(pApp->hInstance, MAKEINTRESOURCE(mResDlgID), hwndOwner, CBForm_DlgProc, (long)this); // 立即返回,返回窗口句柄;在窗口过程处理 WM_INITDIALOG 时会设置 m_hWnd // 如果没有 WS_VISIBLE 样式此时窗体不会自动显示 if (!hwnd) { if (fRaiseErrIfFail) { MsgBox(StrAppend(TEXT("CBForm::Load() failed. Form ID="), Str((int)mResDlgID), TEXT("\r\n"), TEXT("GetLastError="), Str(GetLastError())), TEXT("Debug Error from CBForm::Load()"), mb_OK, mb_IconError); throw (unsigned char)5; // 无效的过程调用或参数 } } else { // 初始化菜单 ConstructMenuIDItems(GetMenu(hwnd), true); // 如无菜单即参数为0,将清除菜单哈希表记录 ConstructMenuIDItems(GetSystemMenu(hwnd, 0), false); // 系统菜单 } return hwnd; } HWND hwnd; hwnd = CreateDialogParam(pApp->hInstance, MAKEINTRESOURCE(mResDlgID), hwndOwner, CBForm_DlgProc, (long)this); // 立即返回,返回窗口句柄;在窗口过程处理 WM_INITDIALOG 时会设置 m_hWnd这一句出现"BOOL (__stdcall *)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)" (aka "int (__stdcall *)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)") 类型的实参与 "DLGPROC" (aka "long long (__stdcall *)(HWND, UINT, WPARAM, LPARAM)") 类型的形参不兼容错误如何解决
最新发布
11-16
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值