分析Ezgui之SendMessage实现过程
2010-04-15 15:02
309 查看
C语言代码:
/****************************************************************************
U32 SendMessage(HWIN hWin,WINMESSAGE pmsg,U32 param1,U32 param2)
function: 向某个窗口发送一个消息,并在目标窗口回调函数执行好后才返回
(注意不要发系统消息给窗口,否则会引起不可知的错误)
Input: hWin 目标窗口句柄
pmsg 消息值
param1,param2 两个自定义参数
return: 不定
example: SendMessage(hWin,WM_LISTBOX_VSCROLL_MOVE,ptr->hlistbox1,0);
******************************************************************************/
U32 SendMessage(HWIN hWin, WINMESSAGE Message, U32 param1, U32 param2)
{
WINCALLBACK *callback;
if ( !IsAValidHWIN(hWin) )
return 0;
callback = hh_H2P(hWin)->lpWinInfo->lpfnWndProc;
return callfunc_4(hWin, Message, param1, param2, callback);
}
U32 callfunc_4(U16 hWin, U16 Message, U32 param1, U32 param2, WINCALLBACK wincallback)
{
return (*wincallback)(hWin, Message, param1, param2);
}
//SendMessage前四行目的是找到hWin窗口的回调函数,具体实现如下:
//第五行调用一个函数,其功能是返回回调函数指针
/********************************我是开心的分割线************************************
typedef U32 WINCALLBACK(HWIN,WINMESSAGE,U32,U32);
PWIN hh_H2P(HWIN hWin)
{
if(hWin>=MaxMumWin)return 0;
return WINARRAY[hWin];
}
PWIN WINARRAY[MAXNUMWIN];
typedef struct tagWIN WIN,*PWIN;
typedef struct tagWINCLASS WINCLASS, *PWINCLASS;
//这个结构是在内部ram中的
struct tagWIN{
RECT rc; //以窗口的绝对坐标定义的rect
HWIN hNextLin; //在z序中下一个窗口的句柄
HWIN hParent,hFirstChild, hNext; //父,第一子,下一个兄弟句柄
HWIN ModelWin;
U32 Status; //窗口状态
PWINCLASS lpWinInfo; //指向WINCLASS结构的远指针
U16 Cursor_type; //光标类型及状态
U32 Cursor_x; //当前窗口的光标坐标
U32 Cursor_y;
void* lpExt;
};
struct tagWINCLASS{
char ActiveKey;
U16 style; //窗口类风格,目前只有WM_ST_CLOSE风格有效
U16 FgColor; //窗口字前景色
U16 BkColor; //窗口字背景色
U16 FillColor; //窗口填充色,注意这也是任何绘图使用的颜色
void* lpUserData; //指向一个用户数据的远指针,用户可以用它来保存任何东东,系统没有使用
WINCALLBACK *lpfnWndProc; //回调函数指针
I32 WinFont; //当前窗口使用的字体
unsigned char *lpWindowText; //若是按钮或带标题栏的窗口,这里的文本将显示在应该出现的地方
unsigned short* lpIcon; //暂没使用
unsigned char* lpMenu; //暂没使用
};
//****************************开心的分割线的底部****************************************/
/****************************************************************************
U32 SendMessage(HWIN hWin,WINMESSAGE pmsg,U32 param1,U32 param2)
function: 向某个窗口发送一个消息,并在目标窗口回调函数执行好后才返回
(注意不要发系统消息给窗口,否则会引起不可知的错误)
Input: hWin 目标窗口句柄
pmsg 消息值
param1,param2 两个自定义参数
return: 不定
example: SendMessage(hWin,WM_LISTBOX_VSCROLL_MOVE,ptr->hlistbox1,0);
******************************************************************************/
U32 SendMessage(HWIN hWin, WINMESSAGE Message, U32 param1, U32 param2)
{
WINCALLBACK *callback;
if ( !IsAValidHWIN(hWin) )
return 0;
callback = hh_H2P(hWin)->lpWinInfo->lpfnWndProc;
return callfunc_4(hWin, Message, param1, param2, callback);
}
U32 callfunc_4(U16 hWin, U16 Message, U32 param1, U32 param2, WINCALLBACK wincallback)
{
return (*wincallback)(hWin, Message, param1, param2);
}
//SendMessage前四行目的是找到hWin窗口的回调函数,具体实现如下:
//第五行调用一个函数,其功能是返回回调函数指针
/********************************我是开心的分割线************************************
typedef U32 WINCALLBACK(HWIN,WINMESSAGE,U32,U32);
PWIN hh_H2P(HWIN hWin)
{
if(hWin>=MaxMumWin)return 0;
return WINARRAY[hWin];
}
PWIN WINARRAY[MAXNUMWIN];
typedef struct tagWIN WIN,*PWIN;
typedef struct tagWINCLASS WINCLASS, *PWINCLASS;
//这个结构是在内部ram中的
struct tagWIN{
RECT rc; //以窗口的绝对坐标定义的rect
HWIN hNextLin; //在z序中下一个窗口的句柄
HWIN hParent,hFirstChild, hNext; //父,第一子,下一个兄弟句柄
HWIN ModelWin;
U32 Status; //窗口状态
PWINCLASS lpWinInfo; //指向WINCLASS结构的远指针
U16 Cursor_type; //光标类型及状态
U32 Cursor_x; //当前窗口的光标坐标
U32 Cursor_y;
void* lpExt;
};
struct tagWINCLASS{
char ActiveKey;
U16 style; //窗口类风格,目前只有WM_ST_CLOSE风格有效
U16 FgColor; //窗口字前景色
U16 BkColor; //窗口字背景色
U16 FillColor; //窗口填充色,注意这也是任何绘图使用的颜色
void* lpUserData; //指向一个用户数据的远指针,用户可以用它来保存任何东东,系统没有使用
WINCALLBACK *lpfnWndProc; //回调函数指针
I32 WinFont; //当前窗口使用的字体
unsigned char *lpWindowText; //若是按钮或带标题栏的窗口,这里的文本将显示在应该出现的地方
unsigned short* lpIcon; //暂没使用
unsigned char* lpMenu; //暂没使用
};
//****************************开心的分割线的底部****************************************/
相关文章推荐
- Linux内核--网络栈实现分析(二)--数据包的传递过程(上)
- DXUTBlendColor::Blend()实现DirectX3D窗口GUI动态组件的分析研究(多图)
- U-boot在开发板上移植过程详解(3)---U-boot实现源码分析(第二阶段)
- 气液路分析实现过程简录
- 算法分析之归并排序——算法整体实现过程
- Spring3.1.0实现原理分析(十).AOP之代理对象执行拦截过程
- printf_系统调用过程分析_write() putc() 函数实现
- 第二人生的源码分析(10)登录授权的实现过程
- 编译原理(六) LL(1)文法分析法(分析过程的C++实现)
- elk实时日志分析平台部署搭建详细实现过程
- 浅谈SQL Server所实现创建分页功能的存储过程的分析及代码
- node中javascript调用c++实现过程分析
- 举例分析可变参数函数实现的过程
- 分析一个通用的rtsp server实现过程串联模块
- Linux内核--网络栈实现分析(七)--数据包的传递过程(下)
- BFPRT算法过程分析和实现
- OpenStack建立实例完整过程源码详细分析(13)----依据AMQP通信架构实现消息发送机制解析之二
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)
- 关于Ext3.0中按条件查询并重新加载Grid中的数据的实现过程及store.load的分析
- SQLServer 2005 实现数据库同步备份 过程-结果-分析