前提:在创建对话框以后,对齐进行整个移动,MoveWindow()的操作(这里我们是输入框向上移动)
操作:然后通过CreateMainWindowIndirectParam()创建一个新的对话框(这里我们是基于对话框创建创建键盘),这个ui卡住,但是不崩溃
问题排查:
通过CreateMainWindowIndirectParam()创建基于对话框的键盘会默认
走到dialog.c中
hMainWin = CreateMainWindowEx (&CreateInfo,
werdr_name, we_attrs, window_name, layer_name);
如上的创建函数里面。
进一步跟到:window.c中
if (SendMessage (HWND_DESKTOP, MSG_ADDNEWMAINWIN, (WPARAM) pWin, 0) < 0)
goto err;
进一步跟到:desktop-comm.c中
case MSG_ADDNEWMAINWIN:
#ifdef _MGHAVE_MENU
if (sg_ptmi)
dskForceCloseMenu ();
#endif
return dskAddNewMainWindow(pWin);
再跟到:desktop.c中
dskMoveWindow
AllocZOrderNodeEx()函数:
到这个函数走不下去了,发现卡在lock_zi_for_change(zi)走不下去了,发现该值为负值溢出为正,导致进行一次unlock后没有归零,无法进行写操作。
然后分析前后因果关系发现是由MoveWindow()导致的,所以去检查MoveWindow();
跟到:desktop.c中的
dskMoveWindow()函数中:发现在 update_client_window_rgn (nodes [idx_znode].cli,
nodes [idx_znode].hwnd);
这句下面有一句
/* unlock zi for change ... */
unlock_zi_for_change (zi);
解锁函数,这里与minigui3不同样,minigui3将这句话放在了稍微前面一点的EmptyClipRgn (&sg_UpdateRgn);之后;
看到提交记录里面有对其进行一个修改,但是修改并不生效。
*******归结起来分析出来就是在desktop.c中的dskMoveWindow()函数中,有一句unlock_zi_for_change (zi);被移动了位置,导致进行一次unlock后没有归零,无法进行写操作,但是我尝试按照3.0的思路移动到前面,却不起任何作用,打算跟一步跟进的时候发现内部实现过于复杂了,所以想问一下是不是有解决方法
前提:在创建对话框以后,对齐进行整个移动,MoveWindow()的操作(这里我们是输入框向上移动)
操作:然后通过CreateMainWindowIndirectParam()创建一个新的对话框(这里我们是基于对话框创建创建键盘),这个ui卡住,但是不崩溃
问题排查:
通过CreateMainWindowIndirectParam()创建基于对话框的键盘会默认
走到dialog.c中
hMainWin = CreateMainWindowEx (&CreateInfo,
werdr_name, we_attrs, window_name, layer_name);
如上的创建函数里面。
进一步跟到:window.c中
if (SendMessage (HWND_DESKTOP, MSG_ADDNEWMAINWIN, (WPARAM) pWin, 0) < 0)
goto err;
进一步跟到:desktop-comm.c中
case MSG_ADDNEWMAINWIN:
#ifdef _MGHAVE_MENU
if (sg_ptmi)
dskForceCloseMenu ();
#endif
return dskAddNewMainWindow(pWin);
再跟到:desktop.c中
dskMoveWindow
AllocZOrderNodeEx()函数:
到这个函数走不下去了,发现卡在lock_zi_for_change(zi)走不下去了,发现该值为负值溢出为正,导致进行一次unlock后没有归零,无法进行写操作。
然后分析前后因果关系发现是由MoveWindow()导致的,所以去检查MoveWindow();
跟到:desktop.c中的
dskMoveWindow()函数中:发现在 update_client_window_rgn (nodes [idx_znode].cli,
nodes [idx_znode].hwnd);
这句下面有一句
/* unlock zi for change ... */
unlock_zi_for_change (zi);
解锁函数,这里与minigui3不同样,minigui3将这句话放在了稍微前面一点的EmptyClipRgn (&sg_UpdateRgn);之后;
看到提交记录里面有对其进行一个修改,但是修改并不生效。
*******归结起来分析出来就是在desktop.c中的dskMoveWindow()函数中,有一句unlock_zi_for_change (zi);被移动了位置,导致进行一次unlock后没有归零,无法进行写操作,但是我尝试按照3.0的思路移动到前面,却不起任何作用,打算跟一步跟进的时候发现内部实现过于复杂了,所以想问一下是不是有解决方法