// ag.cpp : 定义应用程序的入口点。
//
 
#include "stdafx.h"
#include "ag.h"
 
#define MAX_LOADSTRING 100
 
// 全局变量:
HINSTANCE hInst;                               // 当前实例
TCHAR szTitle[MAX_LOADSTRING];                 // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];           // 主窗口类名
HWND        hDialog;            //窗口
 
 
 
INT_PTR CALLBACK DialogProc(
                            _In_  HWND hwndDlg,
                            _In_  UINT uMsg,
                            _In_  WPARAM wParam,
                            _In_  LPARAM lParam
                            );
 
 
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
     
   // TODO: 在此放置代码。
    MSG msg;
    HACCEL hAccelTable;
 
    // 初始化全局字符串
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_AG, szWindowClass, MAX_LOADSTRING);
     
 
    hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_AG));
 
    hDialog=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);
 
    ShowWindow(hDialog,SW_SHOW);
 
    UpdateWindow(hDialog);
 
    // 主消息循环:
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if (!hInstance || !IsDialogMessage(hDialog,&msg) )
        {   
            if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    }
 
    return (int) msg.wParam;
}
 
 
 
 
 
 
INT_PTR CALLBACK DialogProc(
                            _In_  HWND hwndDlg,
                            _In_  UINT uMsg,
                            _In_  WPARAM wParam,
                            _In_  LPARAM lParam
                            )
{
     
     switch(uMsg)
     {
     case WM_COMMAND:
 
         if( (LOWORD(wParam)==IDOK)  ||  (LOWORD(wParam)==IDCANCEL) )
         {
 
             DestroyWindow(hwndDlg);
             return TRUE;
         }
 
         break;
 
      default:
         return  FALSE;
     }
    return FALSE;
}
为什么可以弹出对话框来?我在对话框处理函数里,没有defwindowproc, 当对话框创建的时候,DialogProc 可以说都是返回fasle的。意味着:DialogProc不处理创建时候的一些列动作。那么为什么对话框可以显示??我第一次写程序的手,很不小心 ,把LOWORD(wparam) 写成了LOWORD(lparam),结果就没有显示对话框。为啥改过来后,就可以显示了。  要注意:我只处理了wm_command.              wm_command与创建弹出对话框无关

解决方案 »

  1.   

     hDialog=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);
      
     ShowWindow(hDialog,SW_SHOW);
    为什么会觉得创建了一个IDDDIALOG然后又showwindow后他不会显示出来?
      

  2.   


    我在对话框处理函数里,没有defwindowproc, 当对话框创建的时候,DialogProc 可以说都是返回fasle的。
     
    意味着:DialogProc不处理创建时候的一些列动作。那么为什么对话框可以显示??
     
    我第一次写程序的手,很不小心 ,把LOWORD(wparam) 写成了LOWORD(lparam),结果就没有显示对话框。
     
    为啥改过来后,就可以显示了。  
     
    要注意:我只处理了wm_command.              wm_command与创建弹出对话框无关
      

  3.   


    那你得先弄明白msg嫩个结构体中wParam与lParam存储的是什么信息了
      

  4.   


    所以那些初始化dialog,构造dialog的处理,全都是系统默认做好了,你create并show,就一定能出来的啊
      

  5.   

    int APIENTRY _tWinMain(HINSTANCE hInstance,
       HINSTANCE hPrevInstance,
       LPTSTR    lpCmdLine,
       int       nCmdShow)
    { // TODO: 在此放置代码。
    MSG msg;
    HACCEL hAccelTable; //// 初始化全局字符串
    //LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    //LoadString(hInstance, IDC_AG, szWindowClass, MAX_LOADSTRING);
    //hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_AG)); hDialog=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc); ShowWindow(hDialog,SW_SHOW); UpdateWindow(hDialog); //// 主消息循环:
    //while (GetMessage(&msg, NULL, 0, 0))
    //{
    // if (!hInstance || !IsDialogMessage(hDialog,&msg) )
    // {   
    // /*if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))*/
    // {
    // TranslateMessage(&msg);
    // DispatchMessage(&msg);
    // }
    // }
    //}
    while(1)
    {
    Sleep(200);
    }
    //return (int) msg.wParam;
    }
    INT_PTR CALLBACK DialogProc(
    _In_  HWND hwndDlg,
    _In_  UINT uMsg,
    _In_  WPARAM wParam,
    _In_  LPARAM lParam
    )
    { switch(uMsg)
    {
    case WM_INITDIALOG: return TRUE; case WM_COMMAND: if( (LOWORD(wParam)==IDOK)  ||  (LOWORD(wParam)==IDCANCEL) )
    { DestroyWindow(hwndDlg);
    return TRUE;
    } break;
    case WM_MOVE: return TRUE; break;
    default:
    return  DefWindowProc(hwndDlg,uMsg,wParam,lParam);
    }
    return FALSE;
    }
    已经使用了defwindowproc了,为什么程序运行后,光标达到界面,就有死住的感觉。无法响应的感觉。
      

  6.   

    不要纠结了
    没有显示对话框,跟这个“把LOWORD(wparam) 写成了LOWORD(lparam)”没关系的检查一下有没下了断点,
    调试运行时,窗口被VS挡住也是经常有的另外
    switch(uMsg)
    {
    case WM_COMMAND: if( (LOWORD(wParam)==IDOK)  ||  (LOWORD(wParam)==IDCANCEL) )
    { DestroyWindow(hwndDlg);
    return TRUE;
    } break;
    // 加上这个
    case WM_DESTROY:
    PostQuitMessage(0);
    return TRUE;
    default:
    return  FALSE;
    }
    return FALSE;
      

  7.   


    DialogProc里只需return TRUE(消息已处理过)或FALSE(消息未理过)
    不要调用DefWindowProc