user-0 提问: 为什么对话框显示后，程序不能动弹了

回复:
user: user-0
content: 非常感谢ant2012的帮助.我又可以继续前进了. 需要总结下: 之前我一直在搜DialogBox()函数相关的东西看,一直没能找到真正的问题所在. 为什么我没法精准定位到是这个问题呢,而且根本想不到是这个问题. 如果WS_POPUP style   和  WS_CHILD style 放在某个函数里边做参数,我可能会去尝试修改, 放在资源属性里,真是不容易发现,况且对这些属性本身也不太了解.  谢谢ant2012 . 也谢谢link0007 . 分数怎么你呢.

user: user-1
content: 对话框上没X吗？ 在  case   WM_COMMAND :              switch (LOWORD (wParam))              {                 case   IDOK :                 //case   IDCANCEL :                         EndDialog (hDlg, 0) ;                         return TRUE ;              }              break ; case IDOK那插一个断点试试，看看有没有执行到这一步

user: user-2
content: 搜索 模态对话框 与 非模态对话框 区别

user: user-0
content: IDD_AboutBox这是你自己定义的，我改成大写了，也没用； 另外，IDD_ABOUTBOX 对话框的资源视图，在资源属性里把"system menu"打上钩，就有边框了。 但是，做了上面的改动，对话框仍然不能关闭，OK按钮没反应，程序死掉了，动弹不得。

user: user-1
content: IDD_AboutBox这是你自己定义的？系统定义的都是大写， 看看是不是这个资源，另外，找到IDD_AboutBox对话框的资源视图，看看在设计的时候你是不是把它的边框去掉了

user: user-0
content: 我有这个ENDDLG函数的: BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam) {    switch (message)    {       case   WM_INITDIALOG : 		     MessageBox(NULL,"WM_INITDIALOG 执行到了",MB_OK,NULL);              return TRUE ;       case   WM_COMMAND :              switch (LOWORD (wParam))              {                 case   IDOK :                 //case   IDCANCEL :                         EndDialog (hDlg, 0) ;                         return TRUE ;              }              break ;    }    return FALSE ; }  问题是, 对话框没有完整显示,中间区域显示了,但是旁边的边框没有显示,所以没法关闭对话框.

user: user-1
content: DialogBoxParam创建的是一个模态对话框，当模态对话框处于活跃状态时，父窗口会被阻塞，如果你不关闭它，父窗口是无法操作的，可以调用EndDialog去关闭它 BOOL EndDialog(   HWND hDlg,    // handle to dialog box   int nResult   // value to return ); 第一个参数为创建模态对话框的句柄，第二个参数为DialogBoxParam的返回值

user: user-0
content: 我可以告诉你是哪个点错误，就是下面这个函数：  DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_AboutBox), hwnd, (DLGPROC)AboutDlgProc,NULL) ;  但是我不知道问题在哪。

user: user-1
content: 插断点，自己调试一下，太长了，找错太费劲了

user: user-3
content: 主线程等待对话框返回，于是就挂起了

user: user-1
content: 把对话框style属性由child改成popup,，就ok了 WS_CHILD Creates a child window. A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.

user: user-0
content: 谢谢,已经发给你了.

user: user-1
content: 我也实在是无能为力了，楼主如果方便的话，把整个程序打包发给我，我有时间调试一下看看，1533846097@qq.com

user: user-0
content: case   WM_INITDIALOG :                                MessageBox(NULL,"WM_INITDIALOG 执行到了","提示",MB_OK);                                // return TRUE ; 	        return FALSE ;  改成  return FALSE ;  也一样.  对话框资源属性设置看不出有什么问题.  真是奇怪呀, 跟说明书上的例程对比,没发现什么差异,就是搞不正确,这个问题困扰我1~2两个月了.

user: user-1
content: case   WM_INITDIALOG :      MessageBox(NULL,"WM_INITDIALOG 执行到了","提示",MB_OK);              return TRUE ; 改成return FALSE;试试  楼主再看看对话框资源属性设置有没有问题

user: user-0
content: 是的.  但是,我把MessageBox(NULL,"WM_INITDIALOG 执行到了","提示",MB_OK);  这句去掉, 也会死掉.

user: user-1
content: MessageBox(NULL,"WM_INITDIALOG 执行到了","提示",MB_OK); 这个提示框弹出来了？ 然后点ok就死了？

user: user-0
content: 我觉得问题出在创建对话框上,  DialogBox(hInstance, (LPCTSTR)IDD_ABOUTBOX, hwnd,  (DLGPROC)AboutDlgProc) ;  但是这个函数也没有问题呀,

user: user-0
content: 问题不在MessageBox函数上,因为这个函数是可以点OK 按钮的. 而且,改过了之后,问题仍在. 之前我说的,对话框界面不显示,只显示边框,这个也验证过了,有时有这个现象,有时没有,多数情况是可以显示界面的. 所以,程序死掉跟MessageBox函数没关系.

user: user-0
content: 下面是改过的代码 :  #include <windows.h> #include "resource.h"     LRESULT  CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) ; BOOL CALLBACK AboutDlgProc(HWND, UINT, WPARAM, LPARAM) ;           int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow) //int main() {     /* 	HINSTANCE hInstance,hPrevInstance;         int iCmdShow;     	LPTSTR szCmdLine;          hInstance=GetModuleHandle(NULL);  //获取程序本身的实例句柄         iCmdShow=SW_SHOWNORMAL;//定义窗口显示模式         szCmdLine=GetCommandLine();//获取命令行字符串         hPrevInstance=NULL; //这个是历史遗留问题，一般程序用不到这个参数     */       static TCHAR szAppName[] = TEXT ("MENUDEMO") ;//TEXT ("About1") ;      MSG    msg ;      HWND   hwnd ; 	 HMENU  hmenu; //菜单创建方式二；       WNDCLASS  wndclass ;      wndclass.style= CS_HREDRAW | CS_VREDRAW ;      wndclass.lpfnWndProc= WndProc ;      wndclass.cbClsExtra= 0 ;      wndclass.cbWndExtra= 0 ;      wndclass.hInstance= hInstance ;      wndclass.hIcon= LoadIcon (hInstance, szAppName) ;      wndclass.hCursor= LoadCursor (NULL, IDC_ARROW) ;      //wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ; 	 wndclass.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_BTNFACE);      //wndclass.lpszMenuName= "IDR_MENU1"; //szAppName ; 	 //wndclass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);  //菜单创建方式一；   	 wndclass.lpszMenuName=NULL;   //菜单创建方式二、三；      wndclass.lpszClassName= szAppName ;                   if (!RegisterClass (&wndclass))      {         MessageBox (NULL, TEXT ("This program requires Windows NT!"),         szAppName, MB_ICONERROR) ;         return 0 ;      }          	 //hmenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));  //菜单创建方式二； 	       hwnd = CreateWindow (szAppName, TEXT ("About Box Demo Program"),                           WS_OVERLAPPEDWINDOW,  						  CW_USEDEFAULT,  						  CW_USEDEFAULT,                           CW_USEDEFAULT,  						  CW_USEDEFAULT,                           NULL,  						  NULL, 						  //hmenu,  //菜单创建方式二； 						  hInstance, NULL) ;  	 hmenu=LoadMenu(hInstance,MAKEINTRESOURCE(IDR_MENU1));   //菜单创建方式三；      SetMenu(hwnd,hmenu);   //菜单创建方式三；        ShowWindow (hwnd, iCmdShow) ;       UpdateWindow (hwnd) ;       while (GetMessage (&msg, NULL, 0, 0))       {         TranslateMessage (&msg) ;         DispatchMessage (&msg) ;       }        	 return msg.wParam ; }        BOOL openDlg(HWND hwnd, TCHAR* fullPath, TCHAR* fileName)  {     static OPENFILENAME ofn;     static TCHAR szFilter[] = TEXT("Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0");     // 确定结构的大小      ofn.lStructSize = sizeof(OPENFILENAME);     // 指定它的父窗口      ofn.hwndOwner = hwnd;     // 一般为NULL，表示我们使用的是通用对话框      // ，当然我们也可以自定义对话框，此时hInstance指示      // 资源的handle。      ofn.hInstance = NULL;     // 指示打开或者保存文件时的过滤器，比如说：      // static TCHAR szFilter[] = TEXT("Text Files(*.txt)\0*.txt\0") \      //    TEXT("All Files(*.*)\0*.*\0\0");      // 结构是这样的:描述\0过滤\0, 最后一项必须是两个\0,      // 详情请参考MSDN。      ofn.lpstrFilter = szFilter;     // 一般为NULL      ofn.lpstrCustomFilter = NULL;     // 一般为0      ofn.nMaxCustFilter = 0;     // 指示默认过滤器为第几项      ofn.nFilterIndex = 0;     // 用于保存文件的完整路径及文件名      ofn.lpstrFile = fullPath;     // 指示上面结构的大小      ofn.nMaxFile = MAX_PATH;     // 用于保存文件名，不包括路径      ofn.lpstrFileTitle = fileName;     // 指示上面结构的大小      ofn.nMaxFileTitle = MAX_PATH;     // 指示打开对话框的第一路径，      // 我发现为NULL时，初始化路径总是      // “我的文档”。      ofn.lpstrInitialDir = NULL;     // 指示对话框的caption, 我们一般为NULL，      // 让系统指示， 当然也可以自己设置。      ofn.lpstrTitle = NULL;     // 这个东西在打开保存等有点不同，下面是为了打开而设置的      // 我们以后会看到保存时此项的设置。      ofn.Flags = OFN_HIDEREADONLY;     // 为0就可以了      ofn.nFileOffset = 0;     // 为0就可以了      ofn.nFileExtension = 0;     // 如果你保存的时候忘记加.txt时，      // 它会自动给你加上。      ofn.lpstrDefExt = TEXT("txt");     // 为0就可以了      ofn.lCustData = 0;     // 为NULL就可以了      ofn.lpfnHook = NULL;     // 如果想定制对话框， 下面的就不能为NULL了      // 但是我们一般为NULL。      ofn.lpTemplateName = NULL;      return GetOpenFileName(&ofn); 	//GetSaveFileName(&ofn);  //保存文件的函数； }   BOOL openReadFile(HWND hwnd, TCHAR* fullPath)  { 	     HANDLE hFile;     //PBYTE pBuffer;     int iFileLength;     DWORD dwByteRead;  	hFile = CreateFile(fullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);      if(hFile==INVALID_HANDLE_VALUE) 	{ 		MessageBox(NULL,"文件打开失败！","提示",MB_OK); 		CloseHandle(hFile); 		return FALSE; 	} 	else 	{        iFileLength = GetFileSize(hFile, NULL);        char *pBuffer = (char *)malloc(iFileLength + 2); 	   pBuffer[iFileLength] = pBuffer[iFileLength + 1] = '\0'; 	   //memset(pBuffer,'\0', iFileLength+1);        ReadFile(hFile, (void *)pBuffer, iFileLength, &dwByteRead, NULL);        CloseHandle(hFile);	           SetWindowText(hwnd, pBuffer);        free(pBuffer);        return TRUE; 	} 	 	 }        LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {    static HINSTANCE hInstance ;    //HANDLE hFile;     static HWND hEdit;     static TCHAR fullPath[MAX_PATH], fileName[MAX_PATH];    //TCHAR* pText;    static HWND hwndEdit;    //HWND hdlgbox;     switch (message)    {       case   WM_CREATE :              hInstance = ((LPCREATESTRUCT) lParam)->hInstance;             /* 			 hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""),  			                        WS_CHILDWINDOW|ES_MULTILINE|WS_VSCROLL,  									10, 10, 300, 200, 			                        hwnd, NULL, NULL, NULL); 		     ShowWindow(hEdit, SW_SHOW);      			 */ 			  			 hwndEdit = CreateWindow(TEXT("edit"),NULL,                                      WS_CHILD | WS_VISIBLE | ES_LEFT| WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,                                      10, 10, 300, 300,                                      hwnd,                                      (HMENU)1,                                      (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),                                      NULL);                return 0 ;        case   WM_COMMAND :              switch (LOWORD (wParam))              { 				 case IDM_FILE_NEW: 					 Beep(1000,500); 					 /* 					 hFile=CreateFile("D:\\资料\\计算机\\程序练习\\TEST\\3\\1.text", 						               GENERIC_READ | GENERIC_WRITE , FILE_SHARE_READ | FILE_SHARE_WRITE , 						               NULL, 						               CREATE_NEW, 						               FILE_FLAG_OVERLAPPED , 						               NULL); 					if(hFile==INVALID_HANDLE_VALUE) 					 { 						 MessageBox(NULL,"文件创建失败！","提示",MB_OK); 						 CloseHandle(hFile);  					 } 					else 					{ 					    ShellExecute(NULL,"open","notepad.exe",fullPath,NULL,SW_SHOWNORMAL); 					} 					*/ 					 ShellExecute(NULL,"open","notepad.exe",NULL,NULL,SW_SHOWNORMAL); 					return 0 ;  				 case IDM_FILE_Open: 					 /* 					  hFile=CreateFile("D:\\资料\\计算机\\程序练习\\TEST\\3\\1.text", 						                GENERIC_READ | GENERIC_WRITE , FILE_SHARE_READ | FILE_SHARE_WRITE , 						                NULL, 						                OPEN_EXISTING, 						                FILE_FLAG_OVERLAPPED, 						                NULL); 					 if(hFile==INVALID_HANDLE_VALUE) 					 { 						 MessageBox(NULL,"文件打开失败！","提示",MB_OK); 						 CloseHandle(hFile);  					 } 					 */ 					  					 if(!openDlg(hwnd, fullPath, fileName))  					 {                          MessageBox(NULL, TEXT("can not open file."),TEXT("Error"), MB_ICONERROR);                          fullPath[0] = '\0';                          fileName[0] = '\0';                          return 0; 					 } 					  					 /*                      if(!openReadFile(hwndEdit, fullPath))  					 {                          MessageBox(NULL, TEXT("error read file."),TEXT("Error"), MB_ICONERROR);                          fullPath[0] = '\0';                          fileName[0] = '\0';                          return 0; 					 } 					 */ 					 ShellExecute(NULL,"open","notepad.exe",fullPath,NULL,SW_SHOWNORMAL); 					 //PathStripPath(fullPath);  //得到文件名					   					 					 return 0 ;  				                case IDM_APP_ABOUT :   //IDD_AboutBox:   				  MessageBox(NULL,"DialogBox()执行到了","提示",MB_OK);                    //DialogBox (hInstance, TEXT ("IDD_AboutBox"), hwnd, (DLGPROC)AboutDlgProc) ;  				  DialogBox(hInstance, (LPCTSTR)IDD_ABOUTBOX, hwnd,  (DLGPROC)AboutDlgProc) ; 				   //DialogBox (hInstance, MAKEINTRESOURCE(IDD_AboutBox), hwnd, (DLGPROC)AboutDlgProc) ;  				   //hdlgbox=CreateDialog(hInstance, MAKEINTRESOURCE(IDD_AboutBox), hwnd, AboutDlgProc); 				   //ShowWindow(hdlgbox, SW_SHOW ); 				   //InvalidateRect (hwnd, NULL, TRUE) ;  				   //DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, (DLGPROC)AboutDlgProc,NULL) ;  				   //MessageBox(NULL,"DialogBox()执行到了","提示",MB_OK);                    break ; 				                 }              return 0 ;  	  /* 	  case WM_PAINT:           hdc = BeginPaint (hwnd, &ps) ;                      GetClientRect (hwnd, &rect) ;                      DrawText (hdc, TEXT ("Hello, Windows XP!"), -1, &rect,                     DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;                      EndPaint (hwnd, &ps) ;        return 0 ; 	   */        case   WM_DESTROY :              PostQuitMessage (0) ; 			 //MessageBox(NULL,"PostQuitMessage (0)执行到了","提示",MB_OK);              return 0 ;    }    return DefWindowProc (hwnd, message, wParam, lParam) ; }   BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam) {    switch (message)    {       case   WM_INITDIALOG : 		     MessageBox(NULL,"WM_INITDIALOG 执行到了","提示",MB_OK);              return TRUE ;       case   WM_COMMAND :              switch (LOWORD (wParam))              {                 case   IDOK :                 case   IDCANCEL : 					    MessageBox(NULL,"IDOK/IDCANCEL执行到了","提示",MB_OK);                         EndDialog (hDlg, 0) ;                         return TRUE ;              }              break ;    }    return FALSE ; }