我编写了一个文档视图的动态库,定义了接口输出函数,来显示这个文档视图界面,代码如下:
extern "C" __declspec(dllexport) int __stdcall ShowWindow()
{
     CDllFrameWnd  dllwnd;//文档视图类定义
    dllwnd.CreateFrameWnd();//生成并显示文档视图
    return 0;
}在动态库的调用程序里面,可以调用上述动态库中的文档视图界面并显示,但是一闪而过,无法对上面的菜单和按钮操作,不知道怎么解决?另外看了下消息循环,修改了代码增加了peekmessage()函数,进行判断如果不是WM_CLOSE消息,就不返回,修改后代码如下:
extern "C" __declspec(dllexport) int __stdcall ShowWindow()
{
     CDllFrameWnd  dllwnd;//文档视图类定义
    dllwnd.CreateFrameWnd();//生成并显示文档视图
//消息环
    MSG msg;
    while(TRUE)
    {
      if(PeekMessage(hwnd,msg,0,PM_NONREMOVE))
         {
             if (msg.lparam == WM_CLOSE)
              {
               break;
               }
              else
               {
                 TranslateMessage();
                 DispatchMessage();
                }
          }
          else
          WaitMessage();//其他线程
     }
    return 0;
}加入此消息处理函数后,文档视图可以显示,不会一闪而过,但是窗口上的菜单和按钮控件无法点击,不知道如何解决?或者我这种解决文档视图界面的一闪而过的方法是错误的,望各位大侠拍砖!

解决方案 »

  1.   

    错大了;第一种情况下,刚刚创建窗口,马上执行析构函数,就销毁窗口了;第二种情况,外面的 exe 的消息循环完蛋了;建议,使用 new 创建对象,...
      

  2.   

    在ShowWindow函数中加上下面代码试一试AFX_MANAGE_STATE(AfxGetStaticModuleState());
      

  3.   

    VC++动态链接库编程之MFC DLL 资源模块句柄切换的三种方法
    http://hi.baidu.com/guqiwei/blog/item/b5908c777a52571fb051b907.html可能是上述原因导致
      

  4.   

    if(PeekMessage(hwnd,msg,0,PM_NONREMOVE))
      {
      if (msg.lparam == WM_CLOSE)
    这里也不对啊
    PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)WM_CLOSE = msg.message
      

  5.   


    这个错误不是主要原因,已经修改,错在PeekMessage的参数PM_NOREMOVE(原问题中有笔误),应该改为PM_REMOVE,就是读取消息后删除,再用TranslateMessage();和DispatchMessage();重新派发,这样这个显示的窗口才能接受消息,否则会一直PeekMessage(),无法派发消息,消息函数不能响应执行,所以窗口就会一直灰死,无法接收新消息,也无法执行消息响应函数。问题已解决。