pcc32源文件
pcc32.c
/********************************************************
* Author: RedOC *
* Email: RedOC@foxmail.com *
* Notes: Some functions about Win32 Console Control. *
* License: Copyleft. Enjoy it Just for fun. *
* Date: 2008-12-17 00:28:39 *
********************************************************/
#include "pcc32.h"
void delayMS(uint32 d)
{
Sleep(d);
return ;
}
void clearText(void)
{
system("cls");
return ;
}
int setTextColor(uint8 fColor)
{
HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(hd, &csbInfo);
return SetConsoleTextAttribute(hd, fColor | (csbInfo.wAttributes&~0x0F));
}
PCCOLOR getTextColor(void)
{
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
return (PCCOLOR)(csbInfo.wAttributes&0x0F);
}
int setBackColor(uint8 bColor)
{
HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(hd, &csbInfo);
return SetConsoleTextAttribute(hd, (bColor << 4) | (csbInfo.wAttributes&~0xF0));
}
PCCOLOR getBackColor(void)
{
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
return (PCCOLOR)((csbInfo.wAttributes&0xF0) >> 4);
}
int setColors(uint8 fColor, uint8 bColor)
{
HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(hd, &csbInfo);
return SetConsoleTextAttribute(hd, fColor | (bColor << 4) | (csbInfo.wAttributes&~0xFF));
}
int setSwapColors(int b)
{
HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(hd, &csbInfo);
if (!!b)
return SetConsoleTextAttribute(hd, csbInfo.wAttributes | 0x4000);
else
return SetConsoleTextAttribute(hd, csbInfo.wAttributes & ~0x4000);
}
int setUnderLine(int b)
{
HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(hd, &csbInfo);
if (!!b)
return SetConsoleTextAttribute(hd, csbInfo.wAttributes | 0x8000);
else
return SetConsoleTextAttribute(hd, csbInfo.wAttributes & ~0x8000);
}
uint8 getLineWidth(void)
{
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
return csbInfo.dwSize.X;
}
uint8 getLineNum(void)
{
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
return csbInfo.dwSize.Y;
}
uint8 getCursorX(void)
{
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
return csbInfo.dwCursorPosition.X;
}
uint8 getCursorY(void)
{
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbInfo);
return csbInfo.dwCursorPosition.Y;
}
int gotoTextPos(uint8 x, uint8 y)
{
COORD cd;
cd.X = x;
cd.Y = y;
return SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cd);
}
int setCursorVisible(int b)
{
HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO ccInfo;
GetConsoleCursorInfo(hd, &ccInfo);
ccInfo.bVisible = !!b;
return SetConsoleCursorInfo(hd, &ccInfo);
}
int setCursorSize(uint8 s)
{
HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO ccInfo;
GetConsoleCursorInfo(hd, &ccInfo);
ccInfo.dwSize = s;
return SetConsoleCursorInfo(hd, &ccInfo);
}
int getConsoleTitle(char *title, uint8 len)
{
return GetConsoleTitle(title, len);
}
int setConsoleTitle(char *title)
{
return SetConsoleTitle(title);
}
int fixConsoleSize(uint16 width, uint16 height)
{
int ret = 0;
int fixX = 0, fixY = 0;
COORD cd;
SMALL_RECT srctWindow;
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
HANDLE hWin = GetStdHandle(STD_OUTPUT_HANDLE);
if (!hWin)
return 0;
// 调整最小范围
fixX = (width < MIN_CONSOLE_WIDTH) ? MIN_CONSOLE_WIDTH : width;
fixY = (height < MIN_CONSOLE_HEIGHT) ? MIN_CONSOLE_HEIGHT : height;
// 先将BUF尺寸扩大到最大
cd.X = 512;
cd.Y = 512;
ret = SetConsoleScreenBufferSize(hWin, cd);
if (!ret)
return ret;
//puts("Set Max Buf Error.");
// 测试屏幕允许的最大尺寸
GetConsoleScreenBufferInfo(hWin, &csbiInfo);
cd = csbiInfo.dwMaximumWindowSize;
//printf("Max Win Size[%d, %d].\n", cd.X, cd.Y);
fixX = (fixX > cd.X) ? cd.X : fixX;
fixY = (fixY > cd.Y) ? cd.Y : fixY;
//printf("Fix Win Size[%d, %d].\n", fixX, fixY);
// 确定适当的窗口尺寸
srctWindow.Left = 0;
srctWindow.Right = fixX - 1;
srctWindow.Top = 0;
srctWindow.Bottom = fixY - 1;
ret = SetConsoleWindowInfo(hWin, 1, &srctWindow);
if (!ret)
return ret;
//puts("Set Size Error.");
// 确定适当的BUF尺寸
cd.X = fixX;
cd.Y = fixY;
ret = SetConsoleScreenBufferSize(hWin, cd);
if (!ret)
return ret;
//printf("Fix Win Size[%d, %d]: %d.\n", fixX, fixY, ret);
Sleep(100);
return ret;
}
int showConsoleInfo()
{
int ret;
HANDLE hWin = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
ret = GetConsoleScreenBufferInfo(hWin, &csbiInfo);
if (ret)
{
printf("Buffer Size: [X]%d - [Y]%d\n", csbiInfo.dwSize.X, csbiInfo.dwSize.Y);
printf("Cursor Pos : [X]%d - [Y]%d\n", csbiInfo.dwCursorPosition.X, csbiInfo.dwCursorPosition.Y);
printf("Attributes : %d\n", csbiInfo.wAttributes);
printf("Current Win: [L]%d - [R]%d - [T]%d - [B]%d\n", \
csbiInfo.srWindow.Left, csbiInfo.srWindow.Right, csbiInfo.srWindow.Top, csbiInfo.srWindow.Bottom);
printf("Maximum Win: [X]%d - [Y]%d\n", csbiInfo.dwMaximumWindowSize.X, csbiInfo.dwMaximumWindowSize.Y);
puts("Over.");
}
return ret;
}
int simpleRing(uint16 freq, uint16 len)
{
return Beep(freq, len);
}
uint16 jkGetKey(void)
{
uint16 rk = 0;
uint8 k = getch();
if (k == JK_FUNC_KEY)
{
k = getch();
rk = 0xFF00 | k;
return rk;
}
if (k == JK_CTRL_KEY)
{
k = getch();
rk = 0xE000 | k;
return rk;
}
rk = 0x0000 | k;
return rk;
}
int jkHasKey(void)
{
return (kbhit());
}
//End of pcc32.c
pcc32.h
/********************************************************
* Author: RedOC *
* Email: RedOC@foxmail.com *
* Notes: Some functions about Win32 Console Control. *
* License: Copyleft. Enjoy it Just for fun. *
* Date: 2008-12-17 00:28:39 *
********************************************************/
#ifndef PCC32_H_INCLUDED
#define PCC32_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#ifndef REDOC_COMMEN_TYPE
#define REDOC_COMMEN_TYPE
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;
#endif // REDOC_COMMEN_TYPE
/* 按键定义 */
#define JK_FUNC_KEY 0x00
#define JK_CTRL_KEY 0xE0
#define JK_ESC 0x001B
#define JK_ENTER 0x000D
#define JK_SPACE 0x0020
#define JK_BKSPACE 0x0008
#define JK_TAB 0x0009
#define JK_CTRL_Z 0x001A
#define JK_CTRL_X 0x0018
#define JK_CTRL_C 0x0003
#define JK_CTRL_A 0x0001
#define JK_CTRL_S 0x0013
#define JK_CTRL_D 0x0004
#define JK_LEFT 0xE04B
#define JK_RIGHT 0xE04D
#define JK_UP 0xE048
#define JK_DOWN 0xE050
#define JK_INSERT 0xE052
#define JK_HOME 0xE047
#define JK_PGUP 0xE049
#define JK_DELETE 0xE053
#define JK_END 0xE04F
#define JK_PGDW 0xE051
#define JK_F1 0xFF3B
#define JK_F2 0xFF3C
#define JK_F3 0xFF3D
#define JK_F4 0xFF3E
#define JK_F5 0xFF3F
#define JK_F6 0xFF40
#define JK_F7 0xFF41
#define JK_F8 0xFF42
#define JK_F9 0xFF43
#define JK_F10 0xFF44
#define JK_F11 0xE085
#define JK_F12 0xE086
/* 控制台尺寸定义 */
#define MIN_CONSOLE_WIDTH 14
#define MIN_CONSOLE_HEIGHT 1
/* 颜色定义 */
typedef enum _PCCOLOR
{
BLACK = 0, // 黑色
BLUE = 1, // 蓝色
GREEN = 2, // 绿色
CYAN = 3, // 青色
RED = 4, // 红色
MAGENTA = 5, // 紫色
BROWN = 6, // 褐色
LIGHT_GRAY = 7, // 浅灰
DARK_GRAY = 8, // 深灰
LIGHT_BLUE = 9, // 亮蓝
LIGHT_GREEN = 10, // 亮绿
LIGHT_CYAN = 11, // 浅蓝
LIGHT_RED = 12, // 亮红
LIGHT_MAGENTA = 13, // 亮紫
YELLOW = 14, // 黄色
WHITE = 15 // 白色
}PCCOLOR;
#ifdef __cplusplus
extern "C"
{
#endif
/* 延时,以毫秒计 */
void delayMS(uint32 d);
/* 清除文字 */
void clearText(void);
/* 暂停,等待用户按键 */
void pauseHere(void);
/* 发出简单的响铃声(阻塞,慎用) */
int simpleRing(uint16 freq, uint16 len);
/* 设置文本颜色,0~15 */
int setTextColor(uint8 fColor);
/* 获取文本颜色,0~15 */
PCCOLOR getTextColor(void);
/* 设置文本背景颜色,0~15 */
int setBackColor(uint8 bColor);
/* 获取文本背景颜色,0~15 */
PCCOLOR getBackColor(void);
/* 设置文本及其背景颜色,0~15 */
int setColors(uint8 fColor, uint8 bColor);
/* 设置/取消前/背景颜色的交换解析 */
int setSwapColors(int b);
/* 设定/取消文字的下划线 */
int setUnderLine(int b);
/* 获取控制台文本行的最大长度[默认为80] */
uint8 getLineWidth(void);
/* 获取控制台文本行的最大行数 */
uint8 getLineNum(void);
/* 获取光标的横坐标[列数] */
uint8 getCursorX(void);
/* 获取光标的纵坐标[行数] */
uint8 getCursorY(void);
/* 屏幕光标定位,x为列(横),y为行(纵) */
int gotoTextPos(uint8 x, uint8 y);
/* 设置光标的可见性 */
int setCursorVisible(int b);
/* 设置光标的(厚度)尺寸,1-100 */
int setCursorSize(uint8 s);
/* 获取控制台的标题字符串 */
int getConsoleTitle(char *title, uint8 len);
/* 设置控制台的标题字符串 */
int setConsoleTitle(char *title);
/* 设置一个没有滚动条的控制台窗口尺寸 */
int fixConsoleSize(uint16 width, uint16 height);
/* 输出控制台的相关信息(仅作调试用) */
int showConsoleInfo();
/* 获取控制台的键输入 */
uint16 jkGetKey(void);
/* 判断控制台是否有键按下 */
int jkHasKey(void);
#ifdef __cplusplus
}
#endif
#endif // PCC32_H_INCLUDED
Keep it simple!

浙公网安备 33010602011771号