[200分]求用SDK在Dll中显示非模式对话框的简单问题,来者有分

juststone 2005-04-26 10:21:20
对SDK不太懂

在Dll中显示非模式对话框出现问题:
对话框正常出现可以响应Button事件,但是不能移动窗口,最小化,关闭按键不能用


部分代码:
直接创建,没有注册窗口类,调用方式:动态显式调用
hWnd = CreateDialog((HINSTANCE)hMoudle,MAKEINTRESOURCE(IDD_DLGOK),NULL,(DLGPROC)WndDlgProc);

while(GetMessage(&msg,NULL,0,0))
{
if (!IsWindow(hWnd) ||!IsDialogMessage(hWnd, &msg))//有没有这个者一样
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

LRESULT CALLBACK WndDlgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
MessageBox(hWnd,"OK1","ok",MB_OK);//正常显示
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_COMMAND:
{
if(IDC_BTNEXIT == LOWORD(wParam))
DestroyWindow(hWnd);//正常关闭

}
break;

default :
return DefWindowProc(hWnd,message,wParam,lParam);
}
return FALSE;
}
希望各位多多帮忙
...全文
289 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfl559958 2005-05-01
  • 打赏
  • 举报
回复
不会吧?消息循环里没有WM_SIZE等消息的截取,就不能响应不到???
horisly 2005-05-01
  • 打赏
  • 举报
回复
mark
BigFanOfCpp 2005-04-30
  • 打赏
  • 举报
回复
晕,你的消息循环里怎么没有WM_SIZE等消息的截取呢?当然响应不到了,呵呵。
wangk 2005-04-29
  • 打赏
  • 举报
回复
在响应退出动作,即DestroyWindow(hWnd);
之后应该使用PostQuitMessage让窗口退出消息循环。
这样关闭时测试Dll的程序的才能正确退出,而不是把窗口隐藏。
ringphone 2005-04-29
  • 打赏
  • 举报
回复
DefWindowProc,试试看return FALSE应该也行的。
juststone 2005-04-29
  • 打赏
  • 举报
回复
的确,DefWindowProc是默认窗口的消息循环,但用DefDlgProc对话框就显示不出来了.
wangk 2005-04-28
  • 打赏
  • 举报
回复
将上面的DefWindowProc改成 DefDlgProc 。
DefWindowProc是默认窗口的消息循环。
ringphone 2005-04-28
  • 打赏
  • 举报
回复
FreeLibary之前需要先把对话框结束掉的呀,不然你那个while(GetMessage(&msg,NULL,0,0))消息循环还在运行,不会退出。
我碰到过好多次DLL里面线程没退出导致主程序无法退出的情况。
jeniminon 2005-04-27
  • 打赏
  • 举报
回复

~蹭分
Kudeet 2005-04-27
  • 打赏
  • 举报
回复
看看MSDN的例子:DLLHUSK(Dynamically Links the MFC Library)
juststone 2005-04-27
  • 打赏
  • 举报
回复
自己解决了
default :
return DefWindowProc(hWnd,message,wParam,lParam);
改为
default :
DefWindowProc(hWnd,message,wParam,lParam);
晕死了就这么简单.可能是DefWindowProc返回非0的原因吧,但在Exe中的WndProc中却是可行的.
再问个小问题:
虽然已经FreeLibary,关闭时测试Dll的程序的却没有退出,而只是把窗口隐藏了?
sinall 2005-04-27
  • 打赏
  • 举报
回复
方法有二:
1、SDK方式:在消息处理里加入“移动窗口,最小化,关闭按键”事件的处理。
2、MFC方式:为对话框模板建立相应的对话框类。
hjiaming 2005-04-27
  • 打赏
  • 举报
回复
^_^那把对话框的TitleBar去掉好类,反正也没用的
king110_1 2005-04-27
  • 打赏
  • 举报
回复
有完整代码吗?我也想知道,给我发一份好吗?
king10305@sina100.com
juststone 2005-04-27
  • 打赏
  • 举报
回复
谢谢
感觉上好像没进行默认的消息处理,我在WinXP下鼠标移动到该窗口的最小化,关闭按键上都没反应.正常情况下是会显亮的.
在代码中添加如下:
case WM_SYSCOMMAND:
{
switch(wParam)
{ //在这里置断点,没断到.好像收不到WM_SYSCOMMAND消息
case SC_MINIMIZE:
MessageBox(hWnd,"OK3","ok",MB_OK);
break;
case SC_CLOSE:
MessageBox(hWnd,"OK4","ok",MB_OK);
break;
// return FALSE;
}
break;
}
不知道是对话框样式设置上的错误,还是其它的问题
juststone 2005-04-27
  • 打赏
  • 举报
回复
代码就一点直接给出了
DLL中
/////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resource.h"
#include "MyWork.h"
#define MAX_LOADSTRING 100
extern "C" _declspec(dllimport) void start();
void InitDlg(HINSTANCE hInstance,HWND hOwner);
LRESULT CALLBACK WndDlgProc(HWND,UINT,WPARAM,LPARAM);
HANDLE g_hMod = NULL;
//TCHAR szWindowClass[MAX_LOADSTRING];

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
g_hMod = hModule;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}


// This is an example of an exported variable
MYWORK_API int nMyWork=0;

// This is an example of an exported function.
MYWORK_API int fnMyWork(void)
{
return 42;
}

// This is the constructor of a class that has been exported.
// see MyWork.h for the class definition
void start()
{
InitDlg((HINSTANCE)g_hMod,NULL);
}

void InitDlg(HINSTANCE hInstance,HWND hOwner)
{
HWND hWnd;
MSG msg;
hWnd = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DLGOK),NULL,(DLGPROC)WndDlgProc);
// DWORD d = GetLastError();//d为0,正常
// RECT rDlg;
// GetWindowRect(hWnd,&rDlg);
// SetWindowPos(hWnd,HWND_TOPMOST,rDlg.left,rDlg.top,rDlg.right,rDlg.bottom,SWP_SHOWWINDOW);
ShowWindow(hWnd,SW_SHOW);

while(GetMessage(&msg,NULL,0,0))
{
if (!IsWindow(hWnd) ||!IsDialogMessage(hWnd, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
LRESULT CALLBACK WndDlgProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
MessageBox(hWnd,"OK1","ok",MB_OK);
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_COMMAND:
{
if(IDC_BTNEXIT == LOWORD(wParam))//可以正常关闭对话框
DestroyWindow(hWnd);
}
break;
case WM_SYSCOMMAND://在EXE中正常,而在DLL中不能收到
{
switch(wParam)
{
case SC_MINIMIZE:
MessageBox(hWnd,"OK3","ok",MB_OK);
break;
case SC_CLOSE:
MessageBox(hWnd,"OK4","ok",MB_OK);
break;
// return FALSE;
}
break;
}
default :
return DefWindowProc(hWnd,message,wParam,lParam);
}
return FALSE;
}
CMyWork::CMyWork()
{
return;
}
头文件没改动,我就不贴了
用的是Win32 Dynamic-link Libary->A Dll that exports some symbols

////////////////////////////////////////////////////////////////////////////
在EXE中
typedef void (*LPSTART)();
HINSTANCE hInst;
hInst=LoadLibrary("MyWork.dll");
LPSTART st = (LPSTART)GetProcAddress(hInst,"start");
st();
moloto2004 2005-04-27
  • 打赏
  • 举报
回复
为什么WM_SYSCOMMAND不能相应呢?

不知道在一般程序里怎么样,先不要把代码放到DLL里



有完整代码吗?我也想知道,给我发一份好吗?
moloto@163.com

最近则在做DLL的Dialog。参考一下

Kudeet 2005-04-26
  • 打赏
  • 举报
回复
case WM_COMMAND :
switch (wParam)
{
case ID_SMALLER :
break ;
case ID_LARGER :
.......

消息循环没有问题,需要添加WM_SIZE等的处理,可以参考《WINDOWS程序设计》
xuzheng318 2005-04-26
  • 打赏
  • 举报
回复
if (!IsWindow==0 ||!IsDialogMessage(IsWindow, &msg))
case WM_CLOSE:
DestroyWindow(hWnd);
IsWindow = NULL ;
break;

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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