同上

解决方案 »

  1.   

    首先,你需要自己建立一个对话框命名MyDlg,之后双击对话框,有class wized自动建立一个对话框的类.然后在菜单里加个菜单项,映射消息.在映射消息里加上
    MyDlg dlg;
    dlg.domodle();
    就可以了
      

  2.   

    BOOL CTestDlgApp::PreTranslateMessage(MSG* pMsg) 
    {
    return true;

    // return CWinApp::PreTranslateMessage(pMsg);
    }
     这样行不行
      

  3.   

    不用class wizard的,谁能给笔者源代码啊?最好是完整一点的
      

  4.   

    1. New 一个 Win32 Application , 新建一个名称为 WinDialog.cpp 文件到工程中 .
    WinDialog.cpp 的源程序如下:#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 (NULL, IDI_APPLICATION) ;
         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 ;
    }void ShowNumber (HWND hwnd, UINT iNumber)
    {
         TCHAR szBuffer[20] ;     wsprintf (szBuffer, TEXT ("%X"), iNumber) ;
         SetDlgItemText (hwnd, VK_ESCAPE, szBuffer) ;
    }DWORD CalcIt (UINT iFirstNum, int iOperation, UINT iNum)
    {
         switch (iOperation)
         {
         case '=': return iNum ;
         case '+': return iFirstNum +  iNum ;
         case '-': return iFirstNum -  iNum ;
         case '*': return iFirstNum *  iNum ;
         case '&': return iFirstNum &  iNum ;
         case '|': return iFirstNum |  iNum ;
         case '^': return iFirstNum ^  iNum ;
         case '<': return iFirstNum << iNum ;
         case '>': return iFirstNum >> iNum ;
         case '/': return iNum ? iFirstNum / iNum: MAXDWORD ;
         case '%': return iNum ? iFirstNum % iNum: MAXDWORD ;
         default : return 0 ;
         }
    }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) ;
    }
      

  5.   

    2. 添加对话框资源到 Project 中 ( 因为资源这个东西只能自己添加, 不是象通常的程序那样用 C/C++ 文件写 ) 即, 
      2.1 使用菜单 File -> New 选择 Files tab 中的 Resource Script , 然后在 File 名称里输入 WinDialog.rc
      2.2 现在要用一个文件来描述对话框, 使用菜单 File -> New 选择 Files tab 中的 Text File, 然后在 File 名称里输入 MyDialog.dlg
          MyDialog.dlg 的内容如下: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
    }   2.3 使用菜单, View -> Resource Includes , 在 Symbol header file 里输入 resource.h, 在 Compile-time directives 这个 text box 中输入 #include "MyDialog.dlg" 这样, 就把 MyDialog.dlg 文件添加到资源中了 .3. 编译运行程序, 此时会出现 MyDialog.dlg 所描述的对话框了.
      

  6.   

    Demo 源程序下载: 
    http://iwangs.spymac.net/ttDialog.rar
      

  7.   

    to sgnaw(李逍遥):
    你给的这个例子是windows 程序设计(上)的第十一章中的例子楼住要写的是win32 api还是mfc啊,不要就的话。自己基于dialog写个多简单阿
    自己定义一个CMyDialog.然后DoModal就不可以了嘛。