📄 mainframe.c
字号:
#include "StdSDK.h" // Standard application includes
#include "About.h" // For non-static function prototypes
#include "Initialization.h" // For non-static function prototypes
#include "DiskHandling.h" // For non-static function prototypes
#include "resource.h" // For resource identifiers
//
// Function prototypes for static functions
//
static BOOL mainFrame_DisplayContextMenu (HWND hwnd, POINT pt) ;
static BOOL mainFrame_IntersectRect (LPRECT rect1, LPRECT rect2) ;
static void mainFrame_ResetDisks (HWND hwnd) ;
static void mainFrame_SetHanoiMappingMode (HWND hwnd, int cxClient, int cyClient) ;
static void mainFrame_SolveProblem (HWND hwnd) ;
//
// Function prototypes for callback functions
//
BOOL CALLBACK mainFrame_SysColorChangeEnumeration (HWND hwnd, LPARAM lParam) ;
LRESULT CALLBACK mainFrameWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ;
//
// Function prototypes for message handlers
//
static void mainFrame_OnCommand (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) ;
static BOOL mainFrame_OnContextMenu (HWND hwnd, HWND hwndCtl, int xPos, int yPos) ;
static BOOL mainFrame_OnCreate (HWND hwnd, LPCREATESTRUCT lpCreateStruct) ;
static void mainFrame_OnDestroy (HWND hwnd) ;
static void mainFrame_OnDisplayChange (HWND hwnd, UINT cBitsPerPixel, UINT cxScreen, UINT cyScreen) ;
static void mainFrame_OnNCRButtonUp (HWND hwnd, int x, int y, UINT codeHitTest) ;
static BOOL mainFrame_OnNotify (HWND hwnd, int idFrom, NMHDR FAR* pnmhdr) ;
static void mainFrame_OnPaint (HWND hwnd) ;
static void mainFrame_OnPrintClient (HWND hwnd, HDC hdc, UINT uFlags) ;
static void mainFrame_OnRButtonDown (HWND hwnd, BOOL fDoubleClick, int x, int y, UINT keyFlags) ;
static void mainFrame_OnSettingChange (HWND hwnd, UINT uiFlag, LPCTSTR pszMetrics) ;
static void mainFrame_OnSize (HWND hwnd, UINT state, int cx, int cy) ;
static void mainFrame_OnSysColorChange(HWND hwnd) ;
static void mainFrame_OnUserChanged (HWND hwnd) ;
static void mainFrame_OnWinIniChange (HWND hwnd, LPCTSTR pszSection) ;
//
// Typedefs
//
//
// Function prototypes for callback functions
//
BOOL CALLBACK mainFrame_SysColorChangeNotification (HWND hwnd, LPARAM lParam) ;
LRESULT CALLBACK mainFrameWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ;
//
// LRESULT CALLBACK
// mainFrameWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
//
// hwnd Handle of window to which this message applies
// message Message number
// wParam Message parameter
// lParam Message parameter
//
// PURPOSE: Processes messages for the main window.
//
// MESSAGES:
//
// WM_COMMAND - notification from the menu or controls
// WM_CONTEXTMENU - request to display a context menu
// WM_CREATE - notification that a window is being created
// WM_DESTROY - window is being destroyed
// WM_DISPLAYCHANGE - display resolution change notification
// WM_NCRBUTTONUP - right button release in non-client area
// WM_NOTIFY - notifcation from a common control
// WM_PAINT - redraw all or part of the client area
// WM_PRINTCLIENT - request to draw all of client area into provided DC
// WM_RBUTTONDOWN - right button click in client area
// WM_SETTINGCHANGE - system parameter change notification
// WM_SIZE - window size has changed
// WM_SYSCOLORCHANGE - system color setting change notification
// WM_USERCHANGED - user log in/out notification
//
LRESULT CALLBACK
mainFrameWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case WM_COMMAND: // Notification from menu or control
return HANDLE_WM_COMMAND (hwnd, wParam, lParam, mainFrame_OnCommand) ;
case WM_CONTEXTMENU: // Request to display a context menu
return HANDLE_WM_CONTEXTMENU (hwnd, wParam, lParam, mainFrame_OnContextMenu) ;
case WM_CREATE: // Notification that a window is being created
return HANDLE_WM_CREATE (hwnd, wParam, lParam, mainFrame_OnCreate) ;
case WM_DESTROY: // Window is being destroyed
return HANDLE_WM_DESTROY (hwnd, wParam, lParam, mainFrame_OnDestroy) ;
case WM_DISPLAYCHANGE: // Only comes through on plug'n'play systems
return HANDLE_WM_DISPLAYCHANGE (hwnd, wParam, lParam, mainFrame_OnDisplayChange) ;
case WM_NCRBUTTONUP: // Right click on windows non-client area...
return HANDLE_WM_NCRBUTTONUP (hwnd, wParam, lParam, mainFrame_OnNCRButtonUp) ;
case WM_NOTIFY: // Notification from a Common Control
return HANDLE_WM_NOTIFY (hwnd, wParam, lParam, mainFrame_OnNotify) ;
case WM_PAINT: // Draw all or part of client area
return HANDLE_WM_PAINT (hwnd, wParam, lParam, mainFrame_OnPaint) ;
case WM_PRINTCLIENT: // Draw all of client area into provided DC
return HANDLE_WM_PRINTCLIENT (hwnd, wParam, lParam, mainFrame_OnPrintClient) ;
case WM_RBUTTONDOWN: // Right click in windows client area...
return HANDLE_WM_RBUTTONDOWN (hwnd, wParam, lParam, mainFrame_OnRButtonDown) ;
case WM_SETTINGCHANGE: // An application changed a systemwide setting
// case WM_WININICHANGE: // A WIN.INI setting has changed
return HANDLE_WM_SETTINGCHANGE (hwnd, wParam, lParam, mainFrame_OnSettingChange) ;
case WM_SIZE: // Window size has changed
return HANDLE_WM_SIZE (hwnd, wParam, lParam, mainFrame_OnSize) ;
case WM_SYSCOLORCHANGE: // A change has been made to a system color setting
return HANDLE_WM_SYSCOLORCHANGE (hwnd, wParam, lParam, mainFrame_OnSysColorChange) ;
case WM_USERCHANGED: // User logged in or out
return HANDLE_WM_USERCHANGED (hwnd, wParam, lParam, mainFrame_OnUserChanged) ;
default:
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
}
//
// void mainFrame_OnCommand (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
//
// hwnd Handle of window to which this message applies
// id Specifies the identifier of the menu item, control, or accelerator.
// hwndCtl Handle of the control sending the message if the message
// is from a control, otherwise, this parameter is NULL.
// codeNotify Specifies the notification code if the message is from a control.
// This parameter is 1 when the message is from an accelerator.
// This parameter is 0 when the message is from a menu.
//
// PURPOSE:
//
// COMMENTS:
//
static void
mainFrame_OnCommand (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch (id) {
case ID_APP_ABOUT:
doAbout(hwnd);
return ;
case ID_APP_EXIT:
DestroyWindow (hwnd) ;
return ;
case ID_HELP_HELP_TOPICS:
{
BOOL bGotHelp = WinHelp (hwnd, getHelpFileName (), HELP_FINDER, (DWORD) 0) ;
if (!bGotHelp)
MessageBox (GetFocus(), TEXT("Unable to activate help"), getAppName (), MB_OK|MB_ICONHAND) ;
}
return ;
case IDM_HELP_HOWTO:
doHow(hwnd);
return ;
case IDM_RESET_DISKS:
mainFrame_ResetDisks (hwnd) ;
return ;
case IDM_SOLVE_PROBLEM:
{
HMENU hmenu = GetMenu (hwnd) ;
EnableMenuItem (hmenu, IDM_RESET_DISKS, MF_DISABLED | MF_GRAYED) ;
EnableMenuItem (hmenu, IDM_SOLVE_PROBLEM, MF_DISABLED | MF_GRAYED) ;
DrawMenuBar (hwnd) ;
mainFrame_SolveProblem (hwnd) ;
EnableMenuItem (hmenu, IDM_RESET_DISKS, MF_ENABLED) ;
EnableMenuItem (hmenu, IDM_SOLVE_PROBLEM, MF_ENABLED) ;
DrawMenuBar (hwnd) ;
}
return ;
default:
FORWARD_WM_COMMAND (hwnd, id, hwndCtl, codeNotify, DefWindowProc) ;
}
}
//
// BOOL mainFrame_OnContextMenu (HWND hwnd, HWND hwndCtl, int xPos, int yPos)
//
// hwnd Handle of window to which this message applies
// hwndCtl Handle of the window in which the user right clicked the mouse
// This may be the frame window itself or a control.
// xPos Horizontal position of the cursor, in screen coordinates
// yPos Vertical position of the cursor, in screen coordinates
//
// PURPOSE: Notification that the user clicked the right
// mouse button in the window.
//
// COMMENTS: Normally a window processes this message by
// displaying a context menu using the TrackPopupMenu
// or TrackPopupMenuEx functions. If a window does not
// display a context menu it should pass this message
// to the DefWindowProc function.
//
static BOOL
mainFrame_OnContextMenu (HWND hwnd, HWND hwndCtl, int xPos, int yPos)
{
POINT pt = { xPos, yPos } ; // location of mouse click
RECT rc ; // client area of window
// Get the bounding rectangle of the client area.
GetClientRect (hwnd, &rc) ;
// Convert the mouse position to client coordinates.
ScreenToClient (hwnd, &pt) ;
// If the mouse click was in the client area,
// display the appropriate floating popup menu.
if (PtInRect (&rc, pt))
if (mainFrame_DisplayContextMenu (hwnd, pt))
return TRUE ;
// Otherwise forward the message for default processing
return FORWARD_WM_CONTEXTMENU (hwnd, hwndCtl, xPos, yPos, DefWindowProc) ;
}
//
// BOOL mainFrame_OnCreate (HWND hwnd, LPCREATESTRUCT lpCreateStruct)
//
// hwnd Handle of window to which this message applies
// lpCreateStruct Points to a CREATESTRUCT structure that contains
// information about the window being created
//
// PURPOSE: Perform any per-window initialization in response
// to this message, such as creating any desired
// child windows such as toolbars and status bars.
//
// COMMENTS: Windows sends this message after the window is
// created, but before the window becomes visible.
// Return TRUE to continue creation of the window;
// otherwise return FALSE to fail the window creation.
//
static BOOL
mainFrame_OnCreate (HWND hwnd, LPCREATESTRUCT lpCreateStruct)
{
/***************************************************/
/* The main application window is being created. */
/* Create the five windows representing the disks. */
/***************************************************/
mainFrame_CreateDiskWindows (hwnd) ;
return TRUE ;
}
//
// void mainFrame_OnDestroy (HWND hwnd)
//
// hwnd Handle of window to which this message applies
//
// PURPOSE: Notification that the specified window is being destroyed.
// The window is no longer visible to the user.
//
// COMMENTS:
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -