小弟定义了一个全局的窗体句柄hMaster,它是主窗体的句柄,那么InitInstance过程是这样的:
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;   hInst = hInstance; // 将实例句柄存储在全局变量中   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
  
   
   if (!hWnd)
   {
      return FALSE;
   }
   hMaster=hWnd;
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);   return TRUE;
}
然后在窗体过程中加入WM_LBUTTONDOWN消息处理:case WM_LBUTTONDOWN:
if(!hOther)
{
hOther=CreateWindowEx(WS_EX_MDICHILD,szWindowClass,_T("mYTOHER"),
WS_OVERLAPPEDWINDOW,30,30,400,400,hMaster,NULL,hInst,NULL);
if(!hOther)
MessageBox(NULL,_T("创建MDI子窗体失败"),_T("消息"),MB_OK);
ShowWindow(hOther,SW_NORMAL);
UpdateWindow(hOther);
}
break;
hOther是子窗体的句柄,窗体初始化时被赋成NULL.当我单击主窗体时,就会弹出消息框,说明MDI子窗体创建失败,请教各位大侠如何实现.

解决方案 »

  1.   

    判断函数返回值,出错,继续判断 GetLastError 。
      

  2.   

    GetLastError返回0,说明没有错误发生,究竟什么问题,是主窗体风格没设置好,还是子窗体的问题?
      

  3.   

    想创建MDI子窗体,必须先创建MDI Frame主窗口,你创建了主窗口,但不是MDI Frame,必须再创建一个MDICLIENT窗口才成为MDI Frame:CLIENTCREATESTRUCT ccs = {0};
    HWND hClient;
    HMENU hMenu = GetMenu(hMaster);
    int numItems = GetMenuItemCount(hMenu) - 2;//倒数第2个子菜单项,即“窗口”菜单项if(numItems < 0)
    numItems = 0;ccs.hWindowMenu = GetSubMenu(hMenu,numItems);numItems = GetMenuItemCount((HMENU)ccs.hWindowMenu);ccs.idFirstChild = GetMenuItemID((HMENU)ccs.hWindowMenu,numItems-1) + 10;hClient = CreateWindow("MDICLIENT",
                             NULL,
     WS_VISIBLE | WS_CHILD | WS_BORDER |
     WS_CLIPCHILDREN | WS_CLIPSIBLINGS |
     MDIS_ALLCHILDSTYLES |
                             WS_VSCROLL | WS_HSCROLL,
                             0,0,0,0,
                             hMaster,
                             (HMENU)0xCAC,
                             hInst(),
                             (LPVOID)&ccs);该MDICLIENT创建成功后才能创建MDI子窗体:MDICREATESTRUCT mcs;int nCmdShow = SW_SHOW;
    mcs.szClass = "MyMDIChildClass"; //事先RegisterClass注册的MDI子窗口类名
    mcs.szTitle = "新文档1";
    mcs.hOwner  = hInst;
    mcs.x       = CW_USEDEFAULT;    // x position
    mcs.y       = CW_USEDEFAULT;    // y position
    mcs.cx      = CW_USEDEFAULT;    // width
    mcs.cy      = CW_USEDEFAULT;    // height
    mcs.style   = WS_OVERLAPPEDWINDOW;HWND hwndChild = (HWND)SendMessage(hClient,WM_MDICREATE,0,(LPARAM)&mcs);
    if(hwndChild)
    {
    ::ShowWindow(hwndChild,SW_SHOW);
    }
      

  4.   

    创建MDI子窗体用的东西挺多的,我在网上查了一下,全是汇编的代码,真郁闷.不过,真得要感谢你呀,这些资料太宝贵了.