📄 debmisc.c
字号:
}
// ========================================================================
// helper functions
// ========================================================================
// ************************************************************************
// FUNCTION : ErrorMessageBox( LPCTSTR, LPCTSTR, LPCTSTR, INT )
// PURPOSE : Displays an error message box with various error information
// and allows the user to terminate or continue the process.
// For a Win32 Application, GetLastError and FormatMessage are
// used to retrieve the last API error code and error message.
// COMMENTS :
// ************************************************************************
BOOL
ErrorMessageBox( LPCTSTR lpszText, LPCTSTR lpszTitle, LPCTSTR lpszFile,
INT Line )
{
#define ERROR_BUFFER_SIZE 512
static TCHAR Format[] =
TEXT( "%s\n\n" )
TEXT( "-- Error Information --\n" )
TEXT( "File : %s\n" )
TEXT( "Line : %d\n" )
TEXT( "Error Number : %d\n" )
TEXT( "Error Message : %s\n" )
TEXT( "\n" )
TEXT( "Press OK to terminate this application." );
LPTSTR lpFormatMessageBuffer;
DWORD dwFormatMessage;
DWORD dwGetLastError;
HLOCAL hMessageBoxBuffer;
LPVOID lpMessageBoxBuffer;
//-- perform a simple check on the needed buffer size
if( lstrlen(lpszText) > (ERROR_BUFFER_SIZE - lstrlen(Format)) )
return( FALSE );
//-- allocate the message box buffer
hMessageBoxBuffer = LocalAlloc( LMEM_MOVEABLE, ERROR_BUFFER_SIZE );
lpMessageBoxBuffer = LocalLock( hMessageBoxBuffer );
//-- get the system error and system error message
dwGetLastError = GetLastError();
dwFormatMessage = FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER
| FORMAT_MESSAGE_FROM_SYSTEM,
NULL, dwGetLastError, LANG_NEUTRAL,
(LPTSTR) &lpFormatMessageBuffer, 0, NULL );
if( !dwFormatMessage )
lpFormatMessageBuffer = TEXT("FormatMessage() failed!");
//-- format the error messge box string
wsprintf( lpMessageBoxBuffer, Format, lpszText, lpszFile, Line,
dwGetLastError, lpFormatMessageBuffer );
// -- display the error and allow the user to terminate or continue
if( MessageBox( NULL, lpMessageBoxBuffer, lpszTitle,
MB_APPLMODAL | MB_ICONSTOP | MB_OKCANCEL )
== IDOK )
ExitProcess( 0 );
//-- free all buffers
if( dwFormatMessage )
LocalFree( (HLOCAL) lpFormatMessageBuffer );
LocalFree( (HLOCAL) hMessageBoxBuffer );
return( TRUE );
}
// ************************************************************************
// FUNCTION : SubclassWindow( HWND, WNDPROC )
// PURPOSE : Subclasses a window procedure
// COMMENTS : Returns the old window procedure
// ************************************************************************
WNDPROC
SubclassWindow( HWND hWnd, WNDPROC NewWndProc)
{
WNDPROC OldWndProc;
OldWndProc = (WNDPROC) GetWindowLong( hWnd, GWL_WNDPROC );
SetWindowLong( hWnd, GWL_WNDPROC, (LONG) NewWndProc );
return OldWndProc;
}
// ************************************************************************
// FUNCTION : SendWmSizeMessage( HWND )
// PURPOSE : Sends a WM_SIZE message containing the current size
// COMMENTS : Forces a WM_SIZE message without actually changing the size
// ************************************************************************
BOOL
SendWmSizeMessage( HWND hWnd )
{
RECT Rect;
if( !GetClientRect( hWnd, &Rect ) )
return( FALSE );
return( SendMessage( hWnd, WM_SIZE, SIZENORMAL,
MAKELONG( Rect.right - Rect.left, Rect.bottom - Rect.top) ) );
}
// ************************************************************************
// FUNCTION : GetPathFromFullPathName( LPCTSTR, LPTSTR, UINT )
// PURPOSE : Extracts the path given a full pathname
// COMMENTS :
// ************************************************************************
UINT
GetPathFromFullPathName( LPCTSTR lpFullPathName, LPTSTR lpPathBuffer,
UINT nPathBufferLength )
{
UINT nLength;
int i, j;
if( (nLength = (UINT) lstrlen( lpFullPathName ) ) > nPathBufferLength )
return( nLength );
lstrcpy( lpPathBuffer, lpFullPathName );
for( j = 0, i = nLength; (UINT)j < nLength;
j += IsDBCSLeadByte(lpPathBuffer[j]) ? 2 : 1){
if( lpPathBuffer[j] == '\\' || lpPathBuffer[j] == ':' ){
i = j;
}
}
if( lpPathBuffer[i] == ':' )
lpPathBuffer[i+1] = '\0';
else
lpPathBuffer[i] = '\0';
return( (UINT) i );
}
// ************************************************************************
// FUNCTION : CopyListBoxToClipboard( HWND, LONG )
// PURPOSE : Copies the entire contents of a listbox into the clipboard.
// COMMENTS : Returns TRUE on success, FALSE otherwise
// ************************************************************************
BOOL
CopyListBoxToClipboard( HWND hWndListBox, LONG MaxStrLen )
{
LPTSTR lpDataBuffer;
HGLOBAL hDataBuffer;
TCHAR TempBuffer[256];
DWORD dwItemCount;
DWORD Count;
LONG StrLen;
DWORD dwMemSize;
dwItemCount = (DWORD) SendMessage( hWndListBox, LB_GETCOUNT, 0 , 0 );
dwMemSize = dwItemCount * (DWORD) MaxStrLen;
//-- limit the size copied to the clipboard
if( dwMemSize > 0xFFFFF )
dwMemSize = 0xFFFFF;
if( !(hDataBuffer = GlobalAlloc( GMEM_DDESHARE, dwMemSize ) ) ) {
OutOfMemoryMessageBox( GetFocus() );
return( FALSE );
}
if( !(lpDataBuffer = (LPTSTR) GlobalLock( hDataBuffer ) ) ) {
GlobalFree( hDataBuffer );
OutOfMemoryMessageBox( GetFocus() );
return( FALSE );
}
*lpDataBuffer = '\0';
for( Count = 0; Count < dwItemCount; Count++ ) {
StrLen = SendMessage( hWndListBox, LB_GETTEXTLEN, Count, 0L );
if( StrLen > (sizeof(TempBuffer)-3) )
continue;
StrLen = SendMessage( hWndListBox, LB_GETTEXT, Count, (LPARAM) TempBuffer );
TempBuffer[StrLen] = '\r';
TempBuffer[StrLen+1] = '\n';
TempBuffer[StrLen+2] = '\0';
lstrcat( lpDataBuffer, TempBuffer );
}
GlobalUnlock( hDataBuffer );
if( !OpenClipboard( hWndListBox ) ) {
Sleep( 250 ); // wait a quarter second and try again.
if( !OpenClipboard( hWndListBox ) ) {
MessageBox( GetFocus(),
TEXT( "Could not open the Clipboard!" ),
TEXT( "Cannot Open Clipboard" ),
MB_ICONSTOP | MB_APPLMODAL );
GlobalFree( hDataBuffer );
return( FALSE );
}
}
if( !EmptyClipboard() ) {
MessageBox( GetFocus(),
TEXT( "Could not empty the Clipboard!" ),
TEXT( "Cannot Empty Clipboard" ),
MB_ICONSTOP | MB_APPLMODAL );
GlobalFree( hDataBuffer );
return( FALSE );
}
if( !SetClipboardData( CF_TEXT, hDataBuffer ) ) {
MessageBox( GetFocus(),
TEXT( "Could not copy data to the Clipboard!" ),
TEXT( "Cannot Set Clipboard Data" ),
MB_ICONSTOP | MB_APPLMODAL );
GlobalFree( hDataBuffer );
return( FALSE );
}
CloseClipboard();
return( TRUE );
}
// ************************************************************************
// FUNCTION : ListBoxInsert( HWND, LPLONG, LPCTSTR )
// PURPOSE : Inserts the string into the listbox.
// COMMENTS : Returns the index of the string inserted
// ************************************************************************
LONG
ListBoxInsert( HWND hWndListBox, LPLONG lpMaxStrLen, LPCTSTR lpszString )
{
static LONG MaxTextExtent = 0;
LONG Index;
if( lpszString == NULL ) {
MaxTextExtent = 0;
SendMessage( hWndListBox, LB_SETHORIZONTALEXTENT, 0, 0 );
return( 0 );
}
if( hWndListBox != NULL ) {
HDC hDC;
SIZE Size;
LONG StrLen;
if( (StrLen = lstrlen( lpszString)) > *lpMaxStrLen )
*lpMaxStrLen = StrLen;
hDC = GetDC( hWndListBox );
GetTextExtentPoint( hDC, lpszString, StrLen, &Size );
ReleaseDC( hWndListBox, hDC );
if( Size.cx > MaxTextExtent ) {
MaxTextExtent = Size.cx;
SendMessage( hWndListBox, LB_SETHORIZONTALEXTENT, (WPARAM) (MaxTextExtent*1.1), 0 );
}
Index = SendMessage( hWndListBox, LB_ADDSTRING, 0, (LPARAM) lpszString );
SendMessage( hWndListBox, LB_SETCURSEL, Index, 0 );
}
return( Index );
}
// ************************************************************************
// FUNCTION : ListBoxPrintF( HWND, LPCTSTR, ... )
// PURPOSE : Inserts the string format into the listbox.
// COMMENTS : Returns the index of the last string inserted
// ************************************************************************
LONG
ListBoxPrintF( HWND hWndListBox, LPCTSTR szFormat, ... )
{
static TCHAR szBuffer[ 1024 ];
va_list valist;
LONG Index;
LPTSTR lpCurrentString, lpCurrentChar;
va_start( valist, szFormat );
wvsprintf( szBuffer, szFormat, valist );
va_end( valist );
//-- insert strings line-by-line
for( lpCurrentString = lpCurrentChar = szBuffer; *lpCurrentChar != '\0'; ) {
if( *lpCurrentChar == '\n' ) {
LPTSTR lpNextChar = CharNext( lpCurrentChar );
*lpCurrentChar = '\0';
Index = ListBoxInsert( hWndListBox, &(Global.MaxStrLen), lpCurrentString );
lpCurrentString = lpCurrentChar = lpNextChar;
}
else
lpCurrentChar = CharNext( lpCurrentChar );
}
Index = ListBoxInsert( hWndListBox, &(Global.MaxStrLen), lpCurrentString );
return( Index );
}
// ************************************************************************
// FUNCTION : StringPrintF( LPTSTR, LPCTSTR, ... )
// PURPOSE : Formats a string buffer according to the format-control
// string. This function is wsprintf but the return
// values is a pointer to the string instead of the count.
// COMMENTS :
// ************************************************************************
LPTSTR
StringPrintF( LPTSTR lpString, LPCTSTR szFormat, ... )
{
va_list valist;
va_start( valist, szFormat );
wvsprintf( lpString, szFormat, valist );
va_end( valist );
return( lpString );
}
// ************************************************************************
// FUNCTION : StringAppendF( LPTSTR, LPCTSTR, ... )
// PURPOSE : Append a variable number of characters and values to the end
// of an existing string buffer according to the format string
// (which uses standard printf() formating notation).
// COMMENTS :
// ************************************************************************
BOOL
StringAppendF( LPTSTR lpszBuffer, LPCTSTR szFormat, ... )
{
static TCHAR szLgBuffer[1024];
va_list valist;
int n;
//-- add event specific information
va_start( valist, szFormat );
n = wvsprintf( szLgBuffer, szFormat, valist );
va_end( valist );
//-- append information to the string buffer
lstrcat( lpszBuffer, szLgBuffer );
return( TRUE );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -