📄 debmain.c
字号:
/******************************************************************************\
* 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 : DEBMain.C
// PURPOSE : A Win32 Application demonstrating the Debug APIs
// FUNCTIONS :
// WinMain() - application entry point
// MainWndProc() - processes messages
// ProcessCommandsWndProc() - processes WM_COMMAND messages
// PreferencesDlgProc() - processes messages for "Preferences" dialog box
// AttachDlgProc() - processes messages for "Attach" dialog box
// AboutDlgProc() - processes messages for "About" dialog box
// NewListBoxWndProc() - subclass procedure to prevent listbox moving
// TimerProc() - timer procedure for animated icon
// COMMENTS :
//
// ************************************************************************
#define STRICT // enable strict typing
#include <Windows.H> // required for all Windows applications
#include "StdLib.H" // __argc, __argv
#include "LinkList.H" // double linked list package (OBJ)
#include "DEBDebug.H" // debugging support functions
#include "DEBMisc.H" // misc support functions
#include "DEBMain.H" // specific to this module
// global data
// ------------------------------------------------------------------------
GLOBAL Global; // various global data
PROFILE Profile; // various profile data
// internal data
// ------------------------------------------------------------------------
#define TIMEOUT_ANIMATED_ICON 150L // animated icon timeout
static TCHAR szSourceFileName[] = TEXT(__FILE__);
// location of various files
// ------------------------------------------------------------------------
TCHAR szPath[MAX_PATH]; // path where the running application
// resides
TCHAR szExePathName[MAX_PATH]; // full pathname of the application
TCHAR szHelpPathName[MAX_PATH]; // full pathname of the application's
// help file
TCHAR szIniPathName[MAX_PATH]; // full pathname of the application's
// ini file
// internal function prototypes
// ------------------------------------------------------------------------
LRESULT CALLBACK MainWndProc ( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK ProcessCommandsWndProc ( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK NewListBoxWndProc ( HWND, UINT, WPARAM, LPARAM );
BOOL CALLBACK PreferencesDlgProc ( HWND, UINT, WPARAM, LPARAM );
BOOL CALLBACK AttachDlgProc ( HWND, UINT, WPARAM, LPARAM );
BOOL CALLBACK AboutDlgProc ( HWND, UINT, WPARAM, LPARAM );
VOID CALLBACK TimerProc ( HWND, UINT, UINT, DWORD );
// ************************************************************************
// FUNCTION : WinMain( HINSTANCE, HINSTANCE, LPSTR, INT )
// PURPOSE : initialize the window, process the message dispatch loop
// COMMENTS :
//
// ************************************************************************
INT WINAPI
WinMain( HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpCmdLine,
INT nCmdShow )
{
MSG Msg;
WNDCLASS WndClass;
HACCEL hAccel;
OSVERSIONINFO osvi;
LPCTSTR lpszIconName = TEXT( "DebugIcon" );
LPCTSTR lpszMenuName = TEXT( "DebugMenu" );
LPCTSTR lpszClassName = TEXT( "DebugClass" );
LPCTSTR lpszAccelName = TEXT( "DebugAccel" );
LPCTSTR lpszIniFileExt = TEXT( "INI" );
LPCTSTR lpszHelpFileExt = TEXT( "HLP" );
Global.hInstance = hInstance;
Global.dwActiveDebuggees = 0;
//-- Load the "A Windows API Failed" resource string
{
TCHAR szApiFailed[] = TEXT( "A Windows API Failed" );
if( !LoadString( Global.hInstance, IDS_API_FAILED_MSG,
Global.szApiFailed, sizeof(Global.szApiFailed) ) ) {
ErrorMessageBox( TEXT( "First LoadString()" ),
szApiFailed, szSourceFileName, __LINE__ );
lstrcpy( Global.szApiFailed, szApiFailed );
}
}
//-- Load all other resource strings
if( !LoadString( Global.hInstance, IDS_APPNAME, Global.szAppName,
sizeof(Global.szAppName) ) )
ErrorMessageBox( TEXT("LoadString()"),
Global.szApiFailed, szSourceFileName, __LINE__ );
if( !LoadString( Global.hInstance, IDS_SHORT_APPNAME,
Global.szShortAppName, sizeof(Global.szShortAppName) ) )
ErrorMessageBox( TEXT("LoadString()"),
Global.szApiFailed, szSourceFileName, __LINE__ );
//-- if compiled for Win32 (Unicode) and not Win32s then display
// notice and terminate
//
// Detect platform and exit gracefully if unsupported platform.
//
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
GetVersionEx (&osvi);
if (osvi.dwPlatformId == VER_PLATFORM_WIN32s) {
TCHAR szTitleBuffer[64];
TCHAR szTextBuffer[256];
if( !LoadString( Global.hInstance, IDS_WINDOWS_NT_REQUIRED_TITLE,
szTitleBuffer, sizeof(szTitleBuffer) ) )
ErrorMessageBox( TEXT("LoadString()"),
Global.szApiFailed, szSourceFileName, __LINE__ );
if( !LoadString( Global.hInstance, IDS_WINDOWS_NT_REQUIRED,
szTextBuffer, sizeof(szTextBuffer) ) )
ErrorMessageBox( TEXT("LoadString()"),
Global.szApiFailed, szSourceFileName, __LINE__ );
MessageBox( NULL, szTextBuffer, szTitleBuffer,
MB_APPLMODAL | MB_ICONSTOP | MB_OK );
return( -1 );
}
//-- register the debug event window class
WndClass.style = CS_DBLCLKS;
WndClass.lpfnWndProc = (WNDPROC) MainWndProc;
WndClass.cbClsExtra = (INT) NULL;
WndClass.cbWndExtra = (INT) NULL;
WndClass.hInstance = Global.hInstance;
WndClass.hIcon = LoadIcon( Global.hInstance, lpszIconName );
WndClass.hCursor = LoadCursor( NULL, (LPTSTR) IDC_ARROW );
WndClass.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE+1);
WndClass.lpszMenuName = lpszMenuName;
WndClass.lpszClassName = lpszClassName;
if( !RegisterClass(&WndClass) ) {
ErrorMessageBox( TEXT("RegisterClass()"),
Global.szApiFailed, szSourceFileName, __LINE__ );
return( FALSE );
}
//-- get application pathname and store the ini and help file pathname
// (which is located in the same directory as the application)
GetModuleFileName( (HANDLE) NULL, szExePathName,
sizeof(szExePathName)/sizeof(TCHAR) );
GetPathFromFullPathName( szExePathName, szPath,
sizeof(szPath)/sizeof(TCHAR) );
wsprintf( szIniPathName, TEXT( "%s\\%s.%s" ), szPath,
Global.szShortAppName, lpszIniFileExt );
wsprintf( szHelpPathName, TEXT( "%s\\%s.%s" ), szPath,
Global.szShortAppName, lpszHelpFileExt );
//-- retrieve stored default location from private profile data
GetPrivateProfileSettings( Global.szAppName, szIniPathName, &Profile );
//-- Create a main window for this application instance
Global.hWndMain = CreateWindow( lpszClassName, Global.szAppName,
WS_OVERLAPPEDWINDOW,
Profile.xPos, Profile.yPos,
Profile.nWidth, Profile.nHeight,
NULL, NULL, Global.hInstance, NULL );
//-- If window could not be created, return "failure"
if( !Global.hWndMain ) {
ErrorMessageBox( TEXT("CreateWindow()"),
Global.szApiFailed, szSourceFileName, __LINE__ );
return( FALSE );
}
//-- Load main menu accelerators
if( !(hAccel = LoadAccelerators( Global.hInstance, lpszAccelName) ) ) {
ErrorMessageBox( TEXT("LoadAccelerators()"),
Global.szApiFailed, szSourceFileName, __LINE__ );
return( FALSE );
}
//-- modify the menu to reflect saved settings
UpdateMenuSettings( Global.hWndMain );
//-- Make the window visible; update its client area; and return "success"
if( Profile.fMaximized )
ShowWindow( Global.hWndMain, SW_SHOWMAXIMIZED );
else if ( Profile.fMinimized )
ShowWindow( Global.hWndMain, SW_SHOWMINIMIZED );
else
ShowWindow( Global.hWndMain, SW_SHOWDEFAULT );
UpdateWindow( Global.hWndMain );
//-- Acquire and dispatch messages until a WM_QUIT message is received.
while( GetMessage( &Msg, NULL, 0, 0 ) ) {
if( !TranslateAccelerator( Global.hWndMain, hAccel, &Msg ) ) {
TranslateMessage( &Msg );
DispatchMessage( &Msg );
}
}
return( Msg.wParam );
UNREFERENCED_PARAMETER( lpCmdLine ); // avoid warnings
UNREFERENCED_PARAMETER( hPrevInst ); // always NULL under Windows NT
UNREFERENCED_PARAMETER( nCmdShow ); //
}
// ************************************************************************
// FUNCTION : MainWndProc( HWND, UINT, WPARAM, LPARAM )
// PURPOSE : Processes uMsgs
// MESSAGES :
// WM_COMMAND - passed to ProcessCommandsWndProc()
// WM_DESTROY - destroy window
// ...
// COMMENTS :
//
// ************************************************************************
LRESULT CALLBACK
MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
#define TOP_BORDER 4
#define BOTTOM_BORDER 4
#define SIDE_BORDER 4
#define MIN_HEIGHT 128
static HDC hDC;
switch( uMsg ) {
//-- forward all WM_COMMANDS to separate handler function
case WM_COMMAND:
return( ProcessCommandsWndProc( hWnd, uMsg, wParam, lParam) );
//-- create debug event listbox
case UM_CREATE_LISTBOX: {
TCHAR szWindowName[64];
HFONT hFont;
LoadString( Global.hInstance, IDS_DEBUG_EVENTS, szWindowName,
sizeof(szWindowName)/sizeof(TCHAR) );
Global.hWndListBox = CreateWindow(
TEXT( "ListBox" ),
szWindowName,
WS_CHILD | WS_VISIBLE |
WS_CAPTION | WS_VSCROLL |
WS_HSCROLL | LBS_NOTIFY |
LBS_DISABLENOSCROLL | LBS_USETABSTOPS |
LBS_NOINTEGRALHEIGHT,
(INT) SIDE_BORDER,
(INT) (Profile.fToolBar
? (Global.ToolBarHeight + TOP_BORDER)
: TOP_BORDER),
(INT) Global.ListBoxSize.cx,
(INT) Global.ListBoxSize.cy,
hWnd, (HMENU) NULL, Global.hInstance, NULL );
//-- Subclass the listbox so the user cannot move it
Global.OldListBoxWndProc = SubclassWindow( Global.hWndListBox,
(WNDPROC) NewListBoxWndProc );
//-- set listbox font & background color
hDC = GetDC( Global.hWndListBox );
hFont = CreateFontIndirect( &(Profile.LogFont) );
SelectObject( hDC, hFont );
SendMessage( Global.hWndListBox, WM_CTLCOLORLISTBOX, (WPARAM) hDC,
(LPARAM) Global.hWndListBox );
SendMessage( Global.hWndListBox, WM_SETFONT, (WPARAM) hFont, TRUE );
ReleaseDC( Global.hWndListBox, hDC );
//-- if command line contains a debuggee name then
// start and detach the debug event processing thread
if( __argc == 2 )
StartDebuggee( (LPTSTR) __argv[1], Global.hWndListBox );
return( FALSE );
}
//-- create ToolBar & send message to create the Debug Events listbox
case WM_CREATE:
Global.hWndToolBar = CreateTextButtonBar( hWnd, &Global.ToolBarHeight );
if( Profile.fToolBar )
ShowWindow( Global.hWndToolBar, SW_SHOW );
PostMessage( hWnd, UM_CREATE_LISTBOX, 0, 0 );
return( FALSE );
//-- resize the debug event listbox when the window size changes
case WM_SIZE:
Global.ClientSize.cx = LOWORD( lParam );
Global.ClientSize.cy = HIWORD( lParam );
Global.ListBoxSize.cx = Global.ClientSize.cx - ( 2*SIDE_BORDER );
Global.ListBoxSize.cy = max( Global.ClientSize.cy, MIN_HEIGHT
+ TOP_BORDER )
- (TOP_BORDER + BOTTOM_BORDER);
if( Profile.fToolBar )
Global.ListBoxSize.cy -= Global.ToolBarHeight;
if( Global.hWndListBox != NULL)
MoveWindow( Global.hWndListBox,
(INT) SIDE_BORDER,
(INT) (Profile.fToolBar ? Global.ToolBarHeight + TOP_BORDER : TOP_BORDER),
(INT) Global.ListBoxSize.cx, (INT) Global.ListBoxSize.cy, TRUE );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -