所有的系统内置控件的事件都在这里
enum SOUI_EVENTS
{
EVT_INIT=8000,
EVT_EXIT,
EVT_TIMER,
//基本窗口事件
EVT_SETFOCUS=8100,
EVT_KILLFOCUS,
EVT_CREATE,
EVT_DESTROY,
EVT_SIZE,
EVT_VISIBLECHANGED,
EVT_STATECHANGED,
EVT_LBUTTONDOWN,
EVT_LBUTTONUP,
EVT_UPDATE_TOOLTIP,
EVT_KEYDOWN=8200,
//两个窗口鼠标状态事件
EVT_MOUSE_HOVER=9000,
EVT_MOUSE_LEAVE,
EVT_CMD=10000,
EVT_CTXMENU,
//增加两个滚动VIEW的事件
EVT_SCROLLVIEW_ORIGINCHANGED,
EVT_SCROLLVIEW_SIZECHANGED,
EVT_SCROLL,
EVT_OFEVENT, //消息二次包装
EVT_OFPANEL, //一个itemPanel中的消息的二次包装
//增加4个itempanel相关的事件,经过EVT_OFPANEL到达应用层
EVT_ITEMPANEL_CLICK,
EVT_ITEMPANEL_DBCLICK,
EVT_ITEMPANEL_RCLICK,
EVT_ITEMPANEL_HOVER,
EVT_ITEMPANEL_LEAVE,
EVT_TAB_SELCHANGING=11000,
EVT_TAB_SELCHANGED,
EVT_TAB_ITEMHOVER,
EVT_TAB_ITEMLEAVE,
EVT_LB_SELCHANGING=12000,
EVT_LB_SELCHANGED,
EVT_LB_DBCLICK,
EVT_LC_SELCHANGING=13000,
EVT_LC_SELCHANGED,
EVT_LC_ITEMDELETED,
EVT_LC_DBCLICK,
EVT_TV_SELCHANGING = 14000,
EVT_TV_SELCHANGED,
EVT_TC_SELCHANGING=15000,
EVT_TC_SELCHANGED,
EVT_TC_EXPAND,
EVT_TC_CHECKSTATE,
EVT_TC_DBCLICK, //treectrl的叶子节点双击事件, add by zhaosheng
EVT_LV_SELCHANGING = 15100,
EVT_LV_SELCHANGED,
EVT_LV_ITEMCLICK,
EVT_RE_NOTIFY=16000,
EVT_RE_MENU,
EVT_SLIDER_POS=17000,
EVT_HEADER_CLICK=18000,
EVT_HEADER_ITEMCHANGING,
EVT_HEADER_ITEMCHANGED,
EVT_HEADER_ITEMSWAP,
EVT_CB_SELCHANGE=19000,
EVT_CB_DROPDOWN,
EVT_CALENDAR_SELDAY=20000,
EVT_CALENDAR_SETDATE,
EVT_CALENDAREX_CHANGED,
EVT_DATETIME_CHANGED,
EVT_SPIN_VALUE2STRING = 21000,
EVT_SPLIT_PANE_MOVED = 22000,
EVT_HOT_KEY_SET = 23000,
//图片动画开始,结束事件
EVT_ANI_START = 22100,
EVT_ANI_STOP,
EVT_SELECTMENU = 22150,
EVT_EXTERNAL_BEGIN=10000000,
};
将枚举的事件放在一个宏定义中;
SEVENT_BEGIN_EX(EventCBSelChange, EVT_CB_SELCHANGE, on_combobox_sel_change, SOUI_EXP)
int nCurSel;
SEVENT_END()
宏定义的写法
#define SEVENT_BEGIN_EX(evt,id,evt_name, api) \
class evt : public SOUI::EventArgs \
{ \
public:\
virtual int GetID() const { return evt::EventID; }\
virtual LPCWSTR GetName() const { return evt::GetClassName(); }\
SOUI_CLASS_NAME(evt,L#evt_name ) \
enum {\
EventID = id\
};\
evt(SObject *pSender) :EventArgs(pSender){}\
#define EVT_EXP
#define SEVENT_BEGIN(evt,id) \
SEVENT_BEGIN_EX(evt,id,L"on_"#evt, EVT_EXP)
#define SEVENT_END()\
};
自己定义一个comboobx的下拉选择事件
EVENT_NAME_HANDLER(L"comHisModuleSel",EventCBSelChange::EventID,OnCBSelChange)
响应函数的声明与定义
void OnCBSelChange(EventArgs* pEvt);
void OnCBSelChange (EventArgs *e)
{
EventCBSelChange *e2=sobj_cast<EventCBSelChange>(e);
SComboBox *pCbx = sobj_cast<SComboBox>(e2->sender);
if(e2->nCurSel!=-1)
{
SStringT str = pCbx->GetLBText(e2->nCurSel);
str=str.Mid(1,str.GetLength()-1-strlen("Interpolator"));
IInterpolator * pInterpolator = CREATEINTERPOLATOR(S_CT2W(str));
if(pInterpolator)
{
SInterpolatorView *pView = FindChildByID2<SInterpolatorView>(R.id.view_interpolator);
pView->SetInterpolator(pInterpolator);
pInterpolator->Release();
}
}
}
其余事件的写法基本类似。
宏定义EVENT_MAP_BEGIN()
处理控件的事件;
宏定义BEGIN_MSG_MAP_EX(CMainDlg)
处理这个窗口类的一些时间
例:
EVENT_MAP_BEGIN()
EVENT_NAME_COMMAND(L"btn_close", OnClose)
EVENT_NAME_COMMAND(L"btn_min", OnMinimize)
EVENT_NAME_COMMAND(L"btn_max", OnMaximize)
EVENT_NAME_COMMAND(L"btn_restore", OnRestore)
EVENT_NAME_COMMAND(L"btn_menu", OnMenu)
EVENT_NAME_COMMAND(L"btn_skin", OnSkin)
EVENT_ID_RANGE_HANDLER(10,27,EVT_CMD,OnSetSkin)
EVENT_NAME_HANDLER(L"comHisModuleSel",EventCBSelChange::EventID,OnCBSelChange)
EVENT_NAME_HANDLER(L"listModule",EventLBDbClick::EventID,OnLBDbClick)
EVENT_NAME_HANDLER(L"listModule",EVT_INIT,OnLBDbClick)
EVENT_MAP_END()
BEGIN_MSG_MAP_EX(CMainDlg)
MSG_WM_CREATE(OnCreate)
MSG_WM_INITDIALOG(OnInitDialog)
MESSAGE_HANDLER(g_dwSkinChangeMessage, OnSkinChange)
MSG_WM_CLOSE(OnClose)
MSG_WM_SIZE(OnSize)
MSG_WM_COMMAND(OnCommand)
CHAIN_MSG_MAP(SHostWnd)
REFLECT_NOTIFICATIONS_EX()
END_MSG_MAP()
上例中MSG_WM_CREATE,MSG_WM_INITDIALOG等都是此头文件中的宏定义。
1.消息定义
#define WM_MYMSG (WM_USER+1)
2.消息循环
BEGIN_MSG_MAP_EX(CMainDlg)
MESSAGE_HANDLER(WM_MYMSG,OnMyMsg)
END_MSG_MAP()
3.消息声明和处理
LRESULT OnMyMsg(UINT uMsg,WPARAM wp,LPARAM lp,BOOL & bHandled);
LRESULT OnMyMsg(UINT uMsg,WPARAM wp,LPARAM lp,BOOL & bHandled)
{
return 0;
}
4.发送消息
SendMessage(m_hWnd, MSG_SERIAL_WRITE, (WPARAM)buff, (LPARAM)nBuffBytes);
函数也可以是PostMessage。