本人初学是者,正在学习Win32API中,在遇到MDI窗口时,遇到如下问题,望各位前辈指教.#include "stdafx.h"
#include "resource.h"#define MAX_LOADSTRING 100HINSTANCE hInst;
TCHAR szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING];
TCHAR mdiWindowClass[MAX_LOADSTRING];HWND hwndClient;ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  // TODO: Place code here.
MSG msg;
HACCEL hAccelTable; // Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_MDI, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance); // Perform application initialization:
if (!InitInstance (hInstance, nCmdShow)) 
{
return FALSE;
} hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MDI); // Main message loop:
while (GetMessage(&msg, NULL, 0, 0)) 
{
if (!TranslateMDISysAccel (hwndClient, &msg) &&
            !TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return msg.wParam;
}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 = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_MDI);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
wcex.lpszMenuName = (LPCSTR)IDC_MDI;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}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;
   }   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);   return TRUE;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

switch (message) 
{
case WM_CREATE:
{
hInst=((LPCREATESTRUCT) lParam)->hInstance;

CLIENTCREATESTRUCT clientcreate ;
clientcreate.hWindowMenu  = NULL ; 
clientcreate.idFirstChild = 50000 ;

hwndClient =CreateWindowEx(0,
"MDICLIENT",
NULL,
WS_CHILD |WS_CLIPCHILDREN| WS_VISIBLE,
0,
0,
0,
0,
hWnd,
(HMENU)1,
hInst,
&clientcreate);
}
return 0;

case WM_COMMAND:
wmId    = LOWORD(wParam); 
wmEvent = HIWORD(wParam); 
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd,(DLGPROC)About);
   break;
case IDM_EXIT:
   DestroyWindow(hWnd);
   break;
case ID_NEW: WNDCLASSEX wndclass;

wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc   = (WNDPROC)About ;
wndclass.cbClsExtra    = 0 ;
wndclass.cbWndExtra    = sizeof (HANDLE) ;
wndclass.hInstance     = hInst ;
wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName  = NULL ;
wndclass.lpszClassName = mdiWindowClass ;

RegisterClassEx(&wndclass);

MDICREATESTRUCT mdicreate;
mdicreate.szClass = szWindowClass;//出现问题的地方
mdicreate.szTitle = TEXT ("Hello");
mdicreate.hOwner  = hInst ;
mdicreate.x       = CW_USEDEFAULT ;
mdicreate.y       = CW_USEDEFAULT ;
mdicreate.cx      = CW_USEDEFAULT ;
mdicreate.cy      = CW_USEDEFAULT ;
mdicreate.style   = 0 ;
mdicreate.lParam  = 0 ;
SendMessage (
hwndClient,
WM_MDICREATE,
0,
(LPARAM) (LPMDICREATESTRUCT) &mdicreate
) ;

break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefFrameProc(hWnd,hwndClient,message, wParam, lParam);
   }
   return 0;
}// Mesage handler for about box.
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{

case WM_INITDIALOG:
return TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
    return FALSE;
}上面是我用VC向导生成的一个win32框架,在上面出现问题处(标了字)当我用mdiWindowClass的窗口类名时不会有任何反映不出现任何子窗口,但当我把它改成szWindowClass时会出现子窗但子窗口是一个套一个的请教各位是我自已建的窗口结构有问题吗?

解决方案 »

  1.   

    TCHAR mdiWindowClass[MAX_LOADSTRING];没看到你对这个字符窜赋值阿
    所以你用这个注册窗口的时候,怎么成功呢???改成szWindowClass时会出现子窗但子窗口是一个套一个
    那都是同一个窗口,到时候窗口过程都是同一个了
    所以…………所以,你要弄一个新的窗口,注册一个新的窗口类,mdiWindowClass要赋值的然后给这个mdiWindowClass,还要建立他自己的窗口过程,
      

  2.   

    你在hwndClient =CreateWindowEx这句前面就应该注册一个新窗口类,然后调用这句,
    并且第一个参数为新窗口类名。很简单。
      

  3.   

    将最上边的原TCHAR mdiWindowClass[MAX_LOADSTRING];
    这句改成了TCHAR mdiWindowClass[MAX_LOADSTRING]="mdiwin";
    给了字符串的值,但仍无效
    而且原系统提供的主窗口类名字符串TCHAR szWindowClass[MAX_LOADSTRING];也未发现系统为其赋值仍然迷惑中,希望能够给予继续解答.
    谢谢!
      

  4.   

    回复erdgzw:
    我把创建消息中的代码改成了如下形式case WM_CREATE:
    {

    WNDCLASSEX wndclass;

    wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc   = (WNDPROC)About ;
    wndclass.cbClsExtra    = 0 ;
    wndclass.cbWndExtra    = sizeof (HANDLE) ;
    wndclass.hInstance     = hInst ;
    wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName  = NULL ;
    wndclass.lpszClassName = mdiWindowClass ;

    RegisterClassEx(&wndclass);

    hInst=((LPCREATESTRUCT) lParam)->hInstance;


    CLIENTCREATESTRUCT clientcreate ;
    clientcreate.hWindowMenu  = NULL ; 
    clientcreate.idFirstChild = 50000 ;

    hwndClient =CreateWindowEx(0,
    mdiWindowClass,
    NULL,
    WS_CHILD |WS_CLIPCHILDREN| WS_VISIBLE,
    0,
    0,
    0,
    0,
    hWnd,
    (HMENU)1,//ID
    hInst,
    &clientcreate); //
    }
    return 0;
    ......但仍未成功,按书上说hwndClient应该是客户区窗口而不是子窗口,创建子窗口是SendMessage (
    hwndClient,
    WM_MDICREATE,
    0,
    (LPARAM) (LPMDICREATESTRUCT) &mdicreate
    ) ;
    这一句.hwndClient应是子窗口的父窗口,
    框架窗口-客户区窗口-子窗口.
    希望您能给予进一步解答谢谢.