Windows窗口子类化

 


 利用子类化技术拓展Edit控件功能

认识子类化技术

把一个窗体子类化其实就是使用SetwindowLong为该窗体设计一个新的窗体过程,然后可以在该窗体函数中处理特定消息,而那些不关心的消息可以通过CallWindowProc传递给默认处理

从功能上说,子类化技术有点类似于钩子函数(SetWindowHookEx),都可以对一些特定的消息进行处理。但两者有本质区别,钩子函数是针对系统的消息传递机制,而子类化是针对特定的窗体。利用钩子可以处理某一类或几类消息,而利用子类化技术则能处理特定窗体的绝大部分消息。

一个对话框(IDD_TEST_SAMPLE)和一个EDIT控件(IDC_TEST)

#include "resource.h"

#include <tchar.h>

#include <windows.h>

LONG DefWndProc=NULL;

 

LRESULT CALLBACK EditNewProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);

BOOL CALLBACK TestSampleProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

{

         DialogBox(hInstance,MAKEINTRESOURCE(IDD_TEST_SAMPLE,0,TestSampleProc);

         return 0;

}

LRESULT CALLBACK EditNewProc(HWND hwnd,UINT msg,WPARAM  wParam,LPARAM lParam)

{

 

//        return CallWindowProc((WNDPROC)DefWndProc,hwnd,msg,wParam,lParam);

          if(msg==WM_CHAR)

          {

                       .......

          }

}

BOOL CALLBACK TestSampleProc(HWND hwnd,MSG msg,WPARAM wParam,LPARAM lParam)

{

           LONG DlgWndProc,EditWndProc;

           TCHAR buf[128];

            switch(msg)

            {

                            case WM_INITDIALOG:

                                           DlgWndProc=GetWindowLong(hwnd,GWL_WNDPROC);

                                           EditWndProc=GetWindowLong(GetDlgItem(hwnd,IDC_TEST),GWL_WNDPROC);

                                           wsprintf(buf,_T("DlgWndProc  :%08X\nEditWndProc  :  %08X\nDefWndProc:%08X\n"),

                                                             DlgWndProc,EditWndProc,DefWndProc);

                                            MessageBox(hwnd,buf,_T("zileihuazhiqian"),0);

                                            DefWndProc=GetDlgItem(hwnd,IDC_TEST),GWL_WNDPROC,(LONG)EditNewProc);

                                            return true;

                                  case WM_COMMAND:

                                             switch(LOWORD(wParam))

                                               {

                                                               case IDCANCEL:

                                                                        EndDialog(hwnd,0);

                                                                        return true;

                                               }

                                               break;

                                   case WM_LBUTTONDOWN:

                                                         DlgWndProc=GetWindowLong(hwnd,GWL_WNDPROC);

                                                          EditWndProc=GetWindowLong(GetDlgItem(hwnd,IDC_TEST),GWL_WNDPROC);

                                                           wsprintf(buf,_T("DlgWndProc : %08X\nEditWndProc: 08X\nDefWndProc : 08X\n"),

                                                                               DlgWndProc,EditWndProc,DefWndProc);

                                                            MessageBox(hwnd,buf,_T("zileihuazhihou"),0);

                                                            return false;

            }

           return false;

          

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值