关于Duilib,遇到一个小问题

Xomic 2014-02-17 10:19:20
使用Duilib,
(1)右键弹出菜单
(2)再点击菜单选项弹出模态对话框(ShowModal();)
(3)调用模态对话框的close()就崩溃了。
用过或熟悉duilib的大神,该怎么解决?感激不尽...
...全文
774 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
leehaoquan 2016-06-08
  • 打赏
  • 举报
回复
提主还在么? 问问另开线程怎么处理多窗口的问题
塞纳里奥 2015-10-08
  • 打赏
  • 举报
回复
选择菜单项后,采用异步的方式发送控件消息 m_pOwner->GetManager()->SendNotify(pControl,_T("memuselected"),(WPARAM)m_pOwner,NULL,true); 最后参数设置为true代表异步
Pincel 2015-08-25
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhuhongshu/article/details/42889709 机制里面有解释, 用法问题
lczero99 2014-10-31
  • 打赏
  • 举报
回复
duilib 这个问题很烦人。 菜单本身会有个消息循环。一旦在这里面创建了模态对话框。再关掉模态对话框。就报各种错。 一直想尝试让菜单关掉之后,再去执行弹出对话框的操作。但是用消息也不行。目前没找到解决办法。
u010672692 2014-08-29
  • 打赏
  • 举报
回复
请楼主具体指教一下怎么解决的啊,非常感谢
houying910523 2014-04-01
  • 打赏
  • 举报
回复
楼主你好,问个问题,我用ShowModal显示子窗口,在子窗口里发送WM_CLOSE后ShowModal返回,但是主程序也退出了,怎么实现子窗口退出但是父窗口不退出啊?
Xomic 2014-02-17
  • 打赏
  • 举报
回复
引用 1 楼 thefirstz 的回复:
调试下啊,看看crash的时候堆栈内容

看过!堆栈显示是PopMenu的消息处理函数HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)。
创建非模态没有问题,估计创建菜单再弹出模态消息发送不对!不知道怎么改啊...
昵称很不好取 2014-02-17
  • 打赏
  • 举报
回复
调试下啊,看看crash的时候堆栈内容
Xomic 2014-02-17
  • 打赏
  • 举报
回复
引用 10 楼 huangxiangbo316 的回复:
学习了。Duilib还是第一次知道,国产的,顶一个。
都在学习当中的!呵呵
Xomic 2014-02-17
  • 打赏
  • 举报
回复
谢谢两位热心朋友!另外开启一个线程实现相同效果...结贴!
huangxiangbo316 2014-02-17
  • 打赏
  • 举报
回复
学习了。Duilib还是第一次知道,国产的,顶一个。
Xomic 2014-02-17
  • 打赏
  • 举报
回复
引用 8 楼 thefirstz 的回复:
[quote=引用 7 楼 ljun12358 的回复:] [quote=引用 5 楼 zhoujielunzhimi 的回复:] 点击菜单选项弹出模态对话框(ShowModal(); 我也是用的Duilib,我们也遇到过这个问题。 点击菜单事件是在按下的时候去执行的,此时弹出modal是不好的,我建议这么做: 给主窗口去发一个 WM_xxx 自定义消息来弹出模态窗口。
我之前试过,好像不行!就好像菜单失去焦点之后,当关闭模态对话框时,菜单的后续动作都是未知的![/quote] close()什么时候调用的,是点上面的叉(x)关闭时候调用吗? 把close的实现发上来 感觉像是野指针引起的,非模态不崩溃也是偶然。[/quote] 是的,点 X 就关了! void CWindowWnd::Close(UINT nRet) { ASSERT(::IsWindow(m_hWnd)); if( !::IsWindow(m_hWnd) ) return; PostMessage(WM_CLOSE, (WPARAM)nRet, 0L); } 这是lib库里面的函数。 我觉得是模态对话框夺走了PopMenu的焦点的原因,因为不是从PopMenu弹出的模态是没有问题的。搞了一下午了~试过发送消息,开线程都不理想!
昵称很不好取 2014-02-17
  • 打赏
  • 举报
回复
引用 7 楼 ljun12358 的回复:
[quote=引用 5 楼 zhoujielunzhimi 的回复:] 点击菜单选项弹出模态对话框(ShowModal(); 我也是用的Duilib,我们也遇到过这个问题。 点击菜单事件是在按下的时候去执行的,此时弹出modal是不好的,我建议这么做: 给主窗口去发一个 WM_xxx 自定义消息来弹出模态窗口。
我之前试过,好像不行!就好像菜单失去焦点之后,当关闭模态对话框时,菜单的后续动作都是未知的![/quote] close()什么时候调用的,是点上面的叉(x)关闭时候调用吗? 把close的实现发上来 感觉像是野指针引起的,非模态不崩溃也是偶然。
Xomic 2014-02-17
  • 打赏
  • 举报
回复
引用 5 楼 zhoujielunzhimi 的回复:
点击菜单选项弹出模态对话框(ShowModal();

我也是用的Duilib,我们也遇到过这个问题。 点击菜单事件是在按下的时候去执行的,此时弹出modal是不好的,我建议这么做:
给主窗口去发一个 WM_xxx 自定义消息来弹出模态窗口。

我之前试过,好像不行!就好像菜单失去焦点之后,当关闭模态对话框时,菜单的后续动作都是未知的!
Xomic 2014-02-17
  • 打赏
  • 举报
回复
引用 1 楼 thefirstz 的回复:
调试下啊,看看crash的时候堆栈内容

估计你是爱莫能助!谢谢你的热心,我来截图发堆栈,贴代码:

void OnSetIp(std::string str)
{
CIPSetFrame * IPSetFrame = new CIPSetFrame();

if( IPSetFrame == NULL ) { Close(); return ; }

IPSetFrame->Create(m_hWnd, _T(""), UI_WNDSTYLE_DIALOG, 0, 0, 0, 0, 0, NULL);

IPSetFrame->CenterWindow();

IPSetFrame->SetHostName(str);

//IPSetFrame->ShowWindow();

IPSetFrame->ShowModal();
return;
}

IPSetFrame是对话框的类。
堆栈点进去之后:
LRESULT CPopMenu::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRes = 0;
BOOL bHandled = TRUE;
switch( uMsg ) {
case WM_CREATE: lRes = OnCreate(uMsg, wParam, lParam, bHandled); break;
case WM_KILLFOCUS: lRes = OnKillFocus(uMsg, wParam, lParam, bHandled); break;
case WM_KEYDOWN: lRes = OnKeyDown(uMsg, wParam, lParam, bHandled); break;
case WM_MOUSEWHEEL: break;
case WM_SIZE: lRes = OnSize(uMsg, wParam, lParam, bHandled); break;

default:
bHandled = FALSE;
}
if( bHandled ) return lRes;
if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;
return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
}

最后一行。CPopMenu是右键菜单类,原duilib库demo的,没改。
sumos 2014-02-17
  • 打赏
  • 举报
回复
点击菜单选项弹出模态对话框(ShowModal(); 我也是用的Duilib,我们也遇到过这个问题。 点击菜单事件是在按下的时候去执行的,此时弹出modal是不好的,我建议这么做: 给主窗口去发一个 WM_xxx 自定义消息来弹出模态窗口。
昵称很不好取 2014-02-17
  • 打赏
  • 举报
回复
引用 3 楼 thefirstz 的回复:
[quote=引用 2 楼 ljun12358 的回复:] [quote=引用 1 楼 thefirstz 的回复:] 调试下啊,看看crash的时候堆栈内容
看过!堆栈显示是PopMenu的消息处理函数HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)。 创建非模态没有问题,估计创建菜单再弹出模态消息发送不对!不知道怎么改啊...[/quote] window图形界面我也不懂,你把crash时候堆栈发上来看看[/quote] 点击close时候的界面也截图发上来
昵称很不好取 2014-02-17
  • 打赏
  • 举报
回复
引用 2 楼 ljun12358 的回复:
[quote=引用 1 楼 thefirstz 的回复:] 调试下啊,看看crash的时候堆栈内容
看过!堆栈显示是PopMenu的消息处理函数HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)。 创建非模态没有问题,估计创建菜单再弹出模态消息发送不对!不知道怎么改啊...[/quote] window图形界面我也不懂,你把crash时候堆栈发上来看看

64,371

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧