Win32 Application (VC\MFC) 控制台mini调试工具 mDebug 0.1

67 篇文章 0 订阅

看了一下非常方便,收藏.

用VC写WIN32程序,没有控制台输出查看参数确实很不方便,这个功能提供了创建windows窗口的同时,又调出DOS界面,方便调试参数.



http://www.cnblogs.com/mr-wid/archive/2013/04/10/3012365.html



//  就一个头文件 mdebug.h

HWND hConsole = (HWND)GetStdHandle( STD_OUTPUT_HANDLE ); // 这里需要做个强制转换...

//mdebug.h
#pragma once

//

#include <windows.h>
#include <conio.h>
#include <stdio.h>

//

void debugInit();		//初始化调试库
void debugFree();		//关闭调试

//输出类函数
void mPuts( char *szFormat, ... );		//基础数据类型格式化输出
void mPutsEx( char *szFormat, ... );	//增强型数据类型格式化输出

//检测类函数
BOOL matchString( const char *szSrc, char **szDest );		//串匹配


//

int printPOINT( POINT );				//输出一个点的坐标信息, 输出格式 (x, y)
int printRECT( RECT );					//输出一个矩形的坐标信息, 输出格式 (left=left, top=top, right=right, bottom=bottom)
int printSIZE( SIZE );					//输出一个尺寸的坐标信息, 输出格式 [cx=cx, cy=cy]
int printRGBQUAD( RGBQUAD );			//输出一组 RGB 值, 输出格式, (r=r, g=g, b=b)

//

void debugInit()
{
	AllocConsole();
}

void debugFree()
{
	FreeConsole();
}

//

//基础数据类型格式化输出
void mPuts( char *szFormat, ... )
{
	char szBuffer[10*1024] = {0};

	va_list pArgList;
	va_start( pArgList, szFormat );
	_vsnprintf( szBuffer, sizeof(szBuffer)/sizeof(char), szFormat, pArgList );
	va_end(pArgList);

	_cputs( szBuffer );
}

//增强数据类型输出
void mPutsEx( char *szFormat, ... )
{
	va_list pArgList;

	POINT		pt;
	RECT		rect;
	SIZE		size;
	RGBQUAD		rgb;

	HWND hConsole = GetStdHandle( STD_OUTPUT_HANDLE );
	SetConsoleTextAttribute( hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );

	va_start( pArgList, szFormat );
	
	while( *szFormat )
	{
		switch( *szFormat )
		{
		case '%':
			{
				szFormat++;
				//

				//增强型数据类型输出
				if( matchString( "pt", &szFormat ) )			// %pt == POINT Structure
				{
					pt = va_arg( pArgList, POINT );
					printPOINT( pt );
				}
				
				//

				if( matchString( "rect", &szFormat ) )			// %rect == RECT Structure
				{
					rect = va_arg( pArgList, RECT );
					printRECT( rect );
				}
				
				//

				if( matchString( "size", &szFormat ) )			// %size == SIZE Structure
				{
					size = va_arg( pArgList, SIZE );
					printSIZE( size );
				}

				//

				if( matchString( "rgb", &szFormat ) )			// %rgb == RGBQUAD Structure
				{
					rgb = va_arg( pArgList, RGBQUAD );
					printRGBQUAD( rgb );
				}

				//
				if( matchString( "endfr", &szFormat ) )			// %endfr == 结束前景颜色格式化输出
					SetConsoleTextAttribute( hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
				
				if( matchString( "endbk", &szFormat ) )			// %endbk == 结束背景颜色格式化输出
				{
					SetConsoleTextAttribute( hConsole, 0 );
					SetConsoleTextAttribute( hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
				}
				//--------------------色彩格式化输出---------------------
				//前景颜色
				if( matchString( "frred", &szFormat ) )			// %frred == 前景颜色, 红色
					SetConsoleTextAttribute( hConsole, FOREGROUND_RED );

				if( matchString( "frgreen", &szFormat ) )		// %frgreen == 前景颜色, 绿色
					SetConsoleTextAttribute( hConsole, FOREGROUND_GREEN );

				if( matchString( "frblue", &szFormat ) )		// %frblue == 前景颜色, 蓝色
					SetConsoleTextAttribute( hConsole, FOREGROUND_BLUE );

				if( matchString( "fryellow", &szFormat ) )		// %fryellow == 前景颜色, 黄色
					SetConsoleTextAttribute( hConsole, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY );

				if( matchString( "frcyan", &szFormat ) )		// %frfrcyan == 前景颜色, 青色
					SetConsoleTextAttribute( hConsole, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
				
				if( matchString( "frmag", &szFormat ) )			// %frmag == 前景颜色, 品红
					SetConsoleTextAttribute( hConsole, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY );

				//背景颜色
				if( matchString( "bkred", &szFormat ) )			// %bkred == 背景颜色, 红色
					SetConsoleTextAttribute( hConsole, BACKGROUND_RED );

				if( matchString( "bkgreen", &szFormat ) )		// %bkgreen == 背景颜色, 绿色
					SetConsoleTextAttribute( hConsole, BACKGROUND_GREEN );

				if( matchString( "bkblue", &szFormat ) )		// %bkblue == 背景颜色, 蓝色
					SetConsoleTextAttribute( hConsole, BACKGROUND_BLUE );

				if( matchString( "bkyellow", &szFormat ) )		// %bkyellow == 背景颜色, 黄色
					SetConsoleTextAttribute( hConsole, BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY );

				if( matchString( "bkcyan", &szFormat ) )		// %bkfrcyan == 背景颜色, 青色
					SetConsoleTextAttribute( hConsole, BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY );
				
				if( matchString( "bkmag", &szFormat ) )			// %bkmag == 背景颜色, 品红
					SetConsoleTextAttribute( hConsole, BACKGROUND_RED | BACKGROUND_BLUE | BACKGROUND_INTENSITY );
			}
			break;

		case '\n':					//换行 并结束当前前\背景色输出
			SetConsoleTextAttribute( hConsole, 0 );
			SetConsoleTextAttribute( hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY );
			_cputs( "\n" );
			szFormat++;
			break;

		case '\a':					//发出 beep 音
			MessageBeep(0);
			szFormat++;
			break;

		default:
			_cprintf( "%c", (char)*szFormat++ );
		}
	}
	va_end( pArgList );
}

//串匹配
BOOL matchString( const char *szSrc, char **szDest )
{
	char *szTmp = *szDest;

	while( *szSrc )
	{
		if( *szSrc != **szDest  )
		{
			*szDest = szTmp;
			return FALSE;
		}	

		szSrc++;
		(*szDest)++;
	}

	return TRUE;
}

//

//输出点
int printPOINT( POINT pt )
{
	_cprintf( "(x=%d, y=%d)", pt.x, pt.y );		//输出格式

	return 0;
}

//输出矩形
int printRECT( RECT rect )
{
	_cprintf( "(left=%d, top=%d, right=%d, bottom=%d)", rect.left, rect.top, rect.right, rect.bottom );

	return 0;
}

//输出尺寸
int printSIZE( SIZE size )
{
	_cprintf( "[cx=%d, cy=%d]", size.cx, size.cy );

	return 0;
}

//输出一组RGB值
int printRGBQUAD( RGBQUAD rgb )
{
	_cprintf( "(blue=%d, green=%d, red=%d, reserved=%d)", rgb.rgbBlue, rgb.rgbGreen, rgb.rgbRed, rgb.rgbReserved );

	return 0;
}

//

//

示范:

#include <windows.h>
#include "mdebug.h"

//

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );

//

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdline, int iCmdShow )
{
	TCHAR szAppName[] = TEXT("mDebug");

	HWND		hwnd;
	MSG			msg;
	WNDCLASS	wndclass;

	wndclass.cbClsExtra			= 0;
	wndclass.cbWndExtra			= 0;
	wndclass.hbrBackground		= GetSysColorBrush( COLOR_3DFACE );
	wndclass.hCursor			= LoadCursor( NULL, IDC_ARROW );
	wndclass.hIcon				= LoadIcon( NULL, IDI_APPLICATION );
	wndclass.hInstance			= hInstance;
	wndclass.lpfnWndProc		= WndProc;
	wndclass.lpszClassName		= szAppName;
	wndclass.lpszMenuName		= NULL;
	wndclass.style				= CS_HREDRAW | CS_VREDRAW;

	if( !RegisterClass(&wndclass) )
	{
		MessageBox( NULL, TEXT("窗口类注册失败!"), TEXT("应用程序错误"), MB_OK | MB_ICONERROR );
		return 0;
	}

	hwnd = CreateWindow(
		szAppName,
		TEXT("mDebug - Win32 Application 调试工具 - Demo"),
		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
		600, 400,
		NULL, NULL, hInstance, NULL
	);

	ShowWindow( hwnd, iCmdShow );
	UpdateWindow( hwnd );

	while( GetMessage(&msg, NULL, 0, 0) )
	{
		TranslateMessage( &msg );
		DispatchMessage( &msg );
	}

	return msg.wParam;
}

//

LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
	RECT rect = {0};
	POINT pt = {0};
	RGBQUAD rgb = {0};

	rgb.rgbBlue = 100;
	rgb.rgbGreen = 125;
	rgb.rgbRed = 213;

	switch( message )
	{
	case WM_CREATE:			//在处理创建消息时对 mDebug 进行初始化
		debugInit();		//初始化 mDebug
		return 0;

	case WM_LBUTTONDOWN:
		rect.left = 10;		rect.top = 20;
		rect.right = 30;	rect.bottom = 40;

		pt.x = 100;		pt.y = 200;

		mPuts( "mDebug提供的普通格式化输出:\n" );				//使用普通格式化输出函数 mPuts
		mPuts( "x = %d, f = %f, c = %c\n\n", 3+5, 1.79, 'w' );

		mPutsEx( "mDebug提供的增强型格式化输出:\n" );			//使用增强型格式化输出函数 mPutEx
		mPutsEx( "RECT结构: %rect\n", rect );
		mPutsEx( "%bkgreen颜色增强:%endbk %fryellow%rect\n", rect );
		mPutsEx( "%frmagRGBQUAD结构:%endbk %bkred%rgb\n", rgb );
		
		return 0;

	case WM_DESTROY:
		debugFree();			//关闭调试窗口
		PostQuitMessage(0);
		return 0;
	}

	return DefWindowProc( hwnd, message, wParam, lParam );
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值