MDI w C++

Przeczytałem ten wątek msdn’a chyba ze 100 razy, ale dalej gdzieś robię błąd… dalej nie mam pojęcia co mam robić z tą strukturą ACCEL, na skutek czego przy debugowaniu wywala mi błąd. Dalej nie wiem dlaczego mi to okno nie chce wyskoczyć… Jakby ktoś się mógł tutaj błędów doszukać, to byłbym wdzięczny

#include 

#define CHILDCLASSNAME (LPCWSTR)"szchild"

#define PARENTCLASSNAME (LPCWSTR)"szparent"

#define FRAMETEXT L"Kółko i krzyżyk v2.0"

#define CHILDRENWNDID 311

#define CBWNDEXTRA 1024

HWND childwnd;

LRESULT CALLBACK parentproc(HWND hwnd, UINT uint, WPARAM wparam, LPARAM lparam);

LRESULT CALLBACK childproc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);


int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR cmdline, int showcmd)

{


	WNDCLASS wc; 


    // Register the frame window class. 


    wc.style = 0; 

    wc.lpfnWndProc = (WNDPROC) parentproc; 

    wc.cbClsExtra = 0; 

    wc.cbWndExtra = 0; 

    wc.hInstance = hinstance; 

    wc.hIcon = LoadIconA(0, (LPCSTR)IDI_APPLICATION); 

    wc.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW); 

    wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1); 

    wc.lpszMenuName = 0; 

    wc.lpszClassName = PARENTCLASSNAME; 


    if (!RegisterClass (&wc) ) 

	{

		MessageBoxA(0, "Unable to register the class", "ERROR", MB_OK | MB_ICONERROR);

		PostQuitMessage(1);

	}


    // Register the MDI child window class. 


    wc.lpfnWndProc = (WNDPROC) childproc; 

    wc.hIcon = LoadIconA(0, (LPCSTR)IDI_APPLICATION); 

    wc.lpszMenuName = (LPCTSTR) NULL; 

    wc.cbWndExtra = CBWNDEXTRA; 

    wc.lpszClassName = CHILDCLASSNAME; 


     if (!RegisterClass (&wc) ) 

	{

		MessageBoxA(0, "Unable to register the class", "ERROR", MB_OK | MB_ICONERROR);

		PostQuitMessage(1);

	}


	HWND parentwnd=CreateWindowEx(0, PARENTCLASSNAME, FRAMETEXT, WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL, 100, 100, 300, 300, 0, 0, hinstance, 0);


	MSG msg;

	BOOL bRet;

	LPACCEL acc;

	HACCEL hAccel=CreateAcceleratorTable(acc, 0);


	while ((bRet = GetMessage(&msg, (HWND) NULL, 0, 0)) != 0 && msg.message!=WM_QUIT)

	{

		if (bRet == -1)

		{

        // handle the error and possibly exit

		}

		else 

		{ 

			if (!TranslateMDISysAccel(childwnd, &msg) && 

                !TranslateAccelerator(parentwnd, hAccel, &msg))

			{ 

				TranslateMessage(&msg); 

				DispatchMessage(&msg); 

			}

		}

	}

	return (int)msg.wParam;

}

LRESULT CALLBACK parentproc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)

{

	CLIENTCREATESTRUCT ccs;

	switch(message){

		case WM_CREATE:

		ccs.hWindowMenu = 0;

        ccs.idFirstChild = CHILDRENWNDID; 

		childwnd=CreateMDIWindow(CHILDCLASSNAME, L"Child", WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN, 50, 50, 100, 100, hwnd, GetModuleHandle(0), 0);

		//childwnd=CreateWindowEx(0, CHILDCLASSNAME, L"Child", WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN, 50, 50, 100, 100, hwnd, 0, GetModuleHandle(0), &ccs);

		return 0;

	}


	return DefFrameProc(hwnd, childwnd ,message, wparam, lparam);

}


LRESULT CALLBACK childproc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)

{


	return DefMDIChildProc(hwnd, message, wparam, lparam);

}

Jak nie masz akceleratorów to wywal je, wywalasz:

   LPACCEL acc;HACCEL hAccel=CreateAcceleratorTable(acc, 0);TranslateAccelerator(parentwnd, hAccel, msg)) [/code]



oraz zamieniasz:
[code=php]         if (!TranslateMDISysAccel(childwnd, msg)  

na:

         if (!TranslateMDISysAccel(childwnd, msg)) [/code]

no dobra, wywaliłem akceleratory, czymkolwiek one są… ale to nic nie zmienia. Dalej nie mam tego okienka…

Bo brakuje ci:

ShowWindow(parentwnd,showcmd);

tuż po stworzeniu formy.

lol… tam jest flaga WS_VISIBLE więc nie trzeba showwindow

Nie możesz zrobić okienko główne jednocześnie MDI klientem, MDI klienta musisz stworzyć dodatkowo:

CLIENTCREATESTRUCT ccs;

ccs.hWindowMenu = 0;

ccs.idFirstChild = CHILDRENWNDID;

clientwnd = CreateWindowEx(WS_EX_CLIENTEDGE, “mdiclient”, 0,

WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL,

CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

hwnd, 0, GetModuleHandle(0), (LPVOID)&ccs);

globalna zmienna HWND clientwnd;

potem tworzysz okno - child:

childwnd=CreateMDIWindow(CHILDCLASSNAME, “Child”, MDIS_ALLCHILDSTYLES, 50, 50, 100, 100, clientwnd, GetModuleHandle(0), 0 );

zaś DefFrameProc wywołujesz tak:

return DefFrameProc(hwnd, clientwnd ,message, wparam, lparam);

brakuje też w parentproc:

case WM_DESTROY: PostQuitMessage (0); break;

przy tworzeniu głównego okna usuń style:

WS_VSCROLL | WS_HSCROLL

no i powinno działać.