/******************************************************************************\ * This is a part of the Microsoft Source Code Samples. * Copyright (C) 1993-1997 Microsoft Corporation. * All rights reserved. * This source code is only intended as a supplement to * Microsoft Development Tools and/or WinHelp documentation. * See these sources for detailed information regarding the * Microsoft samples programs. \******************************************************************************/ /****************************** Module Header ******************************\ * Module Name: memory.c \***************************************************************************/ #include #include "memory.h" HANDLE ghModule; HWND ghwndMain = NULL; HWND ghwndClient; HMENU hMenu, hMenuWindow; HMENU hServerMenu, hServerMenuWindow; HMENU hClientMenu, hClientMenuWindow; CHAR gszFile[20]; CHAR gszMapName[20]; typedef struct _PerWndInfo { HWND hParent; HWND hThisWnd; // Used in locating the node RECT rcClient; char CaptionBarText[SIZEOFCAPTIONTEXT]; } PERWNDINFO, *PPERWNDINFO; typedef struct _node { PERWNDINFO ChildWnd; HANDLE hNext; } NODE, *PNODE; /* * Forward declarations. */ BOOL InitializeApp (void); LONG APIENTRY MainWndProc (HWND, UINT, DWORD, LONG); LONG APIENTRY ServerWndProc (HWND, UINT, DWORD, LONG); LONG APIENTRY ClientWndProc (HWND, UINT, DWORD, LONG); BOOL CALLBACK About (HWND, UINT, DWORD, LONG); BOOL CALLBACK FileType (HWND, UINT, DWORD, LONG); BOOL CALLBACK MapFileName (HWND, UINT, DWORD, LONG); LONG APIENTRY TextWndProc (HWND, UINT, DWORD, LONG); /***************************************************************************\ * main * \***************************************************************************/ int WINAPI WinMain( HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { MSG msg; // this will change to something more reasonable ghModule = GetModuleHandle(NULL); if (!InitializeApp()) { MessageBox(ghwndMain, GetStringRes(IDS_ERR_INITAPP_FAILED), NULL, MB_OK); return 0; } while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } if (hMenuWindow && IsWindow(hMenuWindow)) DestroyMenu(hMenuWindow); if (hClientMenuWindow && IsWindow(hClientMenuWindow)) DestroyMenu(hClientMenuWindow); if (hServerMenuWindow && IsWindow(hServerMenuWindow)) DestroyMenu(hServerMenuWindow); if (hMenu && IsWindow(hMenu)) DestroyMenu(hMenu); if (hClientMenu && IsWindow(hClientMenu)) DestroyMenu(hClientMenu); if (hServerMenu && IsWindow(hServerMenu)) DestroyMenu(hServerMenu); return 1; UNREFERENCED_PARAMETER(lpCmdLine); UNREFERENCED_PARAMETER(nShowCmd); UNREFERENCED_PARAMETER(hInstance); UNREFERENCED_PARAMETER(hPrevInstance); } /***************************************************************************\ * InitializeApp * \***************************************************************************/ BOOL InitializeApp(void) { WNDCLASS wc; wc.style = CS_OWNDC; wc.lpfnWndProc = (WNDPROC)MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = sizeof(LONG); wc.hInstance = ghModule; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE); wc.lpszMenuName = "MainMenu"; wc.lpszClassName = "MemoryClass"; if (!RegisterClass(&wc)) return FALSE; wc.style = CS_OWNDC; wc.lpfnWndProc = (WNDPROC)ServerWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; // LATER sizeof(LONG); wc.hInstance = ghModule; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE); wc.lpszMenuName = NULL; wc.lpszClassName = "ServerClass"; if (!RegisterClass(&wc)) return FALSE; wc.style = CS_OWNDC; wc.lpfnWndProc = (WNDPROC)ClientWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; // LATER sizeof(LONG); wc.hInstance = ghModule; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE); wc.lpszMenuName = NULL; wc.lpszClassName = "ClientClass"; if (!RegisterClass(&wc)) return FALSE; wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)TextWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = ghModule; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_BTNSHADOW); wc.lpszMenuName = NULL; wc.lpszClassName = "Text"; if (!RegisterClass(&wc)) return FALSE; hMenu = LoadMenu(ghModule, "MainMenu"); hServerMenu = LoadMenu(ghModule, "ServerMenu"); hClientMenu = LoadMenu(ghModule, "ClientMenu"); hMenuWindow = GetSubMenu(hMenu, 1); hServerMenuWindow = GetSubMenu(hServerMenu, 2); hClientMenuWindow = GetSubMenu(hClientMenu, 2); ghwndMain = CreateWindowEx(0L, "MemoryClass", "Memory", WS_OVERLAPPED | WS_CAPTION | WS_BORDER | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_CLIPCHILDREN | WS_VISIBLE | WS_SYSMENU, 80, 70, 592, 300, NULL, hMenu, ghModule, NULL); if (ghwndMain == NULL) return FALSE; SetWindowLong(ghwndMain, GWL_USERDATA, 0L); return TRUE; } /***************************************************************************\ * MainWndProc * \***************************************************************************/ long APIENTRY MainWndProc( HWND hwnd, UINT message, DWORD wParam, LONG lParam) { static int iSvrCount=1; static int iCltCount=1; CLIENTCREATESTRUCT clientcreate; HWND hwndChildWindow; BOOL fSuccess; switch (message) { case WM_CREATE: SetWindowLong(hwnd, 0, (LONG)NULL); clientcreate.hWindowMenu = hMenuWindow; clientcreate.idFirstChild = 1; ghwndClient = CreateWindow("MDICLIENT", NULL, WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE, 0,0,0,0, hwnd, NULL, ghModule, (LPVOID)&clientcreate); return 0L; case WM_DESTROY: { PostQuitMessage(0); return 0L; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_TILE: SendMessage(ghwndClient, WM_MDITILE, 0L, 0L); return 0L; case IDM_CASCADE: SendMessage(ghwndClient, WM_MDICASCADE, 0L, 0L); return 0L; case IDM_ARRANGE: SendMessage(ghwndClient, WM_MDIICONARRANGE, 0L, 0L); return 0L; case MM_SERVER: { BOOL fSucess = FALSE; HANDLE hNode, hHead; PNODE pNode; MDICREATESTRUCT mdicreate; hNode = LocalAlloc(LHND, (WORD) sizeof(NODE)); if (hNode && (pNode = (PNODE)LocalLock(hNode))) { wsprintf((LPSTR) &(pNode->ChildWnd.CaptionBarText), GetStringRes(IDS_SERVER), iSvrCount); mdicreate.szClass = "ServerClass"; mdicreate.szTitle = (LPTSTR)&(pNode->ChildWnd.CaptionBarText); mdicreate.hOwner = ghModule; mdicreate.x = mdicreate.y = mdicreate.cx = mdicreate.cy = CW_USEDEFAULT; mdicreate.style = 0l; mdicreate.lParam = 0L; /*Create Child Window*/ hwndChildWindow = (HWND) SendMessage(ghwndClient, WM_MDICREATE, 0L, (LONG)(LPMDICREATESTRUCT)&mdicreate); if (hwndChildWindow) { pNode->ChildWnd.hParent = ghwndClient; pNode->ChildWnd.hThisWnd = hwndChildWindow; hHead = (HANDLE)GetWindowLong(hwnd, 0); pNode->hNext = hHead; SetWindowLong(hwnd, 0, (LONG) hNode); iSvrCount++; LocalUnlock(hNode); fSuccess = TRUE; } else { LocalUnlock (hNode); LocalFree (hNode); fSuccess = FALSE; } } if (!fSuccess) MessageBox(ghwndMain, GetStringRes(IDS_ERR_CREATE_CHILD_FAILED), NULL, MB_OK); return 0L; } case MM_CLIENT: { BOOL fResult = FALSE; HANDLE hNode, hHead; PNODE pNode; MDICREATESTRUCT mdicreate; hNode = LocalAlloc(LHND, (WORD) sizeof(NODE)); if (hNode && (pNode = (PNODE)LocalLock(hNode))) { wsprintf((LPSTR) &(pNode->ChildWnd.CaptionBarText), GetStringRes(IDS_CLIENT), iCltCount); mdicreate.szClass = "ClientClass"; mdicreate.szTitle = (LPSTR) &(pNode->ChildWnd.CaptionBarText); mdicreate.hOwner = ghModule; mdicreate.x = mdicreate.y = mdicreate.cx = mdicreate.cy = CW_USEDEFAULT; mdicreate.style = 0l; mdicreate.lParam = 0L; /*Create Child Window*/ hwndChildWindow = (HANDLE) SendMessage(ghwndClient, WM_MDICREATE, 0L, (LONG)(LPMDICREATESTRUCT)&mdicreate); if (hwndChildWindow) { pNode->ChildWnd.hParent = ghwndClient; pNode->ChildWnd.hThisWnd = hwndChildWindow; hHead = (HANDLE)GetWindowLong(hwnd, 0); pNode->hNext = hHead; SetWindowLong(hwnd, 0, (LONG) hNode); iCltCount++; LocalUnlock(hNode); fSuccess = TRUE; } else { LocalUnlock (hNode); LocalFree (hNode); fSuccess = FALSE; } } if (!fSuccess) MessageBox(ghwndMain, GetStringRes(IDS_ERR_CREATE_CHILD_FAILED), NULL, MB_OK); return 0L; } case MM_ABOUT: if (DialogBox(ghModule, "AboutBox", ghwndMain, (DLGPROC)About) == -1) MessageBox(ghwndMain, GetStringRes(IDS_ERR_CREATE_DLG_FAILED), NULL, MB_OK); return 0L; case MM_OPT_1: case MM_OPT_2: case MM_OPT_3: case MM_OPT_4: case MM_OPT_5: case MM_OPT_6: case MM_OPT_7: case MM_OPT_8: { HWND hActiveChild; hActiveChild = (HANDLE) SendMessage(ghwndClient, WM_MDIGETACTIVE, 0L, 0L); if (hActiveChild) SendMessage(hActiveChild, WM_COMMAND, wParam, lParam); return 0L; } default: return DefFrameProc(hwnd, ghwndClient, message, wParam, lParam); } default: return DefFrameProc(hwnd, ghwndClient, message, wParam, lParam); } } /***************************************************************************\ * ServerWndProc * \***************************************************************************/ long APIENTRY ServerWndProc( HWND hwnd, UINT message, DWORD wParam, LONG lParam) { static HANDLE MapFileHandle = NULL; static HANDLE hMem1 = NULL; static LPVOID pShrMem1 = NULL; static HANDLE hEdit; static BOOL bDirty = FALSE; static HWND hTextWnd; BOOL fSuccess; switch (message) { case WM_COMMAND: { switch (LOWORD(wParam)) { case MM_OPT_1: { //Create File SetWindowText(hTextWnd, GetStringRes(IDS_CREATE_MAP_FILE)); switch (DialogBox(ghModule, "FileType", hwnd, (DLGPROC)FileType)) { case -1: fSuccess = FALSE; break; case IDBTN_MAP: if (MapFileHandle = CreateMapFile(gszFile)) fSuccess = TRUE; else fSuccess = FALSE; break; default: MapFileHandle = (HANDLE) 0xFFFFFFFF; fSuccess = TRUE; break; } if (fSuccess) { EnableMenuItem(hServerMenu, MM_OPT_1, MF_GRAYED); EnableMenuItem(hServerMenu, MM_OPT_2, MF_ENABLED); SetWindowText(hTextWnd, GetStringRes(IDS_SEL_CREATE_FILE_MAPPING)); } else { SetWindowText(hTextWnd, GetStringRes (IDS_ERR_MAPFILE_FAILED)); } return 0L; } case MM_OPT_2: { //Create File Mapping // This option should be disabled until MM_OPT_1 has been chosen. SetWindowText(hTextWnd, GetStringRes(IDS_CREATE_MAPPING)); if (MapFileHandle) switch (DialogBox(ghModule, "MapName", hwnd, (DLGPROC)MapFileName)) { case IDBTN_OK: if (hMem1 = CreateMap(MapFileHandle, gszMapName)) fSuccess = TRUE; else fSuccess = FALSE; break; default: fSuccess = FALSE; break; } else fSuccess = FALSE; if (fSuccess) { EnableMenuItem(hServerMenu, MM_OPT_2, MF_GRAYED); EnableMenuItem(hServerMenu, MM_OPT_3, MF_ENABLED); SetWindowText(hTextWnd, GetStringRes (IDS_SEL_MAP_VIEW)); } else { SetWindowText(hTextWnd, GetStringRes (IDS_ERR_MAPPING_FAILED)); } return 0L; } case MM_OPT_3: { //Map View of File SetWindowText(hTextWnd, GetStringRes (IDS_MAPPING_VIEW)); if (hMem1 && (pShrMem1 = (LPVOID)MapView(hMem1))) { EnableMenuItem(hServerMenu, MM_OPT_3, MF_GRAYED); EnableMenuItem(hServerMenu, MM_OPT_4, MF_ENABLED); SetWindowText(hTextWnd, GetStringRes (IDS_SEL_ACCESS)); } else { SetWindowText(hTextWnd, GetStringRes(IDS_ERR_MAPVIEW_FAILED)); } return 0L; } case MM_OPT_4: { //Access RECT rcl; SetWindowText(hTextWnd, GetStringRes (IDS_ACCESSING_SERVER_WRITE)); if (pShrMem1) { GetClientRect(hwnd, &rcl); hEdit = CreateWindow("edit", (LPSTR) NULL, WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0,0, rcl.right - rcl.left, rcl.bottom - rcl.top - GetWindowLong(hTextWnd, GWL_USERDATA), hwnd, (HMENU)1, ghModule, (LPVOID)NULL); if (hEdit) { EnableMenuItem(hServerMenu, MM_OPT_4, MF_GRAYED); SetFocus(hEdit); fSuccess = TRUE; } else fSuccess = FALSE; } else fSuccess = FALSE; if (!fSuccess) { MessageBox(ghwndMain, GetStringRes(IDS_ERR_ACCESS_WRITE_FAILED), NULL, MB_OK); SetWindowText(hTextWnd, GetStringRes (IDS_ERR_ACCESS_WRITE_FAILED)); } return 0L; } } // End of switch (LOWORD(wParam)) switch (HIWORD(wParam)) { case EN_UPDATE: { if (hEdit && (hEdit == (HWND)lParam)) { bDirty = TRUE; } return 0L; } } } case WM_TIMER: if (bDirty && IsWindow(hEdit)) { int iCnt; iCnt = SendMessage(hEdit, WM_GETTEXT, (WPARAM)4000, (LPARAM)pShrMem1); if (iCnt) { bDirty = FALSE; } } return 0L; case WM_MDIACTIVATE: if ((HWND) lParam == hwnd) { SendMessage(GetParent(hwnd), WM_MDISETMENU, (DWORD) hServerMenu, (LONG) hServerMenuWindow) ; DrawMenuBar(GetParent(GetParent(hwnd))) ; } return 0; case WM_SIZE: if (hEdit) MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam)-GetWindowLong(hTextWnd, GWL_USERDATA), TRUE); MoveWindow(hTextWnd, 0, HIWORD(lParam) - GetWindowLong(hTextWnd, GWL_USERDATA), LOWORD(lParam), HIWORD(lParam), TRUE); return DefMDIChildProc(hwnd, message, wParam, lParam); case WM_CREATE: { PPERWNDINFO pWndInfo; PNODE pHead; HANDLE hHead, hTmp; RECT rect; GetClientRect(hwnd, &rect); hTextWnd = CreateWindow("Text", NULL, WS_BORDER | SS_LEFT | WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU) 2, ghModule, NULL); EnableMenuItem(hServerMenu, MM_OPT_1, MF_ENABLED); SetWindowText(hTextWnd, GetStringRes (IDS_SEL_CREATE_FILE)); // now find match hHead = (HANDLE) GetWindowLong(ghwndMain, 0); if (hHead && (pHead = (PNODE)LocalLock(hHead))) { while ((pHead->ChildWnd.hThisWnd != hwnd) && (pHead->hNext)) { hTmp = hHead; hHead = pHead->hNext; LocalUnlock(hTmp); pHead = (PNODE)LocalLock(hHead); } if (pHead->ChildWnd.hThisWnd == hwnd) { pWndInfo = &pHead->ChildWnd; GetClientRect(pWndInfo->hThisWnd, &pWndInfo->rcClient); } LocalUnlock(hHead); } return DefMDIChildProc(hwnd, message, wParam, lParam); } case WM_CLOSE: { PPERWNDINFO pWndInfo; PNODE pHead, pTrail; HANDLE hHead, hTmp; EnableMenuItem(hServerMenu, MM_OPT_2, MF_GRAYED); EnableMenuItem(hServerMenu, MM_OPT_3, MF_GRAYED); EnableMenuItem(hServerMenu, MM_OPT_4, MF_GRAYED); SendMessage(GetParent(hwnd), WM_MDISETMENU, (DWORD)hMenu, (LONG)hMenuWindow); DrawMenuBar(GetParent(GetParent(hwnd))) ; // Unmap view, close mapping and file! if (pShrMem1) { UnmapViewOfFile (pShrMem1); pShrMem1 = NULL; } if (hMem1) { CloseHandle (hMem1); hMem1 = NULL; } if (MapFileHandle && MapFileHandle != INVALID_HANDLE_VALUE) { CloseHandle (MapFileHandle); MapFileHandle = NULL; } // now find match hHead = (HANDLE) GetWindowLong(ghwndMain, 0); if ((hHead) && (pHead = (PNODE)LocalLock(hHead))) { pTrail = pHead; while ((pHead->ChildWnd.hThisWnd != hwnd) && (pHead->hNext)) { hTmp = hHead; pTrail = pHead; hHead = pHead->hNext; LocalUnlock(hTmp); pHead = (PNODE) LocalLock(hHead); } if (pHead->ChildWnd.hThisWnd == hwnd) { pWndInfo = &pHead->ChildWnd; if (pTrail == pHead) SetWindowLong(ghwndMain, 0, (LONG) pHead->hNext); else pTrail->hNext = pHead->hNext; LocalUnlock(hHead); LocalFree(hHead); } else { LocalUnlock(hHead); } } return DefMDIChildProc(hwnd, message, wParam, lParam); } case WM_DESTROY: KillTimer(hwnd, 1); return 0L; case WM_PAINT: return DefMDIChildProc(hwnd, message, wParam, lParam); default: return DefMDIChildProc(hwnd, message, wParam, lParam); } } /***************************************************************************\ * ClientWndProc * \***************************************************************************/ long APIENTRY ClientWndProc( HWND hwnd, UINT message, DWORD wParam, LONG lParam) { static HANDLE hMem1 = NULL; static LPVOID pShrMem1 = NULL; static HANDLE hEdit; static HANDLE hTextWnd; BOOL fSuccess = FALSE; switch (message) { case WM_COMMAND: { switch (LOWORD(wParam)) { case MM_OPT_5: { //Open File Mapping SetWindowText(hTextWnd, GetStringRes (IDS_OPENING_FILE)); switch (DialogBox(ghModule, "MapName", hwnd, (DLGPROC)MapFileName)) { case IDBTN_OK: if (hMem1 = OpenMap(gszMapName)) fSuccess = TRUE; else fSuccess = FALSE; break; default: fSuccess = FALSE; break; } if (fSuccess) { EnableMenuItem(hClientMenu, MM_OPT_5, MF_GRAYED); EnableMenuItem(hClientMenu, MM_OPT_6, MF_ENABLED); SetWindowText(hTextWnd, GetStringRes (IDS_SEL_MAP_VIEW)); } else { SetWindowText(hTextWnd, GetStringRes (IDS_ERR_OPEN_MAPPING_FAILED)); } return 0L; } case MM_OPT_6: { //Map View of File SetWindowText(hTextWnd, GetStringRes (IDS_MAPPING_VIEW)); if (hMem1 && (pShrMem1 = (LPVOID) MapView(hMem1))) { EnableMenuItem(hClientMenu, MM_OPT_6, MF_GRAYED); EnableMenuItem(hClientMenu, MM_OPT_7, MF_ENABLED); SetWindowText(hTextWnd, GetStringRes (IDS_SEL_ACCESS_READ)); } else { SetWindowText(hTextWnd, GetStringRes(IDS_ERR_MAPVIEW_FAILED)); } return 0L; } case MM_OPT_7: { //Access RECT rcl; SetWindowText(hTextWnd, GetStringRes(IDS_ACCESSING_SERVER_READ)); fSuccess = FALSE; // assume failure. if (pShrMem1) { GetClientRect(hwnd, &rcl); hEdit = CreateWindow("edit", NULL, WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | ES_AUTOVSCROLL, 0,0, rcl.right-rcl.left, rcl.bottom-rcl.top-GetWindowLong(hTextWnd, GWL_USERDATA), hwnd, (HMENU) 1, ghModule, NULL); if (hEdit) { SetFocus(hEdit); fSuccess = TRUE; } } if (fSuccess) { SendMessage(hEdit, WM_SETTEXT, 0L, (LONG)pShrMem1); SetTimer(hwnd, 2, 1000, NULL); EnableMenuItem(hClientMenu, MM_OPT_7, MF_GRAYED); EnableMenuItem(hClientMenu, MM_OPT_8, MF_ENABLED); } else { MessageBox(ghwndMain, GetStringRes (IDS_ERR_ACCESS_READ_FAILED), NULL, MB_OK); SetWindowText(hTextWnd, GetStringRes (IDS_ERR_ACCESS_READ_FAILED)); } return 0L; } case MM_OPT_8: { // refresh now HANDLE hActive; hActive = (HANDLE) SendMessage(GetParent(hwnd), WM_MDIGETACTIVE, 0L, 0L); SendMessage(hEdit, WM_SETTEXT, 0L, (LONG)pShrMem1); return 0L; } } } case WM_TIMER: { HANDLE hActive; if (IsWindow (hEdit) && pShrMem1) { hActive = (HANDLE) SendMessage(GetParent(hwnd), WM_MDIGETACTIVE, 0L, 0L); SendMessage(hEdit, WM_SETTEXT, 0L, (LONG)pShrMem1); } return 0L; } case WM_MDIACTIVATE: if ((HWND) lParam == hwnd) { SendMessage(GetParent(hwnd), WM_MDISETMENU, (DWORD) hClientMenu, (LONG) hClientMenuWindow); DrawMenuBar(GetParent(GetParent(hwnd))) ; } return 0; case WM_SIZE: if (hEdit) MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam)-GetWindowLong(hTextWnd, GWL_USERDATA), TRUE); MoveWindow(hTextWnd, 0, HIWORD(lParam) - GetWindowLong(hTextWnd, GWL_USERDATA), LOWORD(lParam), HIWORD(lParam), TRUE); return DefMDIChildProc(hwnd, message, wParam, lParam); case WM_CREATE: { PPERWNDINFO pWndInfo; PNODE pHead; HANDLE hHead, hTmp; RECT rect; GetClientRect(hwnd, &rect); hTextWnd = CreateWindow("Text", NULL, WS_BORDER | SS_LEFT | WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, (HMENU) 2, ghModule, NULL); EnableMenuItem(hClientMenu, MM_OPT_5, MF_ENABLED); SetWindowText(hTextWnd, GetStringRes (IDS_SEL_OPEN_FILE)); // now find match hHead = (HANDLE) GetWindowLong(ghwndMain, 0); if (hHead && (pHead = (PNODE)LocalLock(hHead))) { while ((pHead->ChildWnd.hThisWnd != hwnd) && (pHead->hNext)) { hTmp = hHead; hHead = pHead->hNext; LocalUnlock(hTmp); pHead = (PNODE) LocalLock(hHead); } if (pHead->ChildWnd.hThisWnd == hwnd) { pWndInfo = &pHead->ChildWnd; GetClientRect(pWndInfo->hThisWnd, &pWndInfo->rcClient); } LocalUnlock(hHead); return DefMDIChildProc(hwnd, message, wParam, lParam); } return DefMDIChildProc(hwnd, message, wParam, lParam); } case WM_CLOSE: { PPERWNDINFO pWndInfo; PNODE pHead, pTrail; HANDLE hHead, hTmp; EnableMenuItem(hClientMenu, MM_OPT_6, MF_GRAYED); EnableMenuItem(hClientMenu, MM_OPT_7, MF_GRAYED); EnableMenuItem(hClientMenu, MM_OPT_8, MF_GRAYED); SendMessage(GetParent(hwnd), WM_MDISETMENU, (DWORD) hMenu, (LONG) hMenuWindow) ; DrawMenuBar(GetParent(GetParent(hwnd))) ; // Don't need to read from the edit control anymore KillTimer(hwnd, 2); // Unmap view, close mapping! if (pShrMem1) { UnmapViewOfFile (pShrMem1); pShrMem1 = NULL; } if (hMem1) { CloseHandle (hMem1); hMem1 = NULL; } // now find match hHead = (HANDLE) GetWindowLong(ghwndMain, 0); if (hHead && (pHead = (PNODE)LocalLock(hHead))) { pTrail = pHead; while ((pHead->ChildWnd.hThisWnd != hwnd) && (pHead->hNext)) { hTmp = hHead; pTrail = pHead; hHead = pHead->hNext; LocalUnlock(hTmp); pHead = (PNODE) LocalLock(hHead); } if (pHead->ChildWnd.hThisWnd == hwnd) { pWndInfo = &pHead->ChildWnd; if (pTrail == pHead) SetWindowLong(ghwndMain, 0, (LONG) pHead->hNext); else pTrail->hNext = pHead->hNext; LocalUnlock(hHead); LocalFree(hHead); } else { LocalUnlock(hHead); } } return DefMDIChildProc(hwnd, message, wParam, lParam); } case WM_DESTROY: return 0l; default: return DefMDIChildProc(hwnd, message, wParam, lParam); } } /***************************************************************************\ * About * * About dialog proc. * \***************************************************************************/ BOOL CALLBACK APIENTRY About( HWND hDlg, UINT message, DWORD wParam, LONG lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (wParam == IDOK) EndDialog(hDlg, wParam); break; } return FALSE; UNREFERENCED_PARAMETER(lParam); UNREFERENCED_PARAMETER(hDlg); } /***************************************************************************\ * MapFileName * * MapFileName dialog proc. * \***************************************************************************/ BOOL CALLBACK MapFileName( HWND hDlg, UINT message, DWORD wParam, LONG lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch (wParam) { case IDBTN_OK: { if (!GetDlgItemText(hDlg, IDEDIT_MAPNAME, gszMapName, 20)) { strncpy(gszMapName, "MapName1", 10); // default name } EndDialog(hDlg, IDBTN_OK); break; } } } return FALSE; UNREFERENCED_PARAMETER(lParam); UNREFERENCED_PARAMETER(hDlg); } /***************************************************************************\ * FileType * * FileType dialog proc. * \***************************************************************************/ BOOL CALLBACK FileType( HWND hDlg, UINT message, DWORD wParam, LONG lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch (wParam) { case IDBTN_PAGE: { EndDialog(hDlg, IDBTN_PAGE); break; } case IDBTN_MAP: { if ((GetDlgItemText(hDlg, IDEDIT_MAPFILE, gszFile, 20)) == 0) EndDialog(hDlg, IDBTN_PAGE); // default to use PAGE file else EndDialog(hDlg, IDBTN_MAP); break; } } } return FALSE; UNREFERENCED_PARAMETER(lParam); UNREFERENCED_PARAMETER(hDlg); } /************************************************************************* * * TextWndProc * * Text Window proc. * \***************************************************************************/ LONG APIENTRY TextWndProc (HWND hwnd, UINT message, DWORD wParam, LONG lParam) { static HFONT hFont = (HFONT) NULL; switch (message) { case WM_CREATE: { LOGFONT lf; HDC hDC; HFONT hOldFont; TEXTMETRIC tm; RECT rect; LONG lHeight; SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, FALSE); hDC = GetDC(hwnd); // this is the height for 8 point size font in pixels lf.lfHeight = 8 * GetDeviceCaps(hDC, LOGPIXELSY) / 72; hFont = CreateFontIndirect(&lf); hOldFont = SelectObject(hDC, hFont); GetTextMetrics(hDC, &tm); GetClientRect(GetParent(hwnd), &rect); // base the height of the window on size of text lHeight = tm.tmHeight+6*GetSystemMetrics(SM_CYBORDER)+2; // saved the height for later reference SetWindowLong(hwnd, GWL_USERDATA, lHeight); SetWindowPos(hwnd, NULL, 0, rect.bottom-lHeight, rect.right-rect.left, lHeight, SWP_NOZORDER | SWP_NOMOVE); ReleaseDC(hwnd, hDC); break; } case WM_DESTROY: if (hFont) DeleteObject(hFont); break; case WM_SETTEXT: DefWindowProc(hwnd, message, wParam, lParam); InvalidateRect(hwnd,NULL,FALSE); UpdateWindow(hwnd); return 0L; case WM_PAINT: { PAINTSTRUCT ps; RECT rc; char ach[128]; int len, nxBorder, nyBorder; HFONT hOldFont = NULL; BeginPaint(hwnd, &ps); GetClientRect(hwnd,&rc); nxBorder = GetSystemMetrics(SM_CXBORDER); rc.left += 9*nxBorder; rc.right -= 9*nxBorder; nyBorder = GetSystemMetrics(SM_CYBORDER); rc.top += 3*nyBorder; rc.bottom -= 3*nyBorder; // 3D Text len = GetWindowText(hwnd, ach, sizeof(ach)); SetBkColor(ps.hdc, GetSysColor(COLOR_BTNFACE)); SetBkMode(ps.hdc, TRANSPARENT); SetTextColor(ps.hdc, RGB(64,96,96)); if (hFont) hOldFont = SelectObject(ps.hdc, hFont); ExtTextOut(ps.hdc, rc.left+2*nxBorder+2, rc.top+2, ETO_OPAQUE | ETO_CLIPPED, &rc, ach, len, NULL); SetTextColor(ps.hdc, RGB(128,128,128)); if (hFont) hOldFont = SelectObject(ps.hdc, hFont); ExtTextOut(ps.hdc, rc.left+2*nxBorder+1, rc.top+1, ETO_CLIPPED, &rc, ach, len, NULL); SetTextColor(ps.hdc, RGB(255,255,255)); if (hFont) hOldFont = SelectObject(ps.hdc, hFont); ExtTextOut(ps.hdc, rc.left+2*nxBorder, rc.top, ETO_CLIPPED, &rc, ach, len, NULL); SetBkMode(ps.hdc, OPAQUE); if (hOldFont) SelectObject(ps.hdc, hOldFont); EndPaint(hwnd, &ps); return 0L; } } return DefWindowProc(hwnd, message, wParam, lParam); } //--------------------------------------------------------------------------- // // FUNCTION: GetStringRes (int id INPUT ONLY) // // COMMENTS: Load the resource string with the ID given, and return a // pointer to it. Notice that the buffer is common memory so // the string must be used before this call is made a second time. // //--------------------------------------------------------------------------- LPTSTR GetStringRes (int id) { static TCHAR buffer[MAX_PATH]; buffer[0]=0; LoadString (GetModuleHandle (NULL), id, buffer, MAX_PATH); return buffer; }