分析Ezgui之SendMessage实现过程

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;                    //暂没使用
};
//****************************开心的分割线的底部****************************************/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值