ucGUI鼠标拖动实现(DockDrop实现)

来源:互联网 发布:混乱之治mac 编辑:程序博客网 时间:2024/06/13 23:47

就像Windows程序里拖动一样的效果。

分析一下,鼠标拖动实际上就是在一个窗体上按下鼠标,改变鼠标的cursor图标再按下不放,移动鼠标,在任何一个窗体松开鼠标按钮。
主要是二个动作的处理:一个是按下鼠标,一个是松开的,都会在相应的窗体中产生事件。
要解决的一个问题是当我们按钮鼠标时,改变了鼠标的cursor图标,拖动鼠标到一个窗体,松开了按键,也许这个窗体并不是我们的目标窗体,这时我们需要把鼠标的cursor图标改回原来的,而我们又不可能在所有的窗体中都去写一个处理鼠标的cursor图标过程。所以我们在一个地方来处理鼠标松开时改变cursor图标过程。
ucGUI里的所有鼠标事件都会经过WMTouch.c里的WM_HandlePID过程来处理,这样需要在这个过程里截获对应的事件,实际就是WM_PID_STATE_CHANGED事件,而我们要在一个对应的地方调用恢复鼠标的cursor图标问题,我想WM_HBKWIN窗体是一个很好的地方,这样我们在WM_HandlePID里产生WM_PID_STATE_CHANGED事件处理时,把所有的事件也转发给WM_HBKWIN窗体.
我们新增一个自己的消息:
#define WM_PID_STATE_CHANGED_ALL    45

加如下的代码:

if(CHWin.hWin != WM_HBKWIN)
{
WM_PID_STATE_CHANGED_INFO Info2;
Info2.x = Info.x;
Info2.y = Info.y;
Info2.State = Info.State;
Info2.StatePrev = Info.StatePrev;
WM_MESSAGE Msg2;
Msg2.Data.p = &Info2;
Msg2.hWinSrc = Msg.hWinSrc;
Msg2.MsgId = WM_PID_STATE_CHANGED_ALL;
WM_SendMessage(WM_HBKWIN,&Msg2);
}



这样我们所有的窗体的鼠标事件都会发给WM_HBKWIN窗体,我们在WM_HBKWIN窗体的回调里再处理:
case WM_PID_STATE_CHANGED_ALL:          //所有窗体发生WM_PID_STATE_CHANGED这个事件,都会发到这里
{
WM_PID_STATE_CHANGED_INFO * cinfo = (WM_PID_STATE_CHANGED_INFO *)(pMsg->Data.p);
//按钮的任何一次单击松开
if(cinfo->State == 0){
DropDevSelectID = -1;
GUI_CURSOR_Select(&GUI_CursorArrowS);//改回默认的图标
}
break;
}


DropDevSelectID是一个我用来记录信息的一个变量,当在源窗体上按下鼠标拖动时,我就用DropDevSelectID记录下当时选择的对像.如下:
//按钮拖动
if(NCode == WM_NOTIFICATION_CLICKED){
if(Id == GUI_ID_LISTBOX0){
DropDevSelectID = getSelectpDevID();  //设置当前选择的ID 
if(DropDevSelectID == -1)
break;
GUI_CURSOR_Select(&GUI_CursorCrossL);  //改变鼠标的一个图标。
}
}


上面的 DropDevSelectID = getSelectpDevID()就是记录一下当前选择的一个对像ID,这样我们在上面的松开鼠标处理过程里就知道选择的是什么了。


好了,我们还要在目的窗体中处理鼠标松开事件:
case WM_PID_STATE_CHANGED:
    //如果这个变量记录了一个对像,就认为是从另一个窗体来的拖动
if(DropDevSelectID != -1)
{
。。。;//处理
}



      这样就实现了一个窗对拖动的DockDrop功能,当然像这样,有多次个DockDrop功能我们这样就得处理多少个类似DropDevSelectID的变量,实际上在一个应用里,

我们的鼠标在一个时间点只有一个拖动的动作,这样我们可以定义一个通用的对像来处理,具体的就自己怎么做了!

    对于鼠标的图标可以自己定义一个GUI_CURSOR对像,指定自己的图标。


以前的代码实现,现在搞上来.

原创粉丝点击