窗口子类化

#include <windows.h>

#define ID_EDIT    
1

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
LRESULT
CALLBACK NewWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM
lParam);
WNDPROC OldWndProc;
static HINSTANCE hIns;
char
temp[505];

TCHAR szAppName[] = TEXT ("Lab11") ;

int WINAPI WinMain
(HINSTANCE hInstance, HINSTANCE
hPrevInstance,
                   
PSTR szCmdLine, int iCmdShow)
{
    
HWND     hwnd ;
    
MSG      msg ;
     WNDCLASS
wndclass ;
     
    
wndclass.style         = CS_HREDRAW |
CS_VREDRAW ;
     wndclass.lpfnWndProc   =
WndProc ;
     wndclass.cbClsExtra    = 0
;
     wndclass.cbWndExtra    = 0
;
     wndclass.hInstance     =
hInstance ;
    
wndclass.hIcon         = LoadIcon (NULL,
IDI_APPLICATION) ;
    
wndclass.hCursor       = LoadCursor (NULL,
IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH)
GetStockObject (WHITE_BRUSH) ;
    
wndclass.lpszMenuName  = NULL ;
    
wndclass.lpszClassName = szAppName ;
   
 
     if (!RegisterClass
(&wndclass))
    
{
          MessageBox (NULL,
TEXT ("Failed to
RegisterClass!"),
                     
szAppName, MB_ICONERROR)
;
          return 0
;
     }
   
 
     hwnd = CreateWindow (szAppName,
szAppName,
                         
WS_OVERLAPPEDWINDOW,
                         
CW_USEDEFAULT,
CW_USEDEFAULT,
                         
CW_USEDEFAULT,
CW_USEDEFAULT,
                         
NULL, NULL, hInstance, NULL) ;
   
 
     ShowWindow (hwnd, iCmdShow)
;
     UpdateWindow (hwnd) ;
   
 
     while (GetMessage (&msg, NULL, 0,
0))
    
{
          TranslateMessage
(&msg) ;
         
DispatchMessage (&msg) ;
    
}
     return msg.wParam ;
}

LRESULT CALLBACK
WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
     static HWND hwndEdit
;
     
     switch
(message)
     {
     case
WM_CREATE :
         
hIns=((LPCREATESTRUCT)lParam)->hInstance;
         
hwndEdit = CreateWindow (TEXT ("edit"),
NULL,
                        
WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL
|
                                  
WS_BORDER | ES_LEFT | ES_MULTILINE
|
                                  
ES_AUTOHSCROLL |
ES_AUTOVSCROLL,
                        
0, 0, 0, 0, hwnd, (HMENU)
ID_EDIT,
                        
((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
  
      
OldWndProc=(WNDPROC)SetWindowLong(hwndEdit,GWL_WNDPROC,(long)NewWndProc);
         
return 0 ;
        
 
     case WM_SETFOCUS
:
          SetFocus (hwndEdit)
;
          return 0
;
        
 
     case WM_SIZE :

          MoveWindow (hwndEdit,
0, 0, LOWORD (lParam), HIWORD (lParam), TRUE)
;
          return 0
;
        
 
     case WM_COMMAND
:
          if (LOWORD (wParam)
==
ID_EDIT){
              
if (HIWORD (wParam) == EN_ERRSPACE ||

                        
HIWORD (wParam) ==
EN_MAXTEXT)

                   
MessageBox (hwnd, TEXT ("Edit control out of
space."),
                               
szAppName, MB_OK | MB_ICONSTOP) ;
      
   }
        
 
          return 0
;
             
 
     case WM_DESTROY
:
          PostQuitMessage (0)
;
          return 0
;
     }
     return DefWindowProc
(hwnd, message, wParam, lParam) ;
    
}
POINT
p;
char num[][10]={"January","September"};

LRESULT CALLBACK
NewWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM
lParam)

{
    HMENU
hMenu,hMenuTrackPopup;
    switch(message){
  
 case WM_KEYDOWN:
      
 switch(wParam){
        case
VK_F1:
            MessageBox
(hWnd, TEXT ("需要的信息!"),szAppName, MB_OK | MB_ICONINFORMATION) ;
  
         break;
  
     }
      
 break;
    case WM_RBUTTONDOWN:

  
   
 hMenu=LoadMenu(hIns,MAKEINTRESOURCE(101));
  
     hMenuTrackPopup=GetSubMenu(hMenu,0);
  
     p.x=LOWORD(lParam);
      
 p.y=HIWORD(lParam);
      
 ClientToScreen(hWnd,&p);
      
 TrackPopupMenu(hMenuTrackPopup,TPM_TOPALIGN|TPM_LEFTALIGN,p.x,p.y,0,hWnd,0);

  
     break;
    case
WM_COMMAND:
      
 switch(LOWORD(wParam)){
         
case 40001:
             
memset(temp,0,sizeof(temp));
      
      
SendMessageA(hWnd,WM_GETTEXT,500,(LPARAM)&temp);
  
          
strcat(temp,num[0]);
          
  
SendMessageA(hWnd,WM_SETTEXT,500,(LPARAM)&temp);
  
           //MessageBox (hWnd, TEXT
("1"),szAppName, MB_OK | MB_ICONINFORMATION) ;
  
           break;
  
       case 40002:
      
       //MessageBox (hWnd, TEXT ("2"),szAppName, MB_OK
| MB_ICONINFORMATION) ;
          
   memset(temp,0,sizeof(temp));
      
      
SendMessageA(hWnd,WM_GETTEXT,500,(LPARAM)&temp);
  
          
strcat(temp,num[1]);
          
  
SendMessageA(hWnd,WM_SETTEXT,500,(LPARAM)&temp);
  
           break;
  
       }
      
 break;
    }

   return
CallWindowProc(OldWndProc,hWnd,message,wParam,lParam);

}

窗口子类化,布布扣,bubuko.com

时间: 2024-10-11 16:27:46

窗口子类化的相关文章

窗口子类化如何防止冲突

窗口子类化如何防止冲突 子类化是用GetWindowLong和SetWindowLong这两个API来对已经创建的窗口的窗口过程地址进行修改,用自己的窗口过程的新地址代替原来的,然后在自己写的新地址里过滤掉自己感兴趣的消息,一般我们是把自己不处理的消息再用原来的窗口函数调用,以实现我们对某一个窗口的特性的小修改要求,一般把子类化用在控件上,但也可以用在任意类型的窗口上. 以VB代码为例: 1.首先在form_load事件中拦截发送到所有form的消息,发送到自编回调函数NewWindowProc

WIN32窗口子类化----自定义Edit控件的右键菜单

前言 Win32应用程序中,子控件的消息都是分发到其父窗口的消息处理函数中去了,这对于我们需要自定义子控件的某些特性时时十分不方便的,还好,Windows为我们提供了控件子类化的相关接口API.核心的思想是:通过获取子控件的消息处理函数地址,设置子控件的消息处理函数到自己定义的函数里,也就是Get/SetWindowLong API的使用. 测试代码 这里是一个简单的测试程序,在控制台程序中创建一个对话框,然后对话框上有一个EDIT控件(资源编辑器里拖入的,不多说),子类化EDIT控件,右键弹出

C++ 中超类化和子类化常用API

在windows平台上,使用C++实现子类化和超类化常用的API并不多,由于这些API函数的详解和使用方法,网上一大把.本文仅作为笔记,简单的记录一下. 子类化:SetWindowLong,GetWindowLong,CallWindowProc,FindWindowEx 超类化:GetClassInfoEx,RegisterClassEx,UnRegisterClass 以上函数在代码中的使用见<C++ 中超类化和子类化> VC中基于SDK编程的窗口子类化 VC中基于SDK编程的窗口子类化的

C++ 中超类化和子类化

超类化和子类化没有具体的代码,其实是一种编程技巧,在MFC和WTL中可以有不同的实现方法. 窗口子类化: 原理就是改变一个已创建窗口类的窗口过程函数.通过截获已创建窗口的消息,从而实现监视或修改已创建窗口类的行为属性.可以用来改变或者扩展一个已存在的窗口的行为,而不用重新开发.比如要获得那些预定义控件窗口类(按钮控件.编辑控件.列表控件.下 拉列表控件.静态控件和滚动条控件)的功能而又要修改它们的某些行为. 子类化的优点主要体现在以下两个方面:首先,它不需要创建新的窗口类,不需要了解一个窗口的窗

从以往子类化跟踪MouseLeave深入讨论VB6的自定义Hook类

一.关于起因 之前发过一篇博文,是关于VB6中跟踪鼠标移出事件的示例(http://www.cnblogs.com/alexywt/p/5891827.html) 随着业务状况的不断发展,提出了更多的挑战和问题. 其一:子类化在VB6的IDE调试阶段会出现崩溃情况,需要实现子类化的无崩溃调试; 其一:我的窗体或自定义控件中可能有很多控件需要跟踪鼠标移出事件;甚至可能会通过代码来动态添加控件,要监听移出事件,通常是用WithEvents,但VB6的该关键字不支持数组对象的事件跟踪.也就是说要找到一

眼见为实(2):介绍Windows的窗口、消息、子类化和超类化

眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较"生僻"的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和线程.子类化(Subclassing)和超类化(Superclassing)是伴随Windows窗口机制而产生的两个复用代码的方法.不要把"子类化.超类化"与面向对象语言中的派生类.基类混淆起来."子类化.超类化"中的"类"是指W

窗口的子类化与超类化

1. 子类化 改变一个已经存在的窗口实例的性质:消息处理与其他实例属性.在SDK编程范畴内,子类化就是改变一个窗口实例的窗口函数(通过GetWindowLong()和SetWindowLong()),子类化所要做的就是为某窗口实例编写新的窗口函数.其操作是在实例级别上进行的.在MFC中子类化的情况有所不同:所有MFC窗口有相同的窗口函数,由该窗口函数根据窗口句柄查找窗口实例,在把消息映射到该窗口类(class)得消息处理函数上.为了利用MFC的消息映射机制,不宜改变窗口函数(名),MFC也把子类

子类化和超类化区别(介绍Windows的窗口、消息、子类化和超类化)(转)

原文地址:http://maqianli210.blog.sohu.com/75497589.html 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和线程.子类化(Subclassing)和超类化(Superclassing)是伴随Windows窗口机制而产生的两个复用代码的方法.不要把“子类化.超类化”与面向对象语言中的派生类.基类混淆起来.“子类化.超类化”中的“类”是指Windows的窗口类. 0 运

窗口的子类化与超类化——子类化是窗口实例级别的,超类化是在窗口类(WNDCLASS)级别的

1. 子类化 理论:子类化是这样一种技术,它允许一个应用程序截获发往另一个窗口的消息.一个应用程序通过截获属于另一个窗口的消息,从而实现增加.监视或者修改那个窗口的缺省行为.子类化是用来改变或者扩展一个已存在的窗口的行为.而不用重新开发的有效途径.想要获得那些预定义控件窗口类(按钮控件.编辑控件.列表控件.下拉列表控件.静态控件和滚动条控件)的功能而又要修改它们的某些行为的一个便利的方法就是对它们进行子类化.例如,对于一个在对话框中的多行编辑框来说,当用户按下Enter键时,对话框会关闭.通过对