zoukankan      html  css  js  c++  java
  • C++ 中超类化和子类化常用API

    在windows平台上,使用C++实现子类化和超类化常用的API并不多,由于这些API函数的详解和使用方法,网上一大把。本文仅作为笔记,简单的记录一下。

    子类化:SetWindowLong,GetWindowLong,CallWindowProc,FindWindowEx

    超类化:GetClassInfoEx,RegisterClassEx,UnRegisterClass

    以上函数在代码中的使用见《C++ 中超类化和子类化

     

    VC中基于SDK编程的窗口子类化

    VC中基于SDK编程的窗口子类化的基本步骤如下:

    (1)正常创建原始窗口,得到窗口的句柄。

    (2)调用GetWindowLong得到原来的窗口函数OldWndProc

    (3)调用SetWindowLong设置新的窗口函数NewWndProc

    (4)在窗口函数NewWndProc中使用CallWindowProc将消息发到原来的窗口函数OldWndProc。     

     

    SetWindowLong
    函数功能:该函数改变指定窗口的属性.函数也将指定的一个32位值设置在窗口的额外存储空间的指定偏移位置。 

    函数原型:LONG SetWindowLong(HWND hWnd,int nlndex,LONG dwNewLong); 

    参数: 

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

    nlndex:指定将设定的大于等于0的偏移值。有效值的范围从0到额外类的存储空间的字节数-4:例如若指定了12位或多于12位的额外类存储空间,则应设为第三个32位整数的索引位8。要设置其他任何值,可以指定下面值之一: 

    GWL_EXSTYLE:设定一个新的扩展风格。GWL_STYLE:设定一个新的窗口风格。 

    GWL_WNDPROC:为窗口过程设定一个新的地址。GWL_ID:设置一个新的窗口标识符。 

    GWL_HINSTANCE:设置一个新的应用程序事例句柄。 

    GWL_USERDATA:设置与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。 

    GWL_ID 设置一个新的窗口标识符。

    当hWnd参数标识了一个对话框时,也可使用下列值: 

    DWL_DLGPROC:设置对话框过程的新地址。 

    DWL_MSGRESULT:设置在对话框过程中处理的消息的返回值。 

    DWL_USER:设置的应用程序私有的新的额外信息,例如一个句柄或指针。 

    dwNewLong:指定的替换值。 

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

    备注:如果由hWnd参数指定的窗口与调用线程不属于同一进程,将导致SetWindowLong函数失败。 

    如果使用带GWL_WNDPROC索引值的SetWindowLong函数替换窗口过程,则该窗口过程必须与WindowProccallback函数说明部分指定的指导行一致。 
    如果使用带 DWL_MSGRESULT索引值的SetWindowLong函数来设置由一个对话框过程处理的消息的返回值,应在此后立即返回TRUE。否则,如果又 调用了其他函数而使对话框过程接收到一个窗口消息,则嵌套的窗口消息可能改写使用DWL_MSGRESULT设定的返回值。 

    通过使用函数RegisterClassEx将结构WNDCLASSEX中的cbWndExtra单元指定为一个非0值来保留新外窗口内存。 

    不能通过调用带GWL_HWNDPARENT索引值的SetWindowLong的函数来改变子窗口的父窗口,应使用SetParent函数。 

     


    GetWindowLong 

    函数功能:该函数获得有关指定窗口的信息,函数也获得在额外窗口内存中指定偏移位地址的32位度整型值。 

    函数原型:LONG GetWindowLong(HWND hWnd,int nlndex); 

    参数: 

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

    nlndex:指定要检索的基于0的的偏移量。有效值的范围从0到窗口额外内存空间的字节数,最小为4。例如,若指定了12位或多于12位的窗体类的额外存储空间,则应设为第三个32位整数的索引位8。要获得任意其他值,指定下列值之一:

    GWL_EXSTYLE;获得扩展窗口风格。 

    GWL_STYLE:获得窗口风格。 

    GWL_WNDPROC:获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用GWL_WNDPROC函数调用窗口过程。 

    GWL_HINSTANCE:获得应用事例的句柄。 

    GWL_HWNDPAAENT:如果父窗口存在,获得父窗口句柄。 

    GWL_ID:获得窗口标识。 

    GWL_USERDATA:获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。

    在hWnd参数标识了一个对话框时也可用下列值: 

    DWL_DLGPROC:获得对话框过程的地址,或一个代表对话框过程的地址的句柄。必须使用函数CallWindowProc来调用对话框过程。 

    DWL_MSGRESULT:获得在对话框过程中一个消息处理的返回值。 

    DWL_USER:获得应用程序私有的额外信息,例如一个句柄或指针。 

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

    备注:通过使用函数RegisterClassEx将结构WNDCLASSEX中的cbWndExtra单元指定为一个非0值来保留额外类的存储空间。 

     

     

    CallWindowProc

    函数功能:将指定消息信息传送给指定的窗口过程. lpPrevWndFunc是窗口消息处理函数指针(函数名), hWnd为接受窗体句柄.

    函数原型:LRESULT CallWindowProc(WNDPROC lpPrevWndFunc,HWND hWnd.UINT Msg,WPARAM wParam,LPARAMIParam);

     

    参数:

    lpPrevWndFunc:参数主要是指向你要调用的函数句柄

    hWnd:指向接收消息的窗口过程的句柄。

    Msg:指定消息类型。

    wParam:指定其余的、消息特定的信息。该参数的内容与Msg参数值有关。

    IParam:指定其余的、消息特定的信息。该参数的内容与Msg参数值有关。

    返回值:返回值指定了消息处理结果,它与发送的消息有关。

    备注:使用函数CallWindowsProc可进行窗口子类化。子类是一个窗口或者相同类的一套窗口,在其消息被传送到该类的窗口过程之前,这些消息是由另一个窗口过程进行解释和处理的。

     

     

    FindWindowEx

        函数功能:该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。

     

        函数原型:HWND FindWindowExHWND hwndParentHWND hwndChildAfterLPCTSTR lpszClassLPCTSTR lpszWindow);

     

        参数:

     

        hwndParent:要查找子窗口的父窗口句柄。

     

        如果hwnjParentNULL,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。

     

        Windows NT5.0 and later:如果hwndParentHWND_MESSAGE,函数仅查找所有消息窗口。

     

        hwndChildAfter :子窗口句柄。查找从在Z序中的下一个子窗口开始。子窗口必须为hwndPareRt窗口的直接子窗口而非后代窗口。如果HwndChildAfter为 NULL,查找从hwndParent的第一个子窗口开始。如果hwndParent 和 hwndChildAfter同时为NULL,则函数查找所有的顶层窗口及消息窗口。

     

        lpszClass:指向一个指定了类名的 空结束字符串,或一个标识类名字符串的成员的指针。如果该参数为一个成员,则它必须为前次调用theGlobaIAddAtom函数产生的全局成员。该成 员为16位,必须位于lpClassName的低16位,高位必须为0。

     

        lpszWindow:指向一个指定了窗口名(窗口标题)的空结束字符串。如果该参数为 NULL,则为所有窗口全匹配。返回值:如果函数成功,返回值为具有指定类名和窗口名的窗口句柄。如果函数失败,返回值为NULL

     

    VC中超类化常用API

    窗口超类化是在窗口类——WNDCLASS或WNDCLASSEX(非MFC类概念)级别进行的改变窗口类特征的。改变已有窗口类的行为属性。

    GetClassInfoEx

    函数功能:  获取进程中窗体类信息

    函数原型:BOOL GetClassInfo(HINSTANCE hInstance,   LPCTSTR lpClassName, LPWNDCLASS lpWndClass);

    参数:

    hInstance:应用程序实例;
    lpClassName :窗口类名;               
    lpWndClass :用于接收类名的结构体变量  ;

    返回值:如果函数成功,返回值为非零;

    备注:在超类化中,取得想要进行超类化操作的窗口类的信息

     

    RegisterClassEx

    函数功能:注册一个窗体类,以便通用CreateWindowEx, CreateWindow来实例化一个窗体。

    函数原型:RegisterClassEx(CONST WNDCLASSEX *lpwcx );

    参数:

    Ipwcx:指向一个WNDCLASSEX结构的指针。在传递给这个函数之前,必须在结构内填充适当的类的属性。

    返回值:如果函数成功,返回这个窗口类型的标识号;如果函数失败,返回值为0。

     

    UnRegisterClass

    函数功能:该函数删除一个窗口类,清空该类所需的内存。 

    函数原型:BOOL UnRegisterClass(LPCTSTR IpClassName; HINSTANCE hlnstance); 

    参数: 

    IpClassName:指向一个空结束字符串的指针,或是一个整型原子。如果IpClassName是一个字符串,则它指定了窗口类的类名。这个类名必须由此前调用RegisterClassEx函数来注册。系统类,如对话框控制,必须被注册。 

    如果这个参数是一个整型原子,它必须是由此前调用GlobalAdd原子函数创建的全局原子。这个16位整型数小于OxCOOO,必须是lpszClass的低16位,其高位宇必须为0。 

    hlnstance:创建类的模块的事例句柄。 

    返回值:如果函数成功,返回值为非零;如果未发现类或由此类创建的窗口仍然存在,则返回值为0。 

    若想获得更多错误信息,请调用GetLastError函数。 

    备注:在调用这个函数之前,应用程序必须销毁由指定类创建的所有窗口。应用程序注册的所有窗口类在应用程序中止后都为未注册的类。

     

     

    /* 附窗口样式参考列表: 
    
    WS_POPUP - 弹出式窗口(不能与WS_CHILDWINDOW样式同时使用) 
    
    WS_CHILDWINDOW - 子窗口(不能与WS_POPUP合用) 
    
    WS_MINIMIZE - 最小化状态 
    
    WS_VISIBLE - 可见状态 
    
    WS_DISABLED - 不可用状态 
    
    WS_CLIPSIBLINGS - 使窗口排除子窗口之间的相对区域 
    
    WS_CLIPCHILDREN - 当在父窗口内绘图时,排除子窗口区域 
    
    WS_MAXIMIZE - 具有最大化按钮,须指定WS_SYSTEM样式 
    
    WS_CAPTION - 有标题框和边框(和WS_TILED样式相同) 窗口带有一个标题栏,经测试,实际上等于 (WS_BORDER Or WS_DLGFRAME) 
    
    WS_BORDER - 有单边框 窗口带有一个薄边框 
    
    WS_DLGFRAME - 带对话框边框样式,不带标题框 带有一般对话框的风格,但没有标题栏 
    
    WS_VSCROLL - 有垂直滚动条 窗口带有一个垂直滚动条 
    
    WS_HSCROLL - 有水平滚动条 窗口带有一个水平滚动条 
    
    WS_SYSMENU - 标题框上带有窗口菜单(须指定WS_CAPTION样式) 在窗口的标题栏上增加一个系统菜单,该窗口必须具有 WS_CAPTION 风格(即WS_BORDER和WS_DLGFRAME) 
    
    WS_SIZEBOX 和 WS_THICKFRAME - 有可调边框(与WS_SIZEBOX样式相同) 窗口带有一个可以调整窗口大小的边框(即VB里的Sizable,其他地方的边框均指不具调整大小功能的边框) 
    
    WS_GROUP - 组样式,每个组的第一个控件具有WS_TABSTOP样式 
    
    WS_TABSTOP - 可接受TAB键焦点 
    
    WS_MINIMIZEBOX - 有最小化按钮 窗口带有最小化按钮,该窗口必须具有 WS_CAPTION 风格 
    
    WS_MAXIMIZEBOX - 有最大化按钮 窗口带有最大化按钮,该窗口必须具有 WS_CAPTION 风格 
    
    WS_OVERLAPPEDWINDOW 和 WS_TILEDWINDOW:- 具有层叠,标题框,系统菜单,可调边框,系统按钮   窗口是一个交迭式窗口,并且组合了 WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU,
    
    WS_THICKFRAME, WS_MINIMIZEBOX 以及 WS_MAXIMIZEBOX 这些风格 
    
    WS_POPUPWINDOW - 具有单边框,弹出式,系统菜单样式
    
    WS_OVERLAPPED 和 WS_TILED:窗口是一个交迭式窗口。交迭式窗口带有一个标题栏和一个边框 
    
    */  
    
    /* 窗口扩展样式参考列表: 
    
    WS_EX_DLGMODALFRAME - 带双层边框 
    
    WS_EX_NOPARENTNOTIFY - 创建/销毁时不通知父窗口 
    
    WS_EX_TOPMOST - 窗口置顶(停留在所有非最高层窗口的上面) 
    
    WS_EX_ACCEPTFILES - 可接受文件拖放 
    
    WS_EX_TRANSPARENT - 透明样式,在同属窗口已重画时该窗口才可重画 
    
    WS_EX_MDICHILD - MDI子窗口样式 
    
    WS_EX_TOOLWINDOW - 工具条窗口样式 
    
    WS_EX_WINDOWEDGE - 带凸起边缘的边框 
    
    WS_EX_CLIENTEDGE - 带阴影的边缘 
    
    WS_EX_CONTEXTHELP - 有上下文帮助样式,标题栏包含一个问号标志 
    
    WS_EX_RIGHT - 右对齐 
    
    WS_EX_RTLREADING - 窗口文本从右到左显示 
    
    WS_EX_LEFTSCROLLBAR - 垂直滚动条在窗口左边界 
    
    WS_EX_CONTROLPARENT - 允许用户使用TAB键在窗口的子窗口间搜索 
    
    WS_EX_STATICEDGE - 当窗口为不可用状态时创建一个三维边缘 
    
    WS_EX_APPWINDOW - 当窗口可见时将一个顶层窗口放置在任务栏上 
    
    WS_EX_OVERLAPPEDWINDOW - 带凸起边缘的边框,边缘有阴影 
    
    WS_EX_PALETTEWINDOW - 带立体边框,有工具条窗口样式,窗口在顶层 
    
    WS_EX_LAYERED - 分层或透明窗口,该样式可使用混合特效 
    
    WS_EX_NOINHERITLAYOUT - 子控件不继承窗体或控件的布局 
    
    WS_EX_LAYOUTRTL - 窗体或控件将具有从右向左的布局(因而会被镜像) 
    
    WS_EX_COMPOSITED - 用双缓冲从下到上绘制窗口的所有子孙(WinXP以上) 
    
    WS_EX_NOACTIVATE - 处于顶层但不激活 
    
    */  
    
    /* 控件样式参考列表:  
    
    DS_ABSALIGN - 对话框的坐标为屏幕坐标(缺省为客户区坐标)  
    
    DS_SYSMODAL - 系统模式(仅支持16位程序),不能与DS_CONTROL同用  
    
    DS_LOCALEDIT - 在对话框内部为编辑框分配内存(仅支持16位程序)  
    
    DS_SETFONT - 可定制对话框字体  
    
    DS_MODALFRAME - 框架样式(不能与WS_CAPTION同用)  
    
    DS_NOIDLEMSG - 无空闲消息  
    
    DS_SETFOREGROUND - 使对话框在最前面显示  
    
    DS_3DLOOK - 四周有3维边框  
    
    DS_FIXEDSYS - 使用系统固定字体  
    
    DS_NOFAILCREATE - 忽略创建过程中的错误  
    
    DS_CONTROL - 控件模式,可作为其他对话框的子窗口  
    
    DS_CENTER - 在屏幕居中  
    
    DS_CENTERMOUSE - 在鼠标位置居中  
    
    DS_CONTEXTHELP - 有上下文帮助按钮  */
    

     

  • 相关阅读:
    CodeForces 219D Choosing Capital for Treeland (树形DP)
    POJ 3162 Walking Race (树的直径,单调队列)
    POJ 2152 Fire (树形DP,经典)
    POJ 1741 Tree (树的分治,树的重心)
    POJ 1655 Balancing Act (树的重心,常规)
    HDU 2196 Computer (树形DP)
    HDU 1520 Anniversary party (树形DP,入门)
    寒门子弟
    JQuery选择器(转)
    (四)Web应用开发---系统架构图
  • 原文地址:https://www.cnblogs.com/guolixiucai/p/4761834.html
Copyright © 2011-2022 走看看