已经用API函数创建了一个Dialog,并添加了菜单资源,现在想要做的是:
点击菜单,弹出一个Dialog(上面还有几个文本框),请问该如何实现?(不用MFC)
就如同:点击“帮助”菜单,就弹出“关于”Dialog,显示版本等信息。

解决方案 »

  1.   

    以下几个函数都可以半到,不知道还有没有其他办法:?
    CreateDialogCreateDialogParamCreateWindowCreateWindowEx
      

  2.   

    这两个函数也应该可以办到:
    CreateDialogIndirectCreateDialogIndirectParam
      

  3.   

    在捕捉到菜单消息的时候,用楼上的所说的函数创建一个Dialog,然后显示出来!就像这样:
    switch (message)
         {  case WM_COMMAND:  wmpara = LOWORD(wParam); switch(wmpara)
    {
    case IDM_HELP:
                                    这儿是你画Dialog的代码!
                                ......
                                }
      

  4.   

    三位说的都对
    我就是按 trueadou(木头龙) 说的方式做的,但问题就出在这:(在LRESULT CALLBACK WndProc中)
    case  IDM_HELP:
        CreateWindow("About",TEXT("关于:"),
          WS_CHILD | WS_VISIBLE , 
          50, 50, 200, 150, hwnd, NULL, 
    (     (LPCREATESTRUCT) lParam)->hInstance,NULL);
       break; 
    调试时好像是倒数第二个参数有问题,请问这些参数(特别是hWndParen和hInstance)该怎么设?
      

  5.   

    hInstance要么从外面的全局变量得到,要么用AfxGetInstanceHandle();
      

  6.   

    hWndParen表示对话框的父窗口,没有就设为NULL
    hInstance表示你的资源模块的来源,NULL表示来自你的程序,
    要不然就是一个内存资源模块句柄,你的是前者
      

  7.   

    #include <windows.h>
    #include "resource.h"LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
    WPARAM wParam, LPARAM lParam);HINSTANCE hInst;
    HMENU hMenu;
    HWND hwnd;int APIENTRY WinMain(HINSTANCE hInstance,
     HINSTANCE hPreInstance,
     LPSTR lpCmdLine,
     int nCmdShow)
    {
             ...
    MSG msg ;
    WNDCLASS wndclass ;
    hMenu=LoadMenu(hInstance,(LPCSTR)IDR_MENU1);
    wndclass.lpfnWndProc  = WndProc ;
    wndclass.hInstance   = hInstance ;
             ...
    wndclass.lpszMenuName= "MenuAppMenu";
    wndclass.lpszClassName= szAppName; if (!RegisterClass (&wndclass))  
    {
      MessageBox (NULL, TEXT ("This program requires Windows NT!"), 
    szAppName, MB_ICONERROR) ;
      return 0 ;
    }
    hwnd = CreateWindow (szAppName,
                     TEXT ("homework"),
                     WS_OVERLAPPEDWINDOW,
                     200, 200,
                     400, 300,
                     NULL,hMenu, 
                     hInstance,NULL) ;

    ShowWindow (hwnd, nCmdShow) ;
    UpdateWindow (hwnd) ;

    while (GetMessage (&msg, NULL, 0, 0))
    {
       TranslateMessage (&msg) ;
       DispatchMessage (&msg) ;
    }
    return 0;
    }LRESULT CALLBACK WndProc (HWND hwnd, UINT message,
    WPARAM wParam, LPARAM lParam)
    {
     switch (message)
       {
       case  WM_COMMAND:
           switch (LOWORD(wParam))
    case  IDM_HELP:
    {
                  CreateWindow("About",TEXT("关于:"),
    WS_CHILD | WS_VISIBLE , 
    50, 30, 170, 125,/*NULL */hwnd, NULL, 
    hInst/*NULL((LPCREATESTRUCT) lParam)->hInstance*/,NULL);
    break;
    default:
    return (DefWindowProc(hwnd, message, wParam, lParam));
    }
             break;
               ...
        }
    }我的程序就是这样的,中间省略了一点。试了一下,还是显示不出来。
    请再帮我看看,最好能运行试一下。
      

  8.   

    hwnd = CreateWindow("About",TEXT("关于:"),
    WS_CHILD | WS_VISIBLE , 
    50, 30, 170, 125,/*NULL */hwnd, NULL, 
    hInst/*NULL((LPCREATESTRUCT) lParam)->hInstance*/,NULL); ShowWindow (hwnd, nCmdShow) ;
    UpdateWindow (hwnd) ;
      

  9.   

    Sorry,hwnd与主窗体句柄变量重名了,可以换成其他.
      

  10.   

    说了那么多,还是不知道用DialogBox来显示对话框么?
      

  11.   

    DialogBox肯定是可以的,但它是显示你自己画的对话框的!
      

  12.   

    CreateWindow("About",TEXT("关于:"),
    ... ...
    改成CreateWindow("static",TEXT("关于:"),
    而且整段代码要放到WM_CREATE消息下面,事实上,((LPCREATESTRUCT) lParam)这里的lParam是WM_CREATE 的!
      

  13.   

    To trueadou(木头龙) :
         这样好像不可以在点击“帮助”菜单后弹出一Dialog呀;
     To zijida:
         hWndaParent就应该是主窗口的句柄吧,光换个名字不行,应该换成谁的句柄呢?
     To Mackz(在相互):
         其实我最开始就是用DialogBox(对话框已画)想显示已画的Dialog,但没显示出来,参数设不好。能说的具体点吗?  基础实再太差了,谢谢帮助。