📄 memory.c
字号:
/****************************** Module Header ******************************\
* Module Name: memory.c
\***************************************************************************/
#include <windows.h>
#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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -