为什么我在dll中创建的非模态对话框,并创建的消息循环进入了“死循环”;但是不写消息循环能实现点击界面吗?(附代码)被经理批评了,求求了啊55555555

jyzdtn 2010-02-09 10:35:27
#include "stdafx.h"
#include <windows.h>
#include"resource.h"
#include "stdafx.h"

#include <commctrl.h>
#include <aygshell.h>
#include <sipapi.h>
#include <commdlg.h>
#include <gx.h>
#include <pm.h>
#include <pimstore.h>
#include <windowsx.h>

#include <connmgr.h>
#include <ras.h>
#include <connmgr_proxy.h>

#include <cfgmgrapi.h> //shiqw add





LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;

extern"C" int __declspec(dllexport) ShowDialog(HWND mhwnd,HINSTANCE hInstance)
{
static TCHAR szAppName[] = TEXT ("Modeless_Dialog") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wc ;

HWND hDialog;




wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hIcon= LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_RICHMEDIA));
wc.hCursor = 0;
wc.hbrBackground = (HBRUSH) GetStockObject(HOLLOW_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = L"szAppClassName";
wc.hInstance = GetModuleHandle(NULL) ;
RegisterClass(&wc);

HINSTANCE ff;
ff=GetModuleHandle(NULL);

HWND hwndtemp;
//hwndtemp = CreateWindow( L"szAppClassName", 0, WS_BORDER,
//0, 0, 0, 0, mhwnd, NULL,ff, NULL);
hwndtemp = CreateWindowEx(0x00000004, L"szAppClassName", 0, WS_CLIPSIBLINGS ,
0, 0, 0, 0, mhwnd, NULL,hInstance, NULL);
ShowWindow (hwnd, SW_SHOW) ; //并不在这里显示主窗口
// UpdateWindow (hwnd) ;

hDialog = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DlgProc) ;

while (GetMessage (&msg, NULL, 0, 0))
{
if(hDialog==0||!IsDialogMessage(hDialog,&msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
}
return msg.wParam ;

}
BOOL CALLBACK DlgProc (HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG :
return true;
case WM_COMMAND:
switch(wParam)
{
case(IDOK):
MessageBox(NULL, L"这是一个modeless对话框的例子",L"提示",MB_OK);
DestroyWindow(hDlg);
PostQuitMessage (0) ;
return TRUE;
}
}
return FALSE;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
...全文
167 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyzdtn 2010-02-19
  • 打赏
  • 举报
回复
引用 9 楼 ama1997 的回复:
对话框不用写消息循环
只有SDK窗体才写

但是我只用过模式对话框,没用过非版的,如果不对,请拍砖

SDK窗体怎么写呢
lover4ever 2010-02-16
  • 打赏
  • 举报
回复
把GetMessage改成PeekMessage也许会好一点
ama1997 2010-02-16
  • 打赏
  • 举报
回复
对话框不用写消息循环
只有SDK窗体才写

但是我只用过模式对话框,没用过非版的,如果不对,请拍砖
sjdev 2010-02-15
  • 打赏
  • 举报
回复
你的ShowWindow函数在哪里?
jyzdtn 2010-02-14
  • 打赏
  • 举报
回复
引用 5 楼 microsoftwin 的回复:
if(hDialog==0||!IsDialogMessage(hDialog,&msg))
          {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
          }


这里,你的意思是只有当对话框句柄为NULL里才会处理消息,所以你的消息循环处理不了消息


完全没明白你的意思啊
明天去抢劫 2010-02-10
  • 打赏
  • 举报
回复
if(hDialog !=0 || !IsDialogMessage(hDialog,&msg))
..............
明天去抢劫 2010-02-10
  • 打赏
  • 举报
回复
if(hDialog==0||!IsDialogMessage(hDialog,&msg))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}


这里,你的意思是只有当对话框句柄为NULL里才会处理消息,所以你的消息循环处理不了消息
jyzdtn 2010-02-10
  • 打赏
  • 举报
回复
引用 3 楼 wltg2001 的回复:
应该是不用写消息循环的,不过没试过

关键是界面不能点击 怎么办啊
wltg2001 2010-02-09
  • 打赏
  • 举报
回复
应该是不用写消息循环的,不过没试过
sjdev 2010-02-09
  • 打赏
  • 举报
回复
不用消息循环,窗口出来之后程序就退出了。
dd_zhouqian 2010-02-09
  • 打赏
  • 举报
回复
windows的机制就是消息循环,除非你不用windows

15,471

社区成员

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

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