C-WIN - A Public Domain 'C' Windowing System
This package was developed as a result of my desire to have a windowing
system written in a portable language. In the three years I've been
using the 'C' language I've progressed through six compilers. Each time
I've had to make extensive modifications to assembly language
subroutines to adapt them to the new compiler environment. In addition,
I've occasionally used commercial libraries of functions for which I've
only had executable code. These libraries, of course, did not work with
the new compiler and I was faced with a choice of purchasing a new
version of the library or writing my own functions to replace the
library routines I was using. After encountering this agony several
times I've come up with a simple solution. If I don't have the source
code to a function, it does not get linked into any of my programs!
I'm well aware that there are many commercial windowing packages
available and some are even willing to give you the source code. These
packages must be outstanding because they sure cost a lot.
Nevertheless, here is my first effort at a 'C' windowing package.
Humble as it may be the cost is right on. It is free and you can have
the source code. I don't want to sell it to you and I don't want you to
make a contribution if you like it. It is 100% public domain software,
do with it as you please.
This software has been developed using both Borland Turbo C V1.0 and
Microsoft C V5.00. I've also tested the code using Microsoft C V4.00.
I've tried to write this code in a portable manner and it should compile
with little or no change on most of the newer compilers which are
following the ANSI standard. I have used the Microsoft extension
keywords "pascal" and "near" to generate more efficient code but, if
your compiler doesn't support them, they can be removed without harming
The package consists of a single header and two source code files:
WIN.H The header file for use by the application code
as well as the windowing library code.
WIN.C The high level windowing functions. All code in
this file is machine independent.
SCRIO.C The low level screen access routines. This code
is machine dependent and is written for the IBM/PC
and true compatibles.
WINDEMO.C A short demo program which shows some of the
windowing functions in action.
This code will work properly on both TTL Monchrome and IBM CGA video
boards. In addition, it should work fine on both EGA and VGA boards.
Following are some comments related to these video cards:
- Monochrome: The ScrInitialize function will detect a monochrome
mode and automatically convert all attribute bytes
to black and white. This is done in a manner that
I find to be reasonable, if you disagree change the
code that does the conversion.
- CGA: Due to the snow generated by most CGA cards if the
video buffer is accessed during video refresh this
code disables the video signal while directly
updating the video buffer.
- EGA: Currently EGA color modes are treated as CGA. Most
schemes I've seen to detect an EGA search the EGA
extended BIOS for the IBM copyright notice. This,
to me, is not a good approach. I have seen one
method which used an INT 10h function added by the
EGA which caused no harm if an EGA was not
installed. At the time I read about it I was not
really interested in EGA and now that I am I can't
find the article. I also don't have access to EGA
documentation so I can't even figure out which
routine was being used. If you know how to detect
EGA add the code to ScrInitialize. Most EGA's
will work as CGA with the video signal being
disabled but this is not required with the EGA.
- VGA: Currently VGA color modes are treated as CGA. I've
never seen a VGA or any docs on it. If you've got
one, I hope this code works. If it doesn't,
I'm sorry, but I can't help.
Room for Improvement
The functions included in this package provide the basics for developing
an application using a windowed environment. There is certainly room
for improvement and I encourage you to enhance the functionality of
this package. Some suggestions:
- Enhance the Move and Hide window functions to support windows which
are not fully visible (i.e. partially overlayed).
- Use these functions to develop a higher level of support for things
like 123 style menus, pull down menus, data entry forms, etc.
- Speed up the TextOut functions. These functions rely on the ROM
BIOS character out routines as a result of my desire to stay 100%
with 'C' code. I was tempted many times to rip out ScrTextOut and
replace it with assembly code which directly accessed the hardware.
I've resisted only because the BIOS code is tolerable in most
situations and this code is much more portable than assembly code.
With higher speed machines becoming more commonplace this problem
I intend to work on some of these enhancements as time permits and I'm
sure you can think of many more. I would be very pleased if people
making fixes and enhancements to this code would communicate their work
to me. If we all work together we may be able to come up with a public
domain package which rivals those expensive commercial versions.
Many people in the software industry are quite happy to sell you
software while assuming no responsibility for its functionality or
usefulness. I am happy to give you this software but I also cannot
accept any responsibility for it. I've tested this code and to the best
of my knowledge it works and contains no errors. I simply state that I
think it is both functional and useful, I do not guarantee it. You need
to test the code to determine if it will be useful to you. If you
encounter problems with it, fix them. That's why you wanted the source
in the first place, right?
649 Meadowbrook St
Allen, Texas 75002
Functions Available in WIN.C
WinExplodeWindow Draws an exploding window on the screen. The
screen area behind the window is not saved, the
window is simply drawn.
WinDrawWindow Draws a window on the screen without saving the
screen area behind the window.
WinCreateWindow Creates a screen window and displays it at the
requested location. The are behind the window
is saved and will be restored when the window
WinDestroyWindow Destroys a previously created window. The
saved screen area is restored and all resources
allocated to support the window are freed.
WinScrollWindowUp Scrolls a window up one line.
WinScrollWindowDown Scrolls a window down one line.
WinSetCursorPos Positions the cursor either relative to an
open window or to absolute screen locations.
WinClearScreen Clears a window (or the entire screen) to the
requested color attribute.
WinTextOut Displays a string within the requested window
at the current cursor location (for the
selected window). If the string would extend
beyond the window it is truncated.
WinCenterText Centers a text string within a window on the
WinMoveWindow Moves an existing window to a new location on
the screen. There are a couple of caveats in
this version of the package:
1) The window must be fully visible (i.e. no
other window overlaying any part of it)
for this routine to work properly.
2) It is the callers responsibility to
insure that the moved window will still
fit on the screen at the new location.
3) The size of the window may not be changed,
it can only be moved to a new location.
WinGetWindowRow Returns the absolute row (1 relative) of the
WinGetWindowCol Returns the absolute column (1 relative) of
the selected window.
WinGetWindowWidth Returns the number of columns available for
text within the selected window. If the
window was created with a border, this value
will be two less than the width specified in
the create call.
WinGetWindowHeight Returns the number of rows available for text
within the selected window. If the window was
created with a border, this value will be two
less than the height specified in the create
WinGetWindowClr Returns the background color of a window.
WinGetWindowBdrClr Returns the border color of a window.
WinGetBorderType Returns the border type of a window.
WinHideWindow Removes a window from the screen. The window
still exists and is saved in it's current state.
All the caveats listed under WinMoveWindow
apply to the function.
WinShowWindow Shows a window which is hidden and frees the
buffer used to hold the current state of the
WinInitialize Initializes the window package. This function
must be called once before any of the other
functions in this package are used. It should
NEVER be called while windows are open or the
buffers allocated to support them will be
stranded and their handles will no longer be
WinTerminate Assures that all open windows are closed.
Functions Available in SCRIO.C
ScrGetRectSize Calculates the number of bytes required to
store a screen image.
ScreenClearRect Clears a rectangle on the screen to the passed
ScrSaveRect Save a screen rectangle in a buffer provided
by the caller.
ScrRestoreRect Restores a saved screen image from a buffer
passed by the caller.
ScrSetCursorPos Positions the cursor to an absolute screen
location (1 relative).
ScrGetCursorPos Gets the absolute screen location of the cursor.
ScrCursorOn Enables the screen cursor.
ScrCursorOff Disables the screen cursor.
ScrTextOut Displays a text string to the video screen.
ScrDrawRect Draws the selected border around a screen
ScrInitialize Determines the video equipment installed on the
machine. This routine is called by WinInitialize
and does not need to invoked by the user code.