windows 编程 —— 子窗口类别化(Window Subclassing)

  对于子窗口控件,有时我们可能会想要获取子窗口的某些消息,比如在一个主窗口下有三个按钮,如果想要实现使用键盘Tab或者Shift-Tab键来使焦点切换于不同按钮之间,这时就可以使用子窗口类别化(Window Subclassing)的方法。

  子窗口类别化:

  按钮控件的窗口消息处理程序是Windows内部的。但是,将GWL_WNDPROC标识符作为参数来呼叫GetWindowLong,您就可以得到这个窗口消息处理程序的地址。另外,您可以呼叫SetWindowLong给指定按钮设定一个新的窗口消息处理程序,这个技术叫做「窗口子类别化」,非常有用。它能让您给现存的窗口消息处理程序设定「挂勾」,以便在自己的程序中处理一些消息,同时将其它所有消息传递给旧的窗口消息处理程序。

对三个按钮中的每一个,COLORS1使用SetWindowLong来设定新的滚动条窗口消息处理程序的地址,并取得现存滚动条窗口消息处理程序的地址:

for(i=0;i<3;i++)
{
  hwndButton[i] =CreateWindow(TEXT("button"),ButtonName[i],WS_CHILD|BS_PUSHBUTTON,

            0,0,0,0, hwnd, (HMENU)i, (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);
  OldButtonWndProc[i] = (WNDPROC) SetWindowLong (hwndButton[i], GWL_WNDPROC, (LONG) NewWndProc)) ;
 }       

现在,函数 NewWndProc 得到了Windows发送到 hwndButton 中 的滚动条窗口消息处理程序的全部消息。窗口消息处理程序在接收到Tab或者Shift-Tab键时,就将输入焦点改变到下一个(或者上一个)按钮窗口。它使用CallWindowProc呼叫旧的按钮窗口消息处理程序。

LRESULT CALLBACK NewWndProc (HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
           int id = GetWindowLong (hwnd, GWL_ID) ;
           switch (message)
           {
           case WM_KEYDOWN :
                  if (wParam == VK_TAB)
                         SetFocus (GetDlgItem (GetParent (hwnd),
                   (id + (GetKeyState (VK_SHIFT) < 0 ? 2 : 1)) % 3)) ;
                  break ;

           case   WM_SETFOCUS :
                 idFocus = id ;
                  break ;
           }

           return CallWindowProc (OldButtonWndProc[id], hwnd, message, wParam,lParam) ;
}
时间: 2024-10-07 02:48:27

windows 编程 —— 子窗口类别化(Window Subclassing)的相关文章

windows 编程 —— 子窗口 与 子窗口控件

目录: 子窗口与主窗口的交互 子窗口控件 控件1 控件2 子窗口与主窗口的交互 创建窗口要:注册窗口类型 和 创造相应窗口实例 1 //注册窗口类型 2 wndclass.style = CS_HREDRAW | CS_VREDRAW ; 3 wndclass.lpfnWndProc = WndProc ; 4 wndclass.cbClsExtra = 0 ; 5 wndclass.cbWndExtra = 0 ; 6 wndclass.hInstance = hInstance ; 7 wn

windows编程--创建窗口

第一个win32程序,简单的创建窗口: #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("HelloWin")

父窗口调用iframe子窗口方法

一.父窗口调用iframe子窗口方法 1.HTML语法:<iframe name="myFrame" src="child.html"></iframe> 2.父窗口调用子窗口:myFrame.window.functionName(); 3.子窗品调用父窗口:parent.functionName(); 简单地说,也就是在子窗口中调用的变量或函数前加个parent.就行 4.父窗口页面源码: 复制代码 代码如下:<html> &

16 Windows编程——系统内置窗口子类型之edit、ComboBox

edit类型的子窗口 ES_MULTILINE:多行输入文本框 窗口的消息: WL_COMMAND: EN_CHANGE:当edit窗口内的文本内容改变的时候,edit子窗口给父窗口发送一个WL_COMMAND消息,其通知码是EN_CHANGE. WM_GETTEXT: 用SendMessage函数给edit窗口发送这个消息,同时,给wparam参数传递我们想要获得的字符个数,lParam传递一个内存块地址,sendMessage函数返回后,lParam指向的内存中,将保存获得的字符. WL_G

windows编程-窗口

//注意messagebox函数窗口名字必须使用TEXT函数包含 //句柄:返回标识资源的标志号 //常见句柄:窗口句柄(HWND) 图标句柄(HICON),光标句柄(HCURSOR),画刷句柄(HBRUSH) //CS 窗口类别 CW建立窗口 DT 绘制文字 IDI图示ID IDC 游标ID MB 消息框 SND 声音 WM 窗口消息 WS窗口样式 #include<Windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)

走进windows编程的世界-----窗口的注册及创建

1   窗口注册和创建 1.1WIN32 窗口程序创建步骤 1.WinMain入口函数的定义 2.WindowProc函数的定义 3.注册窗口类 RegisterClass.RegisterClassEX 4.创建窗口 CreateWindow.CreateWindowEx HWND CreateWindow( LPCTSTRlpClassName,//指向已注册的窗口类的名称的指针 LPCTSTRlpWindowName,//指向窗口名称的指针 DWORDdwStyle,//窗口的风格 int

《Windows程序设计》读书笔九 子窗口控件

第九章 子窗口控件 子窗口可以作为控制屏幕图形显示,响应用户输入,以及在有重要输入事件的时候通知另一窗口. 标准子窗口控件,按钮,复选框,编辑框,列表框,组合框,文本字符串和滚动条. 可以使用CreateWindow来创建子窗口控件,或者在程序的资源脚本里编辑好各种属性. 使用预定义控件不需要再注册相应的子窗口类,这些类已经存在于windows中并且已经有了预定义的名称. 在调用CreateWindow时,只需要使用该名称作为窗口类的参数即可. 在窗口表明直接创建子窗口,所涉及的任务比使用对话框

JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作

一.Iframe 篇 公共部分 //父对象得到子窗口的值 //ObjectID是窗口标识,ContentID是元素ID function GetValue(ObjectID,ContentID) { var IsIE = (navigator.appName == 'Microsoft Internet Explorer') if(IsIE) {//如果是IE alert(document.frames(ObjectID).document.getElementById(ContentID).i

总结js(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作

http://hi.baidu.com/yashua839/blog/item/131fdb2fe547ef221f3089af.html一.Iframe 篇 //&&&&&&&&&&&&&&&&&&&&公共方法开始&&&&&&&&&&&&&&a