问题:用java实现一个对话框(无所谓是否模式),在vc++里调用,要求对话框模式显示!分析:由于用java实现模式对话框需要jframe父窗体对象,所以,只能在java里构造一个非模式的对话框,给vc++调用.这样就要求在vc++里,将这个非模式对话框模拟成模式对话框.在vc++中,模式对话框与非模式对话框都是通过调用createdialogindirect()创建产生.模式对话框与非模式对话框区别在于:1.模式对话框将父窗体disable了.2.模式对话框有自己的消息循环.
解决:示例关键代码如下: 【程序编程相关:关于progma warning的小结 】
注意,虽然父窗体被disable了,但是父窗体仍然响应部分消息,例如wm_paint,当拖动父窗体上的模式对话框时,父窗体就响应wm_paint消息,绘制无效区域,擦去模式对话框上次覆盖父窗体留下的痕迹. 【推荐阅读:关于windows编程的一些心得 】
trace("still\n"); } 【扩展信息:《循序渐进学用Visual C++ 6.】
//测试对话框事件void cmainframe::ontestmodal(){ cstjni->getinstance()->showdlg();//通过jni显示java构造的非模式对话框 simulateblockdlgproc();//模拟阻塞的模式对话框处理
//主窗体位置.大小.z-order顺序改变时调用void cmainframe::onwindowposchanged(windowpos far* lpwndpos) { cframewnd::onwindowposchanged(lpwndpos);
//当激活主窗体时,java dialog仍然在主窗体上面 hwnd hactivation = ::findwindow("sunawtdialog", "java dialog"); if (hactivation) ::bringwindowtotop(hactivation);}
... 下一页