我编写了一个文档视图的动态库,定义了接口输出函数,来显示这个文档视图界面,代码如下:
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;
}加入此消息处理函数后,文档视图可以显示,不会一闪而过,但是窗口上的菜单和按钮控件无法点击,不知道如何解决?或者我这种解决文档视图界面的一闪而过的方法是错误的,望各位大侠拍砖!
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;
}加入此消息处理函数后,文档视图可以显示,不会一闪而过,但是窗口上的菜单和按钮控件无法点击,不知道如何解决?或者我这种解决文档视图界面的一闪而过的方法是错误的,望各位大侠拍砖!
http://hi.baidu.com/guqiwei/blog/item/b5908c777a52571fb051b907.html可能是上述原因导致
{
if (msg.lparam == WM_CLOSE)
这里也不对啊
PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)WM_CLOSE = msg.message
这个错误不是主要原因,已经修改,错在PeekMessage的参数PM_NOREMOVE(原问题中有笔误),应该改为PM_REMOVE,就是读取消息后删除,再用TranslateMessage();和DispatchMessage();重新派发,这样这个显示的窗口才能接受消息,否则会一直PeekMessage(),无法派发消息,消息函数不能响应执行,所以窗口就会一直灰死,无法接收新消息,也无法执行消息响应函数。问题已解决。