zoukankan      html  css  js  c++  java
  • 窗口子类化与超类化

    以前大致了解窗口子类化是什么意思,今天索性又看了超类化,知道了他们究竟是怎么回事了。
    说白了,窗口子类化是改变一个已注册窗口类(用RegisterClassEx注册过)的窗口过程,到达自定义窗口过
    程的目的。而窗口超类化是首先获得一个已存在的窗口类,然后设置窗口类,最后注册该窗口类。所以窗口超类化除了
    可以可以改变窗口过程之外,还可以改变窗口的背景画刷等属性。所以超类化可以完成比子类化更复杂的功能,在SDK


    范畴上,可以认为子类化是超类化的子集。 下面分别给出源码:

    子类化:

    // 保存窗口默认的消息响应函数指针
    WNDPROC pSubclassOldEditProc;
    // 用于替换子类化窗口的消息响应函数
    LRESULT CALLBACK JcEditProcSubClass(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch(message)
        {
        case WM_CHAR:
            {
                ::MessageBox(hWnd, "WM_CHAR响应", "子类化", MB_OK);
                return 0;
            }
        default: return ::CallWindowProc(pSubclassOldEditProc, hWnd, message, wParam, lParam);
        }
    }
     
    // 对创建好的窗体进行子类化代码
       {
           // 创建
           HWND hEdit = CreateWindowEx(NULL, "EDIT", "SubClass", 
               WS_CHILD|WS_BORDER|ES_LEFT|ES_AUTOHSCROLL, 100,120, 128, 16, hWnd, NULL, hInstance, NULL);
           pSubclassOldEditProc = (WNDPROC)::SetWindowLong(hEdit, GWL_WNDPROC, (DWORD)JcEditProcSubClass);
           // 显示
           ShowWindow(hEdit, nCmdShow);
           UpdateWindow(hWnd);
       }

    超类化:

    WNDPROC pSuperOldEditProc;// 保存窗口默认消息处理函数
    // 用于替换的超类化消息响应函数
    LRESULT CALLBACK JcEditProcSuper(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch(message)
        {
        case WM_CHAR:
            {
                ::MessageBox(hWnd, "WM_CHAR响应", "超类化", MB_OK);
                return 0;
            }
        default: return ::CallWindowProc(pSuperOldEditProc, hWnd, message, wParam, lParam);
        }
    }
     
    // 创建超类化控件代码
       {
           // 取得原控件信息
           WNDCLASSEX myeditClass;
           ::GetClassInfoEx(hInstance, "EDIT", &myeditClass);
           // 保存原控件默认消息处理函数
           pSuperOldEditProc = myeditClass.lpfnWndProc;
           // 设置替换的消息处理函数
           myeditClass.lpfnWndProc = JcEditProcSuper;
           // 指定新的窗口类名字
           myeditClass.lpszClassName = "JcilyEdit";
           // 设置结构体大小
           myeditClass.cbSize = sizeof(WNDCLASSEX);
           // 注册新信息
           RegisterClassEx(&myeditClass);
           // 创建
           HWND hEdit = CreateWindowEx(NULL, myeditClass.lpszClassName, "SuperClass", 
               WS_CHILD|WS_BORDER|ES_LEFT|ES_AUTOHSCROLL, 100,100, 128, 16, hWnd, NULL, hInstance, NULL);
           // 显示
           ShowWindow(hEdit, nCmdShow);
           UpdateWindow(hWnd);
       }
  • 相关阅读:
    16-高级指针
    15-C语言结构体
    14-C语言宏
    13-C语言字符串函数库
    12-C语言字符串
    11-C语言指针
    10-C语言函数
    POJ 1001 高精度乘法
    POJ 1060 多项式乘法和除法取余
    POJ 1318 字典排序
  • 原文地址:https://www.cnblogs.com/weekbo/p/10620102.html
Copyright © 2011-2022 走看看