在控制台(console)打印彩色字

    技术2022-05-11  86

           你是不是觉得你写的控制台程序的字太单调了,你是不是有时候需提醒用户注意你的某行输出。呵呵感觉这两句像广告,好了言归正传,这两天写了一个可以打印红绿蓝三种颜色的printf函数并做成了动态连接库。代码说明一切。

    head file code :

    #ifndef DllDemo_EXPORTS

    #define DllAPI __declspec(dllexport)

    //#else                                             //这个两句将在隐式的使用dll的时候导致不能连接//#define DllAPI __declspec(dllimport)

    extern "C"    //原样编译

    {

    DllAPI int __stdcall ErrPrintf(TCHAR *format, ...) ; //__stdcall使非C/C++语言内能够调用APIDllAPI int __stdcall GreenPrintf(TCHAR *format, ...) ;DllAPI int __stdcall BluePrintf(TCHAR *format, ...) ;DllAPI int __stdcall RedPrintf(TCHAR *format, ...);

    }

    #endif

     

    CPP file code:

    // PrintfColorDll.cpp : Defines the entry point for the DLL application.//

    #include "stdafx.h"#include "PrintfColorDll.h"#include "stdafx.h"#include "stdio.h"#include "tchar.h"

    BOOL APIENTRY DllMain( HANDLE hModule,                        DWORD  ul_reason_for_call,                        LPVOID lpReserved      ){    return TRUE;}

    //错误DllAPI int __stdcall ErrPrintf(TCHAR *format, ...) {    HANDLE hStdout = NULL ;    TCHAR szBuffer[1024] ;    va_list arg_list ;    int nBuf = 0 ;

        va_start(arg_list,format);    nBuf = _vsntprintf(szBuffer,1024,format,arg_list) ;    va_end(arg_list) ;

        //get console ouput handle    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);        if(!hStdout)  {        return 0;    }

        //set red colour    if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY))  {        return 0;    }

        //print     nBuf = _tprintf(_T("%s"),szBuffer) ;

        //restore to white.    if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN)) {        return 0;    }

        return nBuf ;}

    //红色DllAPI int __stdcall RedPrintf(TCHAR *format, ...) {    HANDLE hStdout = NULL ;    TCHAR szBuffer[1024] ;    va_list arg_list ;    int nBuf = 0 ;    va_start(arg_list,format);    nBuf = _vsntprintf(szBuffer,1024,format,arg_list) ;    va_end(arg_list) ;    //get console ouput handle    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);        if(!hStdout) {        return 0;    }    //set red colour    if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED |         FOREGROUND_INTENSITY)) {        return 0;    }    //print     nBuf = _tprintf(_T("%s"),szBuffer) ;    //restore to white.    if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED |        FOREGROUND_BLUE |         FOREGROUND_GREEN)) {        return 0;    }    return nBuf ;}

    //绿色DllAPI int __stdcall GreenPrintf(TCHAR *format, ...) {    HANDLE hStdout = NULL ;    TCHAR szBuffer[1024] ;    va_list arg_list ;    int nBuf = 0 ;    va_start(arg_list,format);    nBuf = _vsntprintf(szBuffer,1024,format,arg_list) ;    va_end(arg_list) ;    //get console ouput handle    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);        if(!hStdout) {        return 0;    }    //set Green colour    if (! SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN |         FOREGROUND_INTENSITY)) {        return 0;    }    //print     nBuf = _tprintf(_T("%s"),szBuffer) ;    //restore to white.    if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED |        FOREGROUND_BLUE |         FOREGROUND_GREEN)) {        return 0;    }    return nBuf ;}

    //蓝色DllAPI int __stdcall BluePrintf(TCHAR *format, ...) {    HANDLE hStdout = NULL ;    TCHAR szBuffer[1024] ;    va_list arg_list ;    int nBuf = 0 ;    va_start(arg_list,format);    nBuf = _vsntprintf(szBuffer,1024,format,arg_list) ;    va_end(arg_list) ;    //get console ouput handle    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);        if(!hStdout) {        return 0;    }    //set Blue colour    if (! SetConsoleTextAttribute(hStdout, FOREGROUND_BLUE |         FOREGROUND_INTENSITY)) {        return 0;    }    //print     nBuf = _tprintf(_T("%s"),szBuffer) ;    //restore to white.    if (! SetConsoleTextAttribute(hStdout, FOREGROUND_RED |        FOREGROUND_BLUE |         FOREGROUND_GREEN)) {        return 0;    }    return nBuf ;}

    example  code:

    #include "stdio.h"#include <tchar.h>

    #pragma comment(lib,"PrintfColorDll.lib")   //在编辑器link时,链接到.lib文件

    extern "C" {  __declspec(dllimport) int __stdcall ErrPrintf(TCHAR *format,...);  __declspec(dllimport) int RedPrintf(TCHAR *format,...);  __declspec(dllimport) int GreenPrintf(TCHAR *format,...);  __declspec(dllimport) int BluePrintf(TCHAR *format,...);}

    //#include "iostream"//using namespace std; 

    int main(){  int inta=1;  float floata=5.0f;  char chara='a';    ErrPrintf("this is error test!/n");  GreenPrintf("this is a green test!/n");  BluePrintf("this is a blue test!/n");  RedPrintf("this is a red test!/n");  //GreenPrintf("%d, %f, %c",inta,floata,chara);  GreenPrintf("%d/t%c/n",inta,chara); // GreenPrintf("%f",floata);       //function can not work when printing float type?  printf("%f",floata);  //_tprintf("%f",1.0);  getchar();  return 0;}    做成动态连接库后不能打印浮点型数据了不知道why,哪位大侠知道留个言不胜感激!

    编译环境:WinXP sp2         VC++6.0 sp6


    最新回复(0)