|
|
发表于 2008-4-1 12:29:00
|
显示全部楼层
Re:请大家教我GUI编程入门
我是这方面的专家,可以教你,但你不能商用。
FAQ
A instemast有什么资格自称专家?
Q 几年前就做过UI,RpgDIY历史纪录里头都有的。
A 有什么强的地方?
Q 我举个例子,WinXP的语言兰:
拖动语言兰,不要松开鼠标,然后Alt+TAB切换到其他窗口,
然后继续移动鼠标,发现语言兰不会动了,把鼠标移动到语言兰之外,
这时再松开鼠标,然后,不要按下任何建,移动鼠标到语言兰左侧的可拖动区域,
会发现语言兰会跟鼠标移动。。。需要点击一下鼠标,才会恢复正常。
分析如下:
void CUI::ReleaseCapture()
{
//释放了cap之后,这个刚才的cap窗体,仍然是活动窗体(顶层),
//就是说,他现在不会失活!(如果以后有别的窗体cap,或者别的窗体activate,那么到那时它才会失活!)
if(!m_pCapForm)return;
m_pForms->Add(m_pCapForm);
m_pCapForm=null;
m_CapUsage=CU_NOCAPTURE;
//一般来说,如果拖动过程中cap被释放,那么就说明将会有其他的cap了,那么被释放的cap会失活!然后拖动中止
//有一种极端情况:拖动过程中cap被释放,然后没有其他窗体cap或activate...
//不过,在这种极端情况下,大多也没有关系,因为如果鼠标在该窗体之外,那么什么也不发生,
//如果鼠标在窗体范围内移动(低层事件!包括子控件),那么,由于检查到button==0(一般是这样),拖动会中止。
//(不在MouseMove中检查button的话,会出现奇怪的结果)
//极端之极端:如果用户一直不释放鼠标button==1,那么,鼠标移到窗体内时,仍然可以继续拖动,但是!
//因为没有了cap,所以拖动过程很困难。
//解决办法 1)如果当前的cap不是this窗体(button==1的情况),那么,取消拖动;
//(2)如果当前的cap不是this窗体(button==1的情况)那么,重新设置cap
//前几天经常发现语言栏在拖动时的奇怪现象。。。所以。。。
//微软的在拖动时意外丢失cap但没有失活的情况:(alt+tab切换时,cap总是会丢失)
//注意:微软的其他的东西和我不同!这里只是说,在拖动时丢失cap但没有失活的情况
//(1)拖动普通窗口然后alt+tab:不会出错!因为被拖动的窗口会失活!(说明微软把cap和非cap都放在一个list里!)
//(2)拖动语言栏然后alt+tab:很糟糕!微软连MouseMove时候的button==0都没有检查
//后来发现,我的UI测试程序,当Alt+Tab切换时,拖动着的Form竟然会出错!(其实UI类库自身没有错!)
//错误的原因不是UI类库,而是测试程序的app.cpp中,button值没有正确地维护。(没有使用DI)
//按照原先的WinProc代码,当capture丢失时,就收不到BUTTON UP消息,导致button的值出错
//所以,估计微软不是没有检查button,而是button值没有正确地维护。
//维护鼠标的程序,需要这样改一下:case WM_MOUSEMOVE:if(GetCapture()!=g_hwnd)btn=0;OnMouse(_move,btn);break;
}
|
|