📄 mdidemo.c
字号:
break ; // ...and then to DefFrameProc
}
break ;
case WM_QUERYENDSESSION :
case WM_CLOSE : // Attempt to close all children
SendMessage (hwnd, WM_COMMAND, IDM_CLOSEALL, 0) ;
if (NULL != GetWindow (hwndClient, GW_CHILD))
return 0 ;
break ; // I.e., call DefFrameProc
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
// Pass unprocessed messages to DefFrameProc (not DefWindowProc)
return DefFrameProc (hwnd, hwndClient, iMsg, wParam, lParam) ;
}
BOOL CALLBACK CloseEnumProc (HWND hwnd, LPARAM lParam)
{
if (GetWindow (hwnd, GW_OWNER)) // Check for icon title
return 1 ;
SendMessage (GetParent (hwnd), WM_MDIRESTORE, (WPARAM) hwnd, 0) ;
if (!SendMessage (hwnd, WM_QUERYENDSESSION, 0, 0))
return 1 ;
SendMessage (GetParent (hwnd), WM_MDIDESTROY, (WPARAM) hwnd, 0) ;
return 1 ;
}
LRESULT CALLBACK HelloWndProc (HWND hwnd, UINT iMsg, WPARAM wParam,
LPARAM lParam)
{
static COLORREF clrTextArray[] = { RGB (0, 0, 0), RGB (255, 0, 0),
RGB (0, 255, 0), RGB ( 0, 0, 255),
RGB (255, 255, 255) } ;
static HWND hwndClient, hwndFrame ;
HDC hdc ;
HMENU hMenu ;
LPHELLODATA lpHelloData ;
PAINTSTRUCT ps ;
RECT rect ;
switch (iMsg)
{
case WM_CREATE :
// Allocate memory for window private data
lpHelloData = (LPHELLODATA) HeapAlloc (GetProcessHeap (),
HEAP_ZERO_MEMORY,
sizeof (HELLODATA)) ;
lpHelloData->iColor = IDM_BLACK ;
lpHelloData->clrText = RGB (0, 0, 0) ;
SetWindowLong (hwnd, 0, (long) lpHelloData) ;
// Save some window handles
hwndClient = GetParent (hwnd) ;
hwndFrame = GetParent (hwndClient) ;
return 0 ;
case WM_COMMAND :
switch (wParam)
{
case IDM_BLACK :
case IDM_RED :
case IDM_GREEN :
case IDM_BLUE :
case IDM_WHITE :
// Change the text color
lpHelloData = (LPHELLODATA) GetWindowLong (hwnd, 0) ;
hMenu = GetMenu (hwndFrame) ;
CheckMenuItem (hMenu, lpHelloData->iColor,
MF_UNCHECKED) ;
lpHelloData->iColor = wParam ;
CheckMenuItem (hMenu, lpHelloData->iColor,
MF_CHECKED) ;
lpHelloData->clrText =
clrTextArray[wParam - IDM_BLACK] ;
InvalidateRect (hwnd, NULL, FALSE) ;
}
return 0 ;
case WM_PAINT :
// Paint the window
hdc = BeginPaint (hwnd, &ps) ;
lpHelloData = (LPHELLODATA) GetWindowLong (hwnd, 0) ;
SetTextColor (hdc, lpHelloData->clrText) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, "Hello, World!", -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_MDIACTIVATE :
// Set the Hello menu if gaining focus
if (lParam == (LPARAM) hwnd)
SendMessage (hwndClient, WM_MDISETMENU,
(WPARAM) hMenuHello, (LPARAM) hMenuHelloWindow) ;
// Check or uncheck menu item
lpHelloData = (LPHELLODATA) GetWindowLong (hwnd, 0) ;
CheckMenuItem (hMenuHello, lpHelloData->iColor,
(lParam == (LPARAM) hwnd) ? MF_CHECKED : MF_UNCHECKED) ;
// Set the Init menu if losing focus
if (lParam != (LPARAM) hwnd)
SendMessage (hwndClient, WM_MDISETMENU, (WPARAM) hMenuInit,
(LPARAM) hMenuInitWindow) ;
DrawMenuBar (hwndFrame) ;
return 0 ;
case WM_QUERYENDSESSION :
case WM_CLOSE :
if (IDOK != MessageBox (hwnd, "OK to close window?", "Hello",
MB_ICONQUESTION | MB_OKCANCEL))
return 0 ;
break ; // I.e., call DefMDIChildProc
case WM_DESTROY :
lpHelloData = (LPHELLODATA) GetWindowLong (hwnd, 0) ;
HeapFree (GetProcessHeap (), 0, lpHelloData) ;
return 0 ;
}
// Pass unprocessed message to DefMDIChildProc
return DefMDIChildProc (hwnd, iMsg, wParam, lParam) ;
}
LRESULT CALLBACK RectWndProc (HWND hwnd, UINT iMsg, WPARAM wParam,
LPARAM lParam)
{
static HWND hwndClient, hwndFrame ;
HBRUSH hBrush ;
HDC hdc ;
LPRECTDATA lpRectData ;
PAINTSTRUCT ps ;
int xLeft, xRight, yTop, yBottom ;
short nRed, nGreen, nBlue ;
switch (iMsg)
{
case WM_CREATE :
// Allocate memory for window private data
lpRectData = (LPRECTDATA) HeapAlloc (GetProcessHeap (),
HEAP_ZERO_MEMORY,
sizeof (RECTDATA)) ;
SetWindowLong (hwnd, 0, (long) lpRectData) ;
// Start the timer going
SetTimer (hwnd, 1, 250, NULL) ;
// Save some window handles
hwndClient = GetParent (hwnd) ;
hwndFrame = GetParent (hwndClient) ;
return 0 ;
case WM_SIZE : // If not minimized, save the window size
if (wParam != SIZE_MINIMIZED)
{
lpRectData = (LPRECTDATA) GetWindowLong (hwnd, 0) ;
lpRectData->cxClient = LOWORD (lParam) ;
lpRectData->cyClient = HIWORD (lParam) ;
}
break ; // WM_SIZE must be processed by DefMDIChildProc
case WM_TIMER : // Display a random rectangle
lpRectData = (LPRECTDATA) GetWindowLong (hwnd, 0) ;
xLeft = rand () % lpRectData->cxClient ;
xRight = rand () % lpRectData->cxClient ;
yTop = rand () % lpRectData->cyClient ;
yBottom = rand () % lpRectData->cyClient ;
nRed = rand () & 255 ;
nGreen = rand () & 255 ;
nBlue = rand () & 255 ;
hdc = GetDC (hwnd) ;
hBrush = CreateSolidBrush (RGB (nRed, nGreen, nBlue)) ;
SelectObject (hdc, hBrush) ;
Rectangle (hdc, min (xLeft, xRight), min (yTop, yBottom),
max (xLeft, xRight), max (yTop, yBottom)) ;
ReleaseDC (hwnd, hdc) ;
DeleteObject (hBrush) ;
return 0 ;
case WM_PAINT : // Clear the window
InvalidateRect (hwnd, NULL, TRUE) ;
hdc = BeginPaint (hwnd, &ps) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_MDIACTIVATE : // Set the appropriate menu
if (lParam == (LPARAM) hwnd)
SendMessage (hwndClient, WM_MDISETMENU, (WPARAM) hMenuRect,
(LPARAM) hMenuRectWindow) ;
else
SendMessage (hwndClient, WM_MDISETMENU, (WPARAM) hMenuInit,
(LPARAM) hMenuInitWindow) ;
DrawMenuBar (hwndFrame) ;
return 0 ;
case WM_DESTROY :
lpRectData = (LPRECTDATA) GetWindowLong (hwnd, 0) ;
HeapFree (GetProcessHeap (), 0, lpRectData) ;
KillTimer (hwnd, 1) ;
return 0 ;
}
// Pass unprocessed message to DefMDIChildProc
return DefMDIChildProc (hwnd, iMsg, wParam, lParam) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -