/*
GRAPHICS DEMO FOR TURBO C 2.0
Copyright (c) 1987,88 Borland International. All rights reserved.
From the command line, use:
tcc bgidemo graphics.lib
*/
#ifdef __TINY__
#error BGIDEMO will not run in the tiny model.
#endif
#include <dos.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <graphics.h>
#define ESC 0x1b /* Define the escape key */
#define TRUE 1 /* Define some handy constants */
#define FALSE 0 /* Define some handy constants */
#define PI 3.14159 /* Define a value for PI */
#define ON 1 /* Define some handy constants */
#define OFF 0 /* Define some handy constants */
char *Fonts[] = {
"DefaultFont", "TriplexFont", "SmallFont",
"SansSerifFont", "GothicFont"
}
char *LineStyles[] = {
"SolidLn", "DottedLn", "CenterLn", "DashedLn", "UserBitLn"
}
char *FillStyles[] = {
"EmptyFill", "SolidFill", "LineFill", "LtSlashFill",
"SlashFill", "BkSlashFill", "LtBkSlashFill", "HatchFill",
"XHatchFill", "InterleaveFill", "WideDotFill", "CloseDotFill"
}
char *TextDirect[] = {
"HorizDir", "VertDir"
}
char *HorizJust[] = {
"LeftText", "CenterText", "RightText"
}
char *VertJust[] = {
"BottomText", "CenterText", "TopText"
}
struct PTS {
int x, y
}/* Structure to hold vertex points */
int GraphDriver/* The Graphics device driver */
int GraphMode/* The Graphics mode value */
double AspectRatio/* Aspect ratio of a pixel on the screen*/
int MaxX, MaxY/* The maximum resolution of the screen */
int MaxColors/* The maximum # of colors available */
int ErrorCode/* Reports any graphics errors */
struct palettetype palette/* Used to read palette info */
/* */
/* Function prototypes */
/* */
void Initialize(void)
void ReportStatus(void)
void TextDump(void)
void Bar3DDemo(void)
void RandomBars(void)
void TextDemo(void)
void ColorDemo(void)
void ArcDemo(void)
void CircleDemo(void)
void PieDemo(void)
void BarDemo(void)
void LineRelDemo(void)
void PutPixelDemo(void)
void PutImageDemo(void)
void LineToDemo(void)
void LineStyleDemo(void)
void CRTModeDemo(void)
void UserLineStyleDemo(void)
void FillStyleDemo(void)
void FillPatternDemo(void)
void PaletteDemo(void)
void PolyDemo(void)
void SayGoodbye(void)
void Pause(void)
void MainWindow(char *header)
void StatusLine(char *msg)
void DrawBorder(void)
void changetextstyle(int font, int direction, int charsize)
int gprintf(int *xloc, int *yloc, char *fmt, ... )
/* */
/* Begin main function */
/* */
int main()
{
Initialize()/* Set system into Graphics mode */
ReportStatus()/* Report results of the initialization */
ColorDemo()/* Begin actual demonstration */
if( GraphDriver==EGA || GraphDriver==EGALO || GraphDriver==VGA )
PaletteDemo()
PutPixelDemo()
PutImageDemo()
Bar3DDemo()
BarDemo()
RandomBars()
ArcDemo()
CircleDemo()
PieDemo()
LineRelDemo()
LineToDemo()
LineStyleDemo()
UserLineStyleDemo()
TextDump()
TextDemo()
CRTModeDemo()
FillStyleDemo()
FillPatternDemo()
PolyDemo()
SayGoodbye()/* Give user the closing screen */
closegraph()/* Return the system to text mode */
return(0)
}
/* */
/* INITIALIZE: Initializes the graphics system and reports */
/* any errors which occured. */
/* */
void Initialize(void)
{
int xasp, yasp/* Used to read the aspect ratio*/
GraphDriver = DETECT/* Request auto-detection */
initgraph( &GraphDriver, &GraphMode, "" )
ErrorCode = graphresult()/* Read result of initialization*/
if( ErrorCode != grOk ){ /* Error occured during init */
printf(" Graphics System Error: %s\n", grapherrormsg( ErrorCode ) )
exit( 1 )
}
getpalette( &palette )/* Read the palette from board */
MaxColors = getmaxcolor() + 1/* Read maximum number of colors*/
MaxX = getmaxx()
MaxY = getmaxy()/* Read size of screen */
getaspectratio( &xasp, &yasp )/* read the hardware aspect */
AspectRatio = (double)xasp / (double)yasp/* Get correction factor */
}
/* */
/* REPORTSTATUS: Report the current configuration of the system */
/* after the auto-detect initialization. */
/* */
void ReportStatus(void)
{
struct viewporttype viewinfo/* Params for inquiry procedures*/
struct linesettingstype lineinfo
struct fillsettingstype fillinfo
struct textsettingstype textinfo
struct palettetype palette
char *driver, *mode/* Strings for driver and mode */
int x, y
getviewsettings( &viewinfo )
getlinesettings( &lineinfo )
getfillsettings( &fillinfo )
gettextsettings( &textinfo )
getpalette( &palette )
x = 10
y = 4
MainWindow( "Status report after InitGraph" )
settextjustify( LEFT_TEXT, TOP_TEXT )
driver = getdrivername()
mode = getmodename(GraphMode)/* get current setting */
gprintf( &x, &y, "Graphics device : %-20s (%d)", driver, GraphDriver )
gprintf( &x, &y, "Graphics mode : %-20s (%d)", mode, GraphMode )
gprintf( &x, &y, "Screen resolution : ( 0, 0, %d, %d )", getmaxx(), getmaxy() )
gprintf( &x, &y, "Current view port : ( %d, %d, %d, %d )",
viewinfo.left, viewinfo.top, viewinfo.right, viewinfo.bottom )
gprintf( &x, &y, "Clipping : %s", viewinfo.clip ? "ON" : "OFF" )
gprintf( &x, &y, "Current position : ( %d, %d )", getx(), gety() )
gprintf( &x, &y, "Colors available : %d", MaxColors )
gprintf( &x, &y, "Current color : %d", getcolor() )
gprintf( &x, &y, "Line style : %s", LineStyles[ lineinfo.linestyle ] )
gprintf( &x, &y, "Line thickness : %d", lineinfo.thickness )
gprintf( &x, &y, "Current fill style : %s", FillStyles[ fillinfo.pattern ] )
gprintf( &x, &y, "Current fill color : %d", fillinfo.color )
gprintf( &x, &y, "Current font : %s", Fonts[ textinfo.font ] )
gprintf( &x, &y, "Text direction : %s", TextDirect[ textinfo.direction ] )
gprintf( &x, &y, "Character size : %d", textinfo.charsize )
gprintf( &x, &y, "Horizontal justify : %s", HorizJust[ textinfo.horiz ] )
gprintf( &x, &y, "Vertical justify : %s", VertJust[ textinfo.vert ] )
Pause()/* Pause for user to read screen*/
}
/* */
/* TEXTDUMP: Display the all the characters in each of the */
/* available fonts. */
/* */
void TextDump()
{
static int CGASizes[] = {
1, 3, 7, 3, 3 }
static int NormSizes[] = {
1, 4, 7, 4, 4 }
char buffer[80]
int font, ch, wwidth, lwidth, size
struct viewporttype vp
for( font=0 font<5 ++font ){ /* For each available font */
sprintf( buffer, "%s Character Set", Fonts[font] )
MainWindow( buffer )/* Display fontname as banner */
getviewsettings( &vp )/* read current viewport */
settextjustify( LEFT_TEXT, TOP_TEXT )
moveto( 2, 3 )
buffer[1] = '\0'/* Terminate string */
wwidth = vp.right - vp.left/* Determine the window width */
lwidth = textwidth( "H" )/* Get average letter width */
if( font == DEFAULT_FONT ){
changetextstyle( font, HORIZ_DIR, 1 )
ch = 0
while( ch <256 ){ /* For each possible character */
buffer[0] = ch/* Put character into a string */
outtext( buffer )/* send string to screen */
if( (getx() + lwidth) >wwidth )
moveto( 2, gety() + textheight("H") + 3 )
++ch/* Goto the next character */
}
}
else{
size = (MaxY <200) ? CGASizes[font] : NormSizes[font]
changetextstyle( font, HORIZ_DIR, size )
ch = '!'/* Begin at 1st printable */
while( ch <127 ){ /* For each printable character */
buffer[0] = ch/* Put character into a string */
outtext( buffer )/* send string to screen */
if( (lwidth+getx()) >wwidth ) /* Are we still in window? */
moveto( 2, gety()+textheight("H")+3 )
++ch/* Goto the next character */
}
}
Pause()/* Pause until user acks */
} /* End of FONT loop */
}
/* */
/* BAR3DDEMO: Display a 3-D bar chart on the screen. */
/* */
void Bar3DDemo(void)
{
static int barheight[] = {
1, 3, 5, 4, 3, 2, 1, 5, 4, 2, 3 }
struct viewporttype vp
int xstep, ystep
int i, j, h, color, bheight
char buffer[10]
MainWindow( "Bar 3-D / Rectangle Demonstration" )
h = 3 * textheight( "H" )
getviewsettings( &vp )
settextjustify( CENTER_TEXT, TOP_TEXT )
changetextstyle( TRIPLEX_FONT, HORIZ_DIR, 4 )
outtextxy( MaxX/2, 6, "These are 3-D Bars" )
changetextstyle( DEFAULT_FONT, HORIZ_DIR, 1 )
setviewport( vp.left+50, vp.top+40, vp.right-50, vp.bottom-10, 1 )
getviewsettings( &vp )
line( h, h, h, vp.bottom-vp.top-h )
line( h, (vp.bottom-vp.top)-h, (vp.right-vp.left)-h, (vp.bottom-vp.top)-h )
xstep = ((vp.right-vp.left) - (2*h)) / 10
ystep = ((vp.bottom-vp.top) - (2*h)) / 5
j = (vp.bottom-vp.top) - h
settextjustify( CENTER_TEXT, CENTER_TEXT )
for( i=0 i<6 ++i ){
line( h/2, j, h, j )
itoa( i, buffer, 10 )
outtextxy( 0, j, buffer )
j -= ystep
}
j = h
settextjustify( CENTER_TEXT, TOP_TEXT )
for( i=0 i<11 ++i ){
color = random( MaxColors )
setfillstyle( i+1, color )
line( j, (vp.bottom-vp.top)-h, j, (vp.bottom-vp.top-3)-(h/2) )
itoa( i, buffer, 10 )
outtextxy( j, (vp.bottom-vp.top)-(h/2), buffer )
if( i != 10 ){
bheight = (vp.bottom-vp.top) - h - 1
bar3d( j, (vp.bottom-vp.top-h)-(barheight[i]*ystep), j+xstep, bheight, 15, 1 )
}
j += xstep
}
Pause()/* Pause for user's response */
}
/* */
/* RANDOMBARS: Display random bars */
/* */
void RandomBars(void)
{
int color
MainWindow( "Random Bars" )
StatusLine( "Esc aborts or press a key..." )/* Put msg at bottom of screen */
while( !kbhit() ){ /* Until user enters a key... */
color = random( MaxColors-1 )+1
setcolor( color )
setfillstyle( random(11)+1, color )
bar3d( random( getmaxx() ), random( getmaxy() ),
random( getmaxx() ), random( getmaxy() ), 0, OFF)
}
Pause()/* Pause for user's response */
}
/* */
/* TEXTDEMO: Show each font in several sizes to the user. */
/* */
void TextDemo(void)
{
int charsize[] = {
1, 3, 7, 3, 4 }
int font, size
int h, x, y, i
struct viewporttype vp
char buffer[80]
for( font=0 font<5 ++font ){ /* For each of the four fonts */
sprintf( buffer, "%s Demonstration", Fonts[font] )
MainWindow( buffer )
getviewsettings( &vp )
changetextstyle( font, VERT_DIR, charsize[font] )
settextjustify( CENTER_TEXT, BOTTOM_TEXT )
outtextxy( 2*textwidth("M"), vp.bottom - 2*textheight("M"), "Vertical" )
changetextstyle( font, HORIZ_DIR, charsize[font] )
settextjustify( LEFT_TEXT, TOP_TEXT )
outtextxy( 2*textwidth("M"), 2, "Horizontal" )
settextjustify( CENTER_TEXT, CENTER_TEXT )
x = (vp.right - vp.left) / 2
y = textheight( "H" )
for( i=1 i<5 ++i ){ /* For each of the sizes */
size = (font == SMALL_FONT) ? i+3 : i
changetextstyle( font, HORIZ_DIR, size )
h = textheight( "H" )
y += h
sprintf( buffer, "Size %d", size )
outtextxy( x, y, buffer )
}
if( font != DEFAULT_FONT ){ /* Show user declared font size */
y += h / 2/* Move down the screen */
settextjustify( CENTER_TEXT, TOP_TEXT )
setusercharsize( 5, 6, 3, 2 )
changetextstyle( font, HORIZ_DIR, USER_CHAR_SIZE )
outtextxy( (vp.right-vp.left)/2, y, "User Defined Size" )
}
Pause()/* Pause to let user look */
} /* End of FONT loop */
}
/* */
/* COLORDEMO: Display the current color palette on the screen. */
/* */
void ColorDemo(void)
{
struct viewporttype vp
int color, height, width
int x, y, i, j
char cnum[5]
MainWindow( "Color Demonstration" )/* Show demonstration name */
color = 1
getviewsettings( &vp )/* Get the current window size */
width = 2 * ( (vp.right+1) / 16 )/* Get box dimensions */
height = 2 * ( (vp.bottom-10) / 10 )
x = width / 2
y = height / 2/* Leave 1/2 box border */
for( j=0 j<3 ++j ){ /* Row loop */
for( i=0 i<5 ++i ){ /* Column loop */
setfillstyle(SOLID_FILL, color)/* Set to solid fill in color */
setcolor( color )/* Set the same border color */
bar( x, y, x+width, y+height )/* Draw the rectangle */
rectangle( x, y, x+width, y+height )/* outline the rectangle */
if( color == BLACK ){ /* If box was black... */
setcolor( WHITE )/* Set drawing color to white */
rectangle( x, y, x+width, y+height )/* Outline black in white*/
}
itoa( color, cnum, 10 )/* Convert # to ASCII */
outtextxy( x+(width/2), y+height+4, cnum )/* Show color # */
color = ++color % MaxColors/* Advance to the next color */
x += (width / 2) * 3/* move the column base */
} /* End of Column loop */
y += (height / 2) * 3/* move the row base */
x = width / 2/* reset column base */
} /* End of Row loop */
Pause()/* Pause for user's response */
}
/* */
/* ARCDEMO: Display a random pattern of arcs on the screen */
/* until the user says enough. */
/* */
void ArcDemo(void)
{
int mradius/* Maximum radius allowed */
int eangle/* Random end angle of Arc */
struct arccoordstype ai/* Used to read Arc Cord info */
MainWindow( "Arc Demonstration" )
StatusLine( "ESC Aborts - Press a Key to stop" )
mradius = MaxY / 10/* Determine the maximum radius */
while( !kbhit() ){ /* Repeat until a key is hit */
setcolor( random( MaxColors - 1 ) + 1 )/* Randomly select a color */
eangle = random( 358 ) + 1/* Select an end angle */
arc( random(MaxX), random(MaxY), random(eangle), eangle, mradius )
getarccoords( &ai )/* Read Cord data */
line( ai.x, ai.y, ai.xstart, ai.ystart )/* line from start to center */
line( ai.x, ai.y, ai.xend, ai.yend )/* line from end to center */
} /* End of WHILE not KBHIT */
Pause()/* Wait for user's response */
}
纯C的很少,windows32sdk和linux的gtk是为数不多的2个库。
现代基本没有用C开发gui的,C++是更好的选择,像qt
mfc比win32好用得多。
开发效率更高的是python,tkinter
wxwidget
pyqt都很方便
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)