找回密码
 立即注册

QQ登录

只需一步,快速开始

siberlee
金牌服务用户   /  发表于:2015-5-29 16:29  /   查看:4670  /  回复:2
你好!
我们的软件是MFC程序,我通过使用公共运行时编译的dll,使用托管c++调用.net的wpf窗体,窗体放的控件是ActiveReports。附件中传了一个我写的Demo。程序中的界面如下,有两个报表启动命令。“打开报表”与“打开报表失败”

“打开报表”命令是通过调用一个Wpf窗口,然后通过这个窗体再调用有ActiveReports控件的窗体,是可以正常显示出报表的。效果如下图。

“打开报表失败”命令是直接用/clr dll调用的ActiveReports控件所在的窗体,这个会出现线程方面的问题。尝试过使用UIt线程来解决这个问题,但是没有成功,效果如下图。但是不加截模板的时候,窗口是可以正常显示的。

Demo的运行环境是VS2010,请帮我看下打开报表失败的原因,看看是否有解决这个问题方法。直接用/clr dll调用的ActiveReports控件所在的窗体才是我们软件的需求。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

2 个回复

倒序浏览
frank.zhang
社区贡献组   /  发表于:2015-5-29 17:31:00
沙发
您好,
您的问题我们已经收到,在一个工作日内进行反馈。
回复 使用道具 举报
frank.zhang
社区贡献组   /  发表于:2015-6-1 17:39:00
板凳
您好,
这个问题主要是由于创建的MFC的UI线程是后台线程导致的。
需要修改代码
  1. WindowInteropHelper^ GetInteropHandler()
  2. {
  3.         CHostWPFWnd::hostedWnd = gcnew MainWindow();
  4.         //CHostWPFWnd::hostedWnd->ClickEvent += gcnew WindowTest::ButtonClickHandler(Add);
  5.         WindowInteropHelper^ wih = gcnew WindowInteropHelper(CHostWPFWnd::hostedWnd);
  6.         return wih;
  7. }

  8. HWND GetHwnd(HWND hwnd)
  9. {
  10.         //System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(new System.Func<IntPtr>(()=>IntPtr.Zero));
  11.         System::Object^ obj = System::Windows::Threading::Dispatcher::CurrentDispatcher->Invoke(
  12.                 gcnew System::Func<WindowInteropHelper^>(&amp;GetInteropHandler));

  13.         //CHostWPFWnd::hostedWnd = gcnew MainWindow();
  14.         ////CHostWPFWnd::hostedWnd->ClickEvent += gcnew WindowTest::ButtonClickHandler(Add);
  15.         //WindowInteropHelper^ wih = gcnew WindowInteropHelper(CHostWPFWnd::hostedWnd);
  16.         WindowInteropHelper^ wih = static_cast<WindowInteropHelper^>(obj);
  17.         wih->Owner = IntPtr(hwnd);
  18.         CHostWPFWnd::hWnd = (HWND) wih->Handle.ToPointer();
  19.         return CHostWPFWnd::hWnd;
  20. }
复制代码

评分

参与人数 1满意度 +5 收起 理由
siberlee + 5 非常感谢您耐心的解答,谢谢!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部