int InitBurnerMDI (HWND hParentWnd) { CLIENTCREATESTRUCT ccs; ccs.hWindowMenu = NULL; ccs.idFirstChild = ID_MDI_START_CHILD; UINT nWindowStyle = WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE; UINT nWindowStyleEx = 0; hWndChildFrame = CreateWindowEx( nWindowStyleEx, szMDIFrameClass, NULL, nWindowStyle, 0, 0, 0, 0, hParentWnd, NULL, hAppInst, (LPVOID)&ccs ); //if(!hWndChildFrame) MessageBox(hWnd, _T("Could not create MDI client."), _T("Error"), MB_OK | MB_ICONERROR); hVideoWindow = nVidFullscreen ? NULL : CreateNewMDIChild(hWndChildFrame); return 0; }
static VOID FrameOnCommand(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { PCONSOLE_MAINFRAME_WND Info; HWND hChild; Info = (PCONSOLE_MAINFRAME_WND)GetWindowLongPtr(hwnd, 0); switch (LOWORD(wParam)) { case IDM_FILE_NEW: CreateNewMDIChild(Info, hwndMDIClient); SetMenu(Info->hwnd, Info->hMenuConsoleLarge); break; case IDM_FILE_SAVE: FrameOnSave(hwnd); break; case IDM_FILE_SAVEAS: FrameOnSaveAs(hwnd); break; case IDM_FILE_EXIT: PostMessage(hwnd, WM_CLOSE, 0, 0); break; default: if (LOWORD(wParam) >= IDM_MDI_FIRSTCHILD) { DefFrameProc(hwnd, hwndMDIClient, uMsg, wParam, lParam); } else { hChild = (HWND)SendMessage(hwndMDIClient, WM_MDIGETACTIVE, 0, 0); if (hChild) { SendMessage(hChild, WM_COMMAND, wParam, lParam); } } break; } }
CDocument* CMyDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName, BOOL bMakeVisible) { if (lpszPathName == NULL) { TRACE(_T("Creating new documents is disabled.\n")); return NULL; } CWaitCursor wait; CDocument* pDocument = CreateNewDocument(); if (pDocument == NULL) { TRACE(_T("CDocTemplate::CreateNewDocument returned NULL.\n")); AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC); return NULL; } ASSERT_VALID(pDocument); BOOL bAutoDelete = pDocument->m_bAutoDelete; pDocument->m_bAutoDelete = false; // don't destroy if something goes wrong CWnd* pMDIChild = CreateNewMDIChild(pDocument); pDocument->m_bAutoDelete = bAutoDelete; if (pMDIChild == NULL) { AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC); delete pDocument; // explicit delete on error return NULL; } ASSERT_VALID(pMDIChild); // open an existing document if (!pDocument->OnOpenDocument(lpszPathName)) { // user has be alerted to what failed in OnOpenDocument TRACE(_T("CDocument::OnOpenDocument returned FALSE.\n")); pMDIChild->DestroyWindow(); return NULL; } pDocument->SetPathName(lpszPathName); InitialUpdateMDIChild(pMDIChild, pDocument, bMakeVisible); return pDocument; }
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: { //Create Toolbar HWND hTool; TBBUTTON tbb[3]; TBADDBITMAP tbab; hTool = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_TOOL, GetModuleHandle(NULL), NULL); if (hTool == NULL) MessageBox(hwnd, "Could not create tool bar.", "Error", MB_OK | MB_ICONERROR); //Send the TB_BUTTONSTRUCTSIZE message, which is required for backward compatibility. SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); tbab.hInst = HINST_COMMCTRL; tbab.nID = IDB_STD_SMALL_COLOR; SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tbab); ZeroMemory(tbb, sizeof(tbb)); tbb[0].iBitmap = STD_FILENEW; tbb[0].fsState = TBSTATE_ENABLED; tbb[0].fsStyle = TBSTYLE_BUTTON; tbb[0].idCommand = ID_FILE_NEW; tbb[1].iBitmap = STD_FILEOPEN; tbb[1].fsState = TBSTATE_ENABLED; tbb[1].fsStyle = TBSTYLE_BUTTON; tbb[1].idCommand = ID_FILE_OPEN; tbb[2].iBitmap = STD_FILESAVE; tbb[2].fsState = TBSTATE_ENABLED; tbb[2].fsStyle = TBSTYLE_BUTTON; tbb[2].idCommand = ID_FILE_SAVEAS; SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb); //Create Status bar HWND hStatus; int statwidths[] = {100, -1}; hStatus = CreateWindowEx(0, STATUSCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0, hwnd, (HMENU)IDC_MAIN_STATUS, GetModuleHandle(NULL), NULL); SendMessage(hStatus, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths); SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Hi there :)"); //Create Client Window CLIENTCREATESTRUCT ccs; ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), 2); ccs.idFirstChild = ID_MDI_FIRSTCHILD; g_hMDIClient = CreateWindowEx(WS_EX_CLIENTEDGE, "mdiclient", NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwnd, (HMENU)IDC_MAIN_MDI, GetModuleHandle(NULL), (LPVOID)&ccs); break; } case WM_SIZE: { //Size toolbar and get height HWND hTool; RECT rcTool; int iToolHeight; hTool = GetDlgItem(hwnd, IDC_MAIN_TOOL); SendMessage(hTool, TB_AUTOSIZE, 0, 0); GetWindowRect(hTool, &rcTool); iToolHeight = rcTool.bottom - rcTool.top; //Size status bar and get height HWND hStatus; RECT rcStatus; int iStatusHeight; hStatus = GetDlgItem(hwnd, IDC_MAIN_STATUS); SendMessage(hStatus, WM_SIZE, 0, 0); GetWindowRect(hStatus, &rcStatus); iStatusHeight = rcStatus.bottom - rcStatus.top; //Calculata remaining height and size client window HWND hMDI; int iMDIHeight; RECT rcClient; GetClientRect(hwnd, &rcClient); iMDIHeight = rcClient.bottom - iToolHeight - iStatusHeight; hMDI = GetDlgItem(hwnd, IDC_MAIN_MDI); SetWindowPos(hMDI, NULL, 0, iToolHeight, rcClient.right, iMDIHeight, SWP_NOZORDER); break; } case WM_MDIACTIVATE: { HMENU hMenu, hFileMenu; UINT EnableFlag; hMenu = GetMenu(g_hMainWindow); if (hwnd == (HWND)lParam) EnableFlag = MF_ENABLED; else EnableFlag = MF_GRAYED; EnableMenuItem(hMenu, 1, MF_BYPOSITION | EnableFlag); EnableMenuItem(hMenu, 2, MF_BYPOSITION | EnableFlag); hFileMenu = GetSubMenu(hMenu, 0); EnableMenuItem(hFileMenu, ID_FILE_SAVEAS, MF_BYCOMMAND | EnableFlag); EnableMenuItem(hFileMenu, ID_FILE_CLOSE, MF_BYCOMMAND | EnableFlag); EnableMenuItem(hFileMenu, ID_FILE_CLOSEALL, MF_BYCOMMAND | EnableFlag); DrawMenuBar(g_hMainWindow); break; } case WM_COMMAND: switch (LOWORD(wParam)) { case ID_FILE_EXIT: PostMessage(hwnd, WM_CLOSE, 0, 0); break; case ID_FILE_NEW: CreateNewMDIChild(g_hMDIClient); break; case ID_FILE_OPEN: { HWND hChild = CreateNewMDIChild(g_hMDIClient); if (hChild) DoFileOpen(hChild); break; } case ID_FILE_CLOSE: { HWND hChild = (HWND)SendMessage(g_hMDIClient, WM_MDIGETACTIVE, 0, 0); if (hChild) SendMessage(hChild, WM_CLOSE, 0, 0); break; } case ID_FILE_SAVEAS: { HWND hChild = (HWND)SendMessage(g_hMDIClient, WM_MDIGETACTIVE, 0, 0); if (hChild) DoFileSave(hChild); break; } case ID_WINDOW_TILE: SendMessage(g_hMDIClient, WM_MDITILE, 0, 0); break; case ID_WINDOW_CASCADE: SendMessage(g_hMDIClient, WM_MDICASCADE, 0, 0); break; default: { if (LOWORD(wParam) >= ID_MDI_FIRSTCHILD) DefFrameProc(hwnd, g_hMDIClient, msg, wParam, lParam); else { HWND hChild = (HWND)SendMessage(g_hMDIClient, WM_MDIGETACTIVE, 0, 0); if (hChild) SendMessage(hChild, WM_COMMAND, wParam, lParam); } } } break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefFrameProc(hwnd, g_hMDIClient, msg, wParam, lParam); } return 0; }