请教各位高手 用SDK编写基于对话框的程序 应该怎么写??
为什么我用VC写的 不能响应消息??  根本都不能关闭 只能强制关闭~~我在程序中做如下修改:
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX);     wcex.style          = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = DLGWINDOWEXTRA;//添加了DLGWINDOWEXTRA这个值
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_ICECHAT);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_ICECHAT;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex);
}
 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;   hInst = hInstance; // Store instance handle in our global variable   hWnd = CreateDialog(hInst, (LPCTSTR)IDD_MAINDLG, 0, NULL);//我修改CreateWindow为CreateDialog,IDD_MAINDLG 是我建立的 对话框模板的id   if (!hWnd)
   {
      return FALSE;
   }   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);   return TRUE;
}我实在搞不懂 为什么~~
请高手赐教了   分不够再加了~~~  
谢了~~

解决方案 »

  1.   

    新建工程的时候选hello world 的那个 里面关于对话框就是一个完整的对话框例子
      

  2.   

    这是程序中 两个函数~~ 这两个函数 我修改了!!!
    当然有窗口函数了~~~!!!!我就是用 新建工程 选 hello world
    然后没有出现 关于对话框的选项压  我的 下一步 是灰的呀~~  
    用 hello world建立的 SDK程序 不是对话框呀!·!
      

  3.   

    楼上的各位朋友,问一个特“菜”的问题,SDK程序怎么建立?比如MFC可以在打开VC后,在工程中选择MFC AppWizard就可以建立了,SDK该怎么做?一时感兴趣,向各位大哥请教!
      

  4.   

    在VC中 应用程序向导中 有一个Win32 Application 这个建立SDK程序
    或者 直接编写代码~~  赫赫~~
    我也是刚学
      

  5.   

    楼上的朋友能不能告诉我创建时如何设置吗?我选择了Win32 Application以后出现3个选项,我该选什么?各有什么用处?
      

  6.   

    第一个 是一个 空项目 需要自己建立 所有的代码
    第二个 是一个 只有Win32程序 框架的 项目 建立一下 你就知道了  我也是刚刚学习 我估计 是编写游戏等 因为 里面 也是什么也没有 只有一个 大框架 用来写一些 非“标准”的程序的吧 呵呵 所有的东西 都要自己添加
    第三个 是一个 标准的桌面程序 可以在 这个基础上编写 桌面应用程序 许多东西 VC已经提供了 不需要在重复编写那些一样的代码
      

  7.   

    hWnd = CreateDialog(hInst, (LPCTSTR)IDD_MAINDLG, 0, NULL);
    这里没有Dialog的消息处理函数
    你需要写一个自己的Dialog消息处理函数,或者直接在WndProc处理Dialog消息也行,但是这一句要改一下
    hWnd = CreateDialog(hInst, (LPCTSTR)IDD_MAINDLG, 0, (DLGPROC)WndProc);
    并且,WinMain的主消息循环部分也要改一下
    while(GetMessage(&msg, NULL, 0, 0))
    {
        if(!IsWindow(hWnd) || !IsDialogMessage(hWnd), &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    这里的hWnd就是CreateDialog时返回的Dilaog Handle
      

  8.   

    按我说的试一下,先处理最简单的WM_COMMAND里的IDOK, IDCANCEL
    switch(message)
    {
        case WM_COMMAND:
            if(LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
            {
                EndDialog(hWnd, LOWORD(wParam));
                return TRUE;
            }
            break;
    }
      

  9.   

    //下面是一个完整的Dlg sdk程序 其中 IDD_DIALOG1 是你的对话框资源 ID
    //Alon
    /**********************************************/
    /* 显示 Dialog Box                            */
    /**********************************************/
    #include <windows.h>
    #include "resource.h"// 函数类型说明
    LRESULT CALLBACK MainDialogProc( HWND, UINT, WPARAM, LPARAM );// Windows 主函数
    int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, 
                          LPSTR lpCmdLine, int nCmdShow )
    {
        DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)MainDialogProc);
        return TRUE;
    }// Windows 事件处理
    LRESULT CALLBACK MainDialogProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
    {
    //消息的处理,我想你要的就是这里了
        switch(message)
        {
            case WM_COMMAND:  //IDC_CLOSE 是我在对话框中加入的一个按钮的ID 也可以关闭
                 if (LOWORD(wParam)==IDC_CLOSE)   PostQuitMessage(0);
                 return TRUE;
                 break;
            case WM_CLOSE:  //关闭在这里
                 EndDialog(hDlg, TRUE); 
                 return TRUE;
                 break;
        }
        return FALSE;
    }
      

  10.   

    wcex.cbWndExtra = DLGWINDOWEXTRA;//添加了DLGWINDOWEXTRA这个值
    我在程序中 改变这个值 这样 请问 有什么作用??
    怎么用???
      

  11.   

    你直接用了CreateDialog(...),没有用到你注册的Window Class, 所以没起任何作用
      

  12.   

    可是我在书上看到的  就是这样写的  为什么我的不可以??
    我看的是那本 Windows程序设计  全名是什么 我忘了 好像是这个 就是那本 很经典的~~
    呵呵~~
    国外的那本  嘿嘿~~~~
    他用 CreateDialog()却可以 利用 WndProc进行消息处理~~
    需不需要 我把 源程序 发上来??  太大了~~ 
      

  13.   

    你要这么用也可以,但要先RegisterClass
      

  14.   

    其实alon21(飘一族.Alon)说的就很好了
      

  15.   

    当然 RegisterClass了
    我是用向导 中 Win32 Application  生成的 hello world 中直接修改的代码~
    改了 我上面说的两处~~  为什么不好使呢~~
    书上例子中 就可以~~还有 我这么做 有什么好处??  和 alon21(飘一族.Alon)说的方法 之间的 区别是什么?
    都有什么优缺点??
      

  16.   

    受不了你了,跟你说这么明白,你压根就没去试过,还在这里乱发一气
    HWND CreateDialog(
        HINSTANCE hInstance,
        LPCTSTR lpTemplate,
        HWND hWndParent,
        DLGPROC lpDialogFunc
    );
    是个WIN32 API,他就要求必须有lpDialogFunc这个参数,否则无法处理消息,明白了没?要是这都理解不了非得自己填个NULL,我看你回家种田算了
      

  17.   

    “老农民” 说话不要这么不客气~~
    你倒是要考虑考虑 回家种田~~   
    Programming Windows  中 Chapter11-Dialog Box  >  Modeless Dialog Box   这一节 中 一个例题 就是这么写的~~
    不知道 "老农民"看过吗~~  用他的方法为什么不行~~   还请"老农民"指教~~~下面是这个程序的 一部分~~::#include <windows.h>LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("HexCalc") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
         
         wndclass.style         = CS_HREDRAW | CS_VREDRAW;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = DLGWINDOWEXTRA ;    // Note!
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (hInstance, szAppName) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
         
         if (!RegisterClass (&wndclass))
         {
              MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
         
         hwnd = CreateDialog (hInstance, szAppName, 0, NULL) ;
         
         ShowWindow (hwnd, iCmdShow) ;
         
         while (GetMessage (&msg, NULL, 0, 0))
         {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
         }
         return msg.wParam ;
    }.
    .
    .LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         static BOOL  bNewNumber = TRUE ;
         static int   iOperation = `=` ;
         static UINT  iNumber, iFirstNum ;
         HWND         hButton ;
         
         switch (message)
         {
         case WM_KEYDOWN:                   // left arrow --> backspace
              if (wParam != VK_LEFT)
                   break ;
              wParam = VK_BACK ;
                                            // fall through
         case WM_CHAR:
              if ((wParam = (WPARAM) CharUpper ((TCHAR *) wParam)) == VK_RETURN)
                   wParam = `=` ;
              
              if (hButton = GetDlgItem (hwnd, wParam))
              {
                   SendMessage (hButton, BM_SETSTATE, 1, 0) ;
                   Sleep (100) ;
                   SendMessage (hButton, BM_SETSTATE, 0, 0) ;
              }
              else
              {
                   MessageBeep (0) ;
                   break ;
              }
                                            // fall through
         case WM_COMMAND:
              SetFocus (hwnd) ;
              
              if (LOWORD (wParam) == VK_BACK)         // backspace
                   ShowNumber (hwnd, iNumber /= 16) ;
              
              else if (LOWORD (wParam) == VK_ESCAPE)  // escape
                   ShowNumber (hwnd, iNumber = 0) ;
              
              else if (isxdigit (LOWORD (wParam)))    // hex digit
              {
                   if (bNewNumber)
                   {
                        iFirstNum = iNumber ;
                        iNumber = 0 ;
                   }
                   bNewNumber = FALSE ;
                   
                   if (iNumber <= MAXDWORD >> 4)
                        ShowNumber (hwnd, iNumber = 16 * iNumber + wParam -
                        (isdigit (wParam) ? `0': `A' - 10)) ;
                   else
                        MessageBeep (0) ;
              }
              else                                    // operation
              {
                   if (!bNewNumber)
                        ShowNumber (hwnd, iNumber =
                             CalcIt (iFirstNum, iOperation, iNumber)) ;
                   bNewNumber = TRUE ;
                   iOperation = LOWORD (wParam) ;
              }
              return 0 ;
              
         case WM_DESTROY:
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }=======================================================================
    //下面是 资源文件
    HEXCALC.RC (excerpts)//Microsoft Developer Studio generated resource script.
    #include "resource.h"
    #include "afxres.h"/////////////////////////////////////////////////////////////////////////////
    // IconHEXCALC                 ICON    DISCARDABLE     "HexCalc.ico"/////////////////////////////////////////////////////////////////////////////#include "hexcalc.dlg"===========================================================================//下面是  对话框模板文件HEXCALC.DLG
    /*---------------------------
       HEXCALC.DLG dialog script
      ---------------------------*/HexCalc DIALOG -1, -1, 102, 122
    STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
    CLASS "HexCalc"
    CAPTION "Hex Calculator"
    {
         PUSHBUTTON "D",       68,  8,  24, 14, 14
         PUSHBUTTON "A",       65,  8,  40, 14, 14
         PUSHBUTTON "7",       55,  8,  56, 14, 14
         PUSHBUTTON "4",       52,  8,  72, 14, 14
         PUSHBUTTON "1",       49,  8,  88, 14, 14
         PUSHBUTTON "0",       48,  8, 104, 14, 14
         PUSHBUTTON "0",       27, 26,   4, 50, 14
         PUSHBUTTON "E",       69, 26,  24, 14, 14
         PUSHBUTTON "B",       66, 26,  40, 14, 14
         PUSHBUTTON "8",       56, 26,  56, 14, 14
         PUSHBUTTON "5",       53, 26,  72, 14, 14
         PUSHBUTTON "2",       50, 26,  88, 14, 14
         PUSHBUTTON "Back",     8, 26, 104, 32, 14
         PUSHBUTTON "C",       67, 44,  40, 14, 14
         PUSHBUTTON "F",       70, 44,  24, 14, 14
         PUSHBUTTON "9",       57, 44,  56, 14, 14
         PUSHBUTTON "6",       54, 44,  72, 14, 14
         PUSHBUTTON "3",       51, 44,  88, 14, 14
         PUSHBUTTON "+",       43, 62,  24, 14, 14
         PUSHBUTTON "-",       45, 62,  40, 14, 14
         PUSHBUTTON "*",       42, 62,  56, 14, 14
         PUSHBUTTON "/",       47, 62,  72, 14, 14
         PUSHBUTTON "%",       37, 62,  88, 14, 14
         PUSHBUTTON "Equals",  61, 62, 104, 32, 14
         PUSHBUTTON "&&",      38, 80,  24, 14, 14
         PUSHBUTTON "|",      124, 80,  40, 14, 14
         PUSHBUTTON "^",       94, 80,  56, 14, 14
         PUSHBUTTON "<",       60, 80,  72, 14, 14
         PUSHBUTTON ">",       62, 80,  88, 14, 14
    }还请"老农民"解释一下~
      

  18.   

    为什么 书上的例子 可以用 WndProc 处理对话框的消息 而我的程序不行呢? 书上的例子中 CreateDialog (hInstance, szAppName, 0, NULL /*注意*/ ) 我有一些不明白~
      

  19.   

    书上的例子里后面特别讲到了对话框模版文件里的CLASS "HexCalc",就是这个东西起了作用书上的这个例子的原理是先注册一个szAppName(就是“HexCalc”)的window class,然后再建立了一个HexCalc名称的对话框模版,再在这个模版里指定对话框为HexCalc windows class(就是CLASS "HexCalc"这一句),这样就从模版这里与类和WndProc挂上了钩,然后在WinMain里用这个模版CreateDialog.
    这种方式太复杂,用了非公开的技术,我前面提供的方式属于正规的方法,很容易理解的
      

  20.   

    哦~ 原来如此~~  
    这个地方 我弄了好几天 一直都不明白 为什么~~
    现在懂了~~
    谢谢 “老农民” 了~~  特别感谢~
    呵呵~~~~还有一个问题~
    用Modal Box 和 Modaless Box 都有什么优缺点? 我是说 做这样的 基于对话框的程序中 主窗体对话框~可否把你的QQ 告诉我?  呵呵~~
    向你学习学习~~  呵呵~~  谢谢了~  :)
      

  21.   

    基于对话框的程序中 主窗体对话框,我认为是无所谓 Modal Box 和 Modaless Box 的吧不好意思,我不用QQ的,有什么问题直接用短消息好了