Early Windows¶
Windows 1.x and 2.x, 1985 to 1990; Win16. The design language Windows 1.01 introduced in November 1985 and Windows 3.0 replaced in May 1990: flat one-pixel frames, monochrome line-art chrome that lives in the display driver, one fixed-pitch bitmap font, and reverse video as the only state color.
No first-party Microsoft document names this design language. "Early Windows" is a filing name, the same way "Windows 3.x" and "Windows 9x" are for the two eras after it.
Evidence Tiers
Every value on this page carries the tier of its source.
Tier 1 is shipped media or Microsoft's own source: the Windows 1.01 retail display
drivers, fonts and USER.EXE, and the Windows 2.03 DDK's driver source (COLOR.ASM,
BLKWHITE.ASM, CONFIG.ASM, the loose .BMP artwork). The SDK headers (WINDOWS.H from
1.01, 1.03, 1.04 and 2.03) sit just below that as shipped developer files.
Tier 2 is first-party documentation: the 1986 Application Style Guide, the Programming Guide and Programmer's Reference, and the 1985 and 1987 retail User's Guides.
Unusually for an old era, almost everything that matters here is Tier 1. No running Windows 1.x or 2.x was observed; every claim rests on a static resource or a document.
Principles¶
The Guide Specifies Behavior, the Driver Supplies the Pixels¶
The era has exactly one normative UI document, the Application Style Guide version 1.03 from October 1986.1 It runs twelve chapters on menus, accelerators, selection, keyboard and mouse conventions, filenames, dialog and message-box wording, multitasking etiquette, localization and help. It has no principles chapter at all. The one-page introduction is the whole of its stated intent, and it names a single value, consistency, for the benefit of "the nonprogramming user". It also says "Applications should deviate from the guidelines only when absolutely necessary", which is a stricter conformance stance than the 1992 guide that followed it.
What the book does not have is appearance. Its whole section on color, §10.8, is this:
"Applications should use color wherever appropriate; however, consideration also must be given to how the program looks on monochrome displays."
That is the complete color specification of the design language. There is no RGB value, no font name, no bevel, and outside one push-button height ratio no measurement of a drawn thing in all 92 pages. Note where the sentence sits, too: color is filed under Cooperation, after memory and file usage, as a compatibility duty toward hardware the application does not control.
Appearance lived in three places outside the book:
| Where | What it held |
|---|---|
| The display driver | every chrome bitmap (OBM_*), every cursor and system icon, the UI font, and the default color table |
| The driver's compiled-in color table | the defaults, linked into the driver as absolutes, which is why the shipped WIN.INI [colors] section is empty |
| Control Panel | one slot at a time, through Hue, Bright and Color scroll bars |
Cooperation Is the Real Core¶
Chapter 10, "Cooperation", is the one place the book states an ethic, and nothing in any later Windows guide replaces it. The machine was an 8088 with 256 to 640 KB, no memory protection and cooperative multitasking: an application that did not yield froze the whole system, the mouse included. So the rules are about yielding, signaling progress and not touching what you do not own.
- "Unless waiting for user input, applications with the input focus must not present any pause in activity (dead air) that lasts longer than five seconds." This is the era's only numeric UI requirement, and it is a ceiling on unresponsiveness, not a response-time target.
- The hourglass pointer must be shown for long operations, "with both keyboard and mouse interfaces", because the mouse was optional.
- An inactive application may not put a dialog in front of the user. It beeps, flashes its title bar or icon, and waits to be activated. The flashing title bar is the era's entire notification system.
What the Era Is Not¶
| Concept | Status |
|---|---|
| A 3-D metaphor | None. The words raised, sunken, bevel, shadow and three-dimensional do not occur in the style guide, and all chrome is 1 bit per pixel. |
| CUA-derived | No. IBM's first CUA publication is from 1987; the style guide is from October 1986 and the first User's Guide from August 1985. |
| Combo box, MDI, owner-draw | Absent from all four era headers. All three arrive with Windows 3.0. |
| A settable dialog font | No. DS_SETFONT is a Windows 3.0 addition; every dialog uses the System font. |
| Common dialogs | None. Every application drew its own Open and Save As boxes. |
| A Help menu | Not allowed. About... is the only command an application may add to the System menu, and help hangs off it; F1 enters a "help mode" with a question-mark pointer. |
| Ctrl+X, Ctrl+C, Ctrl+V | No. The clipboard keys are Shift+Esc (Undo), Del (Cut), F2 (Copy), Ins (Paste). |
| Hover, animation | Neither exists as a concept. |
Two Plateaus and One Cliff¶
The era looks like one thing but is two flat stretches with a single break between them. Windows
1.01 to 1.04 add two API functions in seventeen months and change nothing visual. Windows 2.03 to
2.11 add no new #define names at all and keep 51 of 52 chrome bitmaps byte-identical. Everything
that tells "Windows 1" from "Windows 2" happens at 2.03, December 1987, and it happens because
windows stopped being tiled.
| Marker | Windows 1.0x | Windows 2.x |
|---|---|---|
| Window placement | tiled (WS_TILED is 0) |
overlapping (WS_OVERLAPPED is the same 0, renamed) |
| Focus indicator | a blinking underscore inside the control | a dotted box around the focused area |
| Button label | Ok |
OK |
| Mnemonics | none; Alt+letter opens a menu by first letter | & mnemonics (0 of 183 sample menu items in 1.0x, 160 of 186 at 2.03) |
| System menu | 5 items: Size, Move, Icon, Zoom, Close | 7 items: Restore, Move, Size, Minimize, Maximize, separator, Close, with accelerators |
| Caption buttons | none | OBM_REDUCE, OBM_ZOOM, OBM_RESTORE |
SM_CMETRICS |
26 | 36 (sizing frame, minimum track size, caption-button size) |
| Color slots | 10 | 13 |
Two things commonly credited to Windows 3.x are not dating markers: the X in the check box and the rounded push-button corner both run unchanged from 1985 into Windows 3.0.
Foundations¶
Color¶
The Slot Table¶
Windows 1.x has ten COLOR_* slots, Windows 2.x thirteen.5 6 They name surfaces and
their text, nothing else.
| # | Constant | Control Panel label | Paints | Since |
|---|---|---|---|---|
| 0 | COLOR_SCROLLBAR |
Scroll Bars | the scroll-bar shaft (trough) | 1.01 |
| 1 | COLOR_BACKGROUND |
Screen Background | the desktop | 1.01 |
| 2 | COLOR_ACTIVECAPTION |
Active Title Bar | active title bar | 1.01 |
| 3 | COLOR_INACTIVECAPTION |
Inactive Title Bar | inactive title bar | 1.01 |
| 4 | COLOR_MENU |
Menu Bar | menu background | 1.01 |
| 5 | COLOR_WINDOW |
Window Background | client area, and every dialog | 1.01 |
| 6 | COLOR_WINDOWFRAME |
Window Frame | every 1 px frame | 1.01 |
| 7 | COLOR_MENUTEXT |
Menu Text | menu text | 1.01 |
| 8 | COLOR_WINDOWTEXT |
Window Text | client-area text | 1.01 |
| 9 | COLOR_CAPTIONTEXT |
Title Bar Text | active title text | 1.01 |
| 10 | COLOR_ACTIVEBORDER |
Active Border | active sizing border | 2.0 |
| 11 | COLOR_INACTIVEBORDER |
Inactive Border | inactive sizing border | 2.0 |
| 12 | COLOR_APPWORKSPACE |
Application Workspace | MDI client background | 2.0 |
The three 2.x slots all follow from overlapping windows. The header order, the WIN.INI keys and
the Control Panel list (string ids 112 to 121 in the shipped CONTROL.EXE) are the same ten items
in the same sequence, three independent routes.
What is missing matters more. COLOR_BTNFACE, COLOR_BTNSHADOW, COLOR_BTNTEXT,
COLOR_HIGHLIGHT, COLOR_HIGHLIGHTTEXT and COLOR_GRAYTEXT return zero hits in the 1.01,
1.03, 1.04 and 2.03 headers. They arrive with Windows 3.0 (COLOR_BTNHIGHLIGHT with 3.1). A push
button in this era is painted from the window colors like everything else; there is no "button
surface" in the color model, and no slot whose job is to show a state.
The Four Default Palettes¶
Both halves of the era have their defaults recovered from first-party evidence, and each half has a color and a monochrome row.
- Windows 1.01 is decoded from the shipped retail display drivers. Each carries an
OEMBINresource holding nine metric words and then tenR,G,B,0quads in slot order.7 - Windows 2.03 is read from the DDK's own driver source,
COLOR.ASMandBLKWHITE.ASM, whose header says "The default colors are defined as absolute values to be linked into color display drivers".8
| Slot | 1.01 mono | 1.01 color (EGA) | 2.03 color | 2.03 mono |
|---|---|---|---|---|
SCROLLBAR |
#C0C0C0 |
#FF0000 |
#3F3F3F |
#3F3F3F |
BACKGROUND |
#808080 |
#00FF40 |
#00FFFF |
#7F7F7F |
ACTIVECAPTION |
#000000 |
#0000FF |
#0000FF |
#000000 |
INACTIVECAPTION |
#808080 |
#4040C8 |
#FFFFFF |
#FFFFFF |
MENU |
#FFFFFF |
#FFFF00 |
#00FFFF |
#FFFFFF |
WINDOW |
#FFFFFF |
#FFFFFF |
#FFFFFF |
#FFFFFF |
WINDOWFRAME |
#000000 |
#000000 |
#000000 |
#000000 |
MENUTEXT |
#000000 |
#000000 |
#000000 |
#000000 |
WINDOWTEXT |
#000000 |
#000000 |
#000000 |
#000000 |
CAPTIONTEXT |
#FFFFFF |
#FFFFFF |
#FFFFFF |
#FFFFFF |
ACTIVEBORDER |
none | none | #7F7F7F |
#7F7F7F |
INACTIVEBORDER |
none | none | #7F7F7F |
#7F7F7F |
APPWORKSPACE |
none | none | #0080FF |
#BFBFBF |
How each row is corroborated:
| Row | Witnesses |
|---|---|
| 1.01 mono | four shipped drivers (EGAMONO, EGAHIBW, HERCULES, CGA), and the 1985 User's Guide Appendix A, which prints exactly these ten values (Scrollbar = 192 192 192, Background = 128 128 128, ...)3 |
| 1.01 color | two shipped drivers (EGAHIRES, EGALORES), and a second copy of COLOR.ASM in the 2.03 DDK whose commented-out ; alpha/beta 1 colors block is this row exactly, so the Windows 2.0 alpha still carried the 1.x palette |
| 2.03 color | COLOR.ASM, identical for EGA, VGA and 1024x768 |
| 2.03 mono | BLKWHITE.ASM, identical for all five adapters |
Some details worth keeping:
- The out-of-box Windows 2.x color desktop is cyan, with pure-blue title bars, a cyan menu
bar and white windows. Later eras' navy
#000080caption invites the assumption that 2.x looked the same. It did not. - The 1.01 monochrome row is the look most people picture as early Windows: white windows and menus, black text, a black active title bar and a mid-gray screen.
#4040C8is the only hand-mixed color in the era. Every other value is built from00,3F,40,7F,80,BF,C0orFF.- The 1.01 color row conflicts with Microsoft's own photography on the Windows 1.01 retail box, captioned as an IBM EGA screen, which shows yellow-green scroll-bar troughs and pale-cyan client areas. The likeliest reading is a scheme dressed through Control Panel for the photograph, but that is an inference. The drivers are the evidence.
- The 1987 User's Guide is two slots stale. It agrees with
BLKWHITE.ASMon eleven of thirteen keys and still prints the 1.0 values forScrollbarandInactiveTitle.4 The driver source is the authority. - Only three slots moved between 1.01 mono and 2.03 mono:
SCROLLBAR(#C0C0C0to#3F3F3F),INACTIVECAPTION(#808080to#FFFFFF) andBACKGROUND(#808080to#7F7F7F). Those are the ones a viewer notices, so they are the ones not to mix between rows.
Pick a version first, then a display class, and do not mix them. The four rows are four distinct looks.
The Grays Go Round in a Circle¶
Windows 1.01's two grays are #C0C0C0 and #808080, the exact pair Windows 3.x made famous,
shipped five years earlier. Windows 2.03 re-derives the ramp as exact quarters (#3F3F3F,
#7F7F7F, #BFBFBF) and Windows 3.0 goes back to 192 and 128, this time giving them a job as
face and shadow. In this era the grays never compose anything: they paint a scroll-bar shaft, a
desktop, a sizing border and an MDI workspace, and nothing is stacked against anything.
Persistence and Theming¶
GetSysColor, SetSysColors and WM_SYSCOLORCHANGE are all present and unchanged from 1.01.
Control Panel writes changed slots to WIN.INI [colors] as decimal R G B lines. The shipped
[colors] section is empty in both the 1.01 retail runtime and the 2.03 SDK; an absent key
falls through to the driver's table.
The whole theming model is Control Panel's Screen Colors dialog: a list box of the ten or thirteen
elements, three scroll bars labeled Hue, Bright and Color, a mock window built from
the strings Active, Inactive, File Edit and Window Text, and Ok / Reset / Cancel.
There are no named color schemes: the word scheme occurs zero times in both User's Guides.
Named schemes arrive with Windows 3.x. A scheme picker in a Windows 1.x or 2.x reproduction is
the most likely anachronism, because every later Windows has one.
The Hardware Underneath¶
Four of the six Windows 1.01 display drivers are monochrome. CGA and Hercules show 2 colors, EGA
16. There is no palette manager, no LOGPALETTE and no documented rule for how a COLORREF maps
to a 2-color device. Color, in this era, is a property of a minority of installations, and the
style guide's one sentence is a plain description of that installed base.
Relief: There Is None¶
This is the central finding for the era, and it is a negative one, provable three ways.
- The drawing API cannot express an edge. The complete rectangle-and-frame surface in both
1.01 and 2.03 is seven calls:
FillRect,FrameRect,InvertRect,PatBlt,GrayString,RectangleandRoundRect. None takes an edge, a side, a light direction or a state.FrameRectdraws the same brush on all four sides; it is structurally incapable of an asymmetric bevel.DrawEdge,DrawFrameControl,DrawStateandDrawFocusRectreturn zero hits in all four headers. - The color table has no surface. No face, no shadow, no highlight slot.
- The pixels are one bit deep. Every
OBM_*bitmap in every 1.01 driver and every 2.03 resource set isplanes = 1, bitsPixel = 1. There are no grays in the artwork because the artwork cannot hold one.
A gray brush does exist: SS_GRAYRECT and SS_GRAYFRAME are static-control styles from 1985, and
GRAY_BRUSH is there. No system control is drawn with any of them. A gray brush exists; a gray
control face does not. Windows 3.0 introduced no new primitive. It introduced a color slot whose
job was to be a surface.
What the era uses instead:
| Construction | What it is |
|---|---|
| Frame | cxBorder px of COLOR_WINDOWFRAME on the left and right, cyBorder px on the top and bottom. Both are 1 on every square-pixel adapter; cxBorder is 2 on CGA and EGA low resolution, where pixels are twice as tall as wide, so a vertical rule weighs the same as a horizontal one. |
| Dialog frame | WS_CAPTION is literally WS_BORDER OR'd with WS_DLGFRAME. A dialog gets a 1 px COLOR_WINDOWFRAME line plus a flat cxDlgFrame band in COLOR_ACTIVECAPTION: two flat bands, never two sides of anything. The Programming Guide's section on it is titled "Creating Pretty Dialog Borders" and its whole advice is to set the style bit.2 |
| Sizing frame (2.x only) | BorderWidth, default 5 px, user-settable from 1 to 50 and redrawn live. A grab target, not an elevation cue. |
| State | InvertRect. The era has exactly two visual planes, normal and inverted. |
| Disabled | GrayString, text through a 50 % checkerboard brush. |
There is one seed of what comes next. Windows 2.03's three new caption-button bitmaps and its redrawn Control-menu box are hollow glyphs with a 1 px top and left edge and a 2 px right and bottom edge. In one-bit art that reads as a drop shadow, and it is the first appearance of the 1 : 2 asymmetry that Windows 3.x later states in color. It appears on those glyphs only, is not expressible in any API, and applies to the glyph inside the button rather than to any surface.
The chrome this era hands forward is literal. OBM_BTNCORNERS (the push-button corner sheet) and
OBM_SIZE (the scroll-bar corner box) are bit-for-bit identical from Windows 1.01 (1985) to
Windows 3.0 (1990), measured in the Windows 3.0 SDK's VGA.DRV.10 Windows 3.0 did not
repaint the old art. It kept the thirteen monochrome ordinals and shipped fifteen new 4-bpp
beveled bitmaps beside them.
Typography¶
The UI type is a single face called System: a bitmap font, fixed pitch, drawn with
2-pixel stems, shipped at one size per display and at no other.9 Every value below is read
from the FONTINFO headers of the shipped files.
| Release, display | File | Cell (w x h) | Ascent | Leading | Weight | Line pitch |
|---|---|---|---|---|---|---|
| 1.01, high res (EGA 640x350, Hercules) | HIFONTS.FON |
8 x 12 | 10 | 2 external | 400 | 14 |
| 1.01, low res (CGA, EGA 640x200) | LOFONTS.FON |
8 x 8 | 7 | 1 external | 334 | 9 |
| 2.03, CGA | SYS08CGA.FNT |
8 x 8 | 7 | 1 external | 400 | 9 |
| 2.03, EGA | SYS08EGA.FNT |
8 x 10 | 9 | 2 internal | 400 | 10 |
| 2.03, VGA | SYS12VGA.FNT |
8 x 15 | 12 | 3 internal | 400 | 15 |
| 2.03, 1024x768 | SYSHIRES.FNT |
10 x 20 | 16 | 2 internal | 400 | 20 |
- Fixed pitch.
dfPitchAndFamilyhas bit 0 clear anddfAvgWidth == dfMaxWidth == 8, two independent checks. By Windows 3.x the System font is proportional and bold. The change of pitch is the largest typographic difference between the two eras. - Regular weight, but heavy on screen. The declared weight is 400, and every stem is drawn two
pixels wide, so it reads as a semi-bold. A reconstruction with 1 px stems looks markedly
lighter.
LOFONTS' weight of 334 is unexplained. - One UI face. Windows 3.x's split between a chrome face and a dialog face does not exist yet. Menus, captions, dialogs and edit controls all use System, and edit controls are fixed-pitch by rule: "All edit controls use the fixed pitch ANSI font to display characters."
- The zero is slashed, a diagonal from bottom left to top right inside the bowl. It is the fastest test for a substitute face.
- Bitstream, 1984. Every face carries
(c) Copyright Bitstream Inc. 1984, except the 2.03 1024x768 face, which is a separate Microsoft drawing from 1987. - The font may not outgrow the chrome. Every
FONTS.ASMin the DDK opens with "System font height should be less than or equal to the close box and the size box bitmaps heights", which is why font and chrome bitmaps are redrawn per adapter in lockstep rather than scaled. - No antialiasing, no hinting, no scaling, no outline format and no user choice of UI font. The
only stroke fonts (
Roman,Modern,Script) are document fonts.
The style guide says nothing about type. Its one typographic rule is the push-button height, in §8.11.1.
Substitutes on Current Windows¶
System cannot be redistributed: it is Bitstream-licensed, and a .FON raster face besides,
which DirectWrite cannot load. Every monospaced outline face that ships with Windows 11 was
measured for this page; "em for 8 px" is the pixel size at which the advance matches the era's 8.
| Face | Advance / em | Em for 8 px | Zero | Note |
|---|---|---|---|---|
Consolas |
0.550 | 14.55 | dotted | humanist, least period-looking, keeps the 0/O distinction |
Lucida Console |
0.603 | 13.28 | plain | squarer and more period-looking, loses the distinction |
Courier New |
0.600 | 13.33 | plain | slab typewriter, wrong genre |
MS Gothic |
0.500 | 16.00 | plain | metrically exact, but not inbox on en-US Windows |
None of them fits, and the gap is weight, not family. At the size where the advance is 8 px,
all of them render 1 px stems where the era's are 2 px. Asking for bold is not the fix: the era's
face is weight 400 and Windows 3.x's System really is 700, so a bold would erase a documented
difference between the two eras.
Metrics¶
The Dialog Unit Arrives Complete¶
The Programming Guide defines dialog units in 1986 exactly as Win32 still does: a horizontal unit is a quarter of the System font's character width, a vertical unit an eighth of its height, excluding external leading.2
| Configuration | Cell | 1 h-DU | 1 v-DU | 8 v-DU | 14 v-DU (a push button) |
|---|---|---|---|---|---|
| 1.01, high res | 8 x 12 | 2 px | 1.5 px | 12 px | 21 px |
| 1.01, low res | 8 x 8 | 2 px | 1 px | 8 px | 14 px |
| 2.03, EGA | 8 x 10 | 2 px | 1.25 px | 10 px | 17.5 px |
| 2.03, VGA | 8 x 15 | 2 px | 1.875 px | 15 px | 26.25 px |
| 2.03, 1024x768 | 10 x 20 | 2.5 px | 2.5 px | 20 px | 35 px |
Eight vertical units is one line of text by construction. The 1.01 high-resolution configuration is the one where everything lands on whole pixels, and it is the configuration every other measurement on this page is taken at.
Control Heights and Layout, as Built¶
Measured over 57 SDK sample resource scripts and the decoded dialog templates of the shipped 1.01 shell and applets, in dialog units.
| Control | Height | Notes |
|---|---|---|
| Push button | 14 | 159 of 159 buttons, no exception in any SDK version |
| Edit, bordered | 12 | 97 of 97; "use 8 units if the control has no border, and 12 units if the control has a border" |
| Radio button | 12 | 60 of 60 |
| Check box | 15 (1.0x samples) / 12 (shipped applets) | |
| Static text, one line | 8 | exactly one character cell |
| Scroll bar in a dialog | 12 | the Control Panel sliders |
| Convention | Value |
|---|---|
| Ok / Cancel | 32 x 14 DU each; Open / Cancel in a file dialog 50 x 14 |
| Button width rule | "the number of characters in the push button name plus 2", which gives exactly 32 for Cancel |
| Label to field | the static label's y is 2 units above the edit control's |
| Dialog margin | 4 units |
| Maximum dialog | 80 columns x 4 = 320 h-DU; 24 rows x 8 = 192 v-DU; no more than 75 % of the screen |
The style guide prints the maximum height as 96, which does not match its own formula (24 x 8 = 192). The shipped samples obey the formula.
Per-Adapter Pixel Metrics¶
The first nine words of every driver's configuration block (1.01 OEMBIN, 2.03 CONFIG.ASM),
identical across both releases:
| Metric | EGA hi-res, VGA, Hercules, 1024x768 | CGA, EGA lo-res |
|---|---|---|
| Vertical scroll thumb height | 18 | 12 |
| Horizontal scroll thumb width | 20 | 24 |
| Icon compression (h, v) | 2, 2 | 2, 4 |
| Cursor compression (h, v) | 1, 1 | 1, 2 |
cxBorder |
1 | 2 |
cyBorder |
1 | 1 |
Every one of these is a pixel count a person chose per display. There is no formula and no DPI
concept anywhere in the era. The eight system metrics 2.x adds (SM_CXMIN/CYMIN,
SM_CXSIZE/CYSIZE, SM_CXFRAME/CYFRAME, SM_CXMINTRACK/CYMINTRACK) are exactly what a
dragged, resizable, minimizable window needs and a tiled one does not.
States and Motion¶
The entire state vocabulary is two calls: InvertRect and GrayString.
| State | Mechanism | 1.0x | 2.x |
|---|---|---|---|
| Selected text or item | reverse video | yes | yes |
| Active window | active vs inactive caption color | yes | yes |
| Insertion point | a flashing caret, "a bar or bitmap" | yes | yes |
| Focus | a blinking underscore inside the control, under its label | yes | no |
| Focus | a dotted box around the focused area | no | yes |
| Default button | a bold border (OBM_BTNCORNERS glyph B) |
yes | yes |
| Checked menu item | a tick beside the name (OBM_CHECK) |
yes | yes |
| Checked check box | an X in the box | yes | yes |
| Selected radio | a filled center | yes | yes |
| Pressed push button | "blackened", inverted | yes | yes |
| Pressed check box, radio | "emboldened", the glyph at 2 px stroke | yes | yes |
| Disabled label | grayed, the label only | yes | yes |
| Disabled glyph | 50 % checkerboard dither | yes | yes |
| Hover | does not exist | no | no |
| Attention | beep, then flash the title bar or icon | yes | yes |
Some rows need a sentence each.
- Focus is the sharpest 1.0x vs 2.x discriminator. The 1985 User's Guide uses underscore 18 times and dotted never; the 1987 one uses dotted 8 times. In 1.0x the underscore is a single indicator for the whole screen that turns into the text caret when it lands in a text box, and the style guide sizes push buttons to hold it: "Push-button height should be 1-1/2 times as high as the tallest character in the button name and also should include space for the blinking underscore."
- Default and focus are separate. Enter fires the default button from anywhere in the dialog;
Space fires the focused one. The default never moves in 1.0x. 2.0 adds
DM_SETDEFID, so it can move at run time. - Pressed is documented in one sentence,
BM_SETSTATE's: "If wParam is TRUE, the button is blackened, or the check box is emboldened."2 There is no pressed artwork for a push button or a scroll arrow, no bevel to sink into, and no label offset. - Disabled grays the text, never the frame. "When a button cannot be chosen, the label in the button should be grayed." On the four monochrome 1.01 drivers there is no gray to draw with, so the gray is a checkerboard.
- No hover. hover, mouse over and rollover occur zero times across all three books, and
the
BN_*set has no enter or leave notification. With inversion as the only state operation a hover would be indistinguishable from pressed. A menu highlight follows the pointer only while a mouse button is held.
Motion does not exist. No duration, easing or transition is named anywhere. The only timing
values in the era are the shipped WIN.INI defaults, identical in 1.01 and 2.03, and the five
second dead-air ceiling:
| Value | Default |
|---|---|
CursorBlinkRate |
550 ms |
DoubleClickSpeed |
500 ms |
| Maximum dead air with the input focus | 5 s |
Iconography¶
The era ships five system icons (OIC_SAMPLE, OIC_HAND, OIC_QUES, OIC_BANG, OIC_NOTE) and
seven system cursors in 1.x, twelve in 2.x (the five sizing cursors arrive with resizable windows),
all 1 bit deep. Masters are authored at 64 x 64 for icons and 32 x 32 for cursors and then squashed
by integer factors per adapter, so an icon is 64 x 64 on 1024x768, 32 x 32 on EGA and 32 x 16 on
CGA. There is no fixed icon size in this era. The 1.01 icons are a white symbol knocked out of a
black tile; the 2.03 masters are black line art on white, and the triangle around the exclamation
mark, still in Windows today, arrives with Windows 2.0. The style guide gives no icon design
guidance at all.
Minimizing is the icon model: there is no taskbar. In 1.0x icons sit in an icon area along the bottom of the screen; in 2.x they float and can be dragged, and their title shows only while selected.
Controls¶
The era has five window classes: BUTTON, EDIT, STATIC, LISTBOX and SCROLLBAR, plus
menus. Every control on this page is one of them.
Push Button¶
A one-bit, round-cornered outline with a label in it. No face color, no highlight, no shadow. "A push button is a box that contains a string."
The only shipped artwork is OBM_BTNCORNERS, a 30 x 10 monochrome sheet with three motifs,
byte-identical from the 1.01 driver through the 2.03 DDK to Windows 3.0:
| Motif | Extent | Shape | Role |
|---|---|---|---|
| A | 6 x 6 | ring, 1 px stroke, corner pixel cut | ordinary push-button corner |
| B | 8 x 8 | ring, 2 px stroke, two pixels cut | the default button corner |
| C | 4 x 4 | solid block | corner fill / clip mask |
On the 640x200 adapters the sheet is redrawn at 36 x 6 (a 6 x 4 and a 12 x 6 ring), squashed rather than scaled.
| Property | Value | Source |
|---|---|---|
| Height | 14 DU (21 px at 8 x 12) | every shipped template |
| Width | characters + 2, in 4 DU per character; 32 DU for Ok / Cancel | Programming Guide §7.3.6 |
| Fill | COLOR_WINDOW, the page itself |
no face slot exists |
| Outline | 1 px COLOR_WINDOWFRAME, rounded by motif A |
OBM_BTNCORNERS |
| Default button | the same outline at 2 px, corners from motif B; "The default button has a bold border" | style guide §8.5 |
| Pressed | inverted ("blackened"); label does not move | BM_SETSTATE |
| Disabled | label grayed; frame and corners unchanged | style guide §8.6 |
| Focus | 1.0x underscore under the label; 2.x dotted box | User's Guides |
| Hover | none |
Every modal dialog "should have a default push button". Where the safe choice is negative, the guide asks for Yes / No with No as default rather than making Cancel the default.
The system's own labels live in USER.EXE's string table, and they are the sharpest single dating
marker there is:
| Index | 1.01 | 2.03 |
|---|---|---|
| 2 | Ok |
OK |
| 3 | Cancel |
Cancel |
| 4 to 8 | Abort, Retry, Ignore, Yes, No |
&Abort, &Retry, &Ignore, &Yes, &No |
Ok follows the style guide's own rule: "The first letter in the push-button name should be a
capital. All other characters in the name should be lowercase."
The guide places buttons "at the upper right edge of the window with Cancel under Ok". Microsoft's own 1.01 applets mostly put them in a bottom row instead. The guide and the product disagreed from the first release.
Check Box and Radio Button¶
Both are drawn from OBM_CHECKBOXES, a sheet of 4 columns x 3 rows of 1-bit outline glyphs.
| Column | State | Drawn as |
|---|---|---|
| 0 | not set | outline, 1 px stroke |
| 1 | set | outline plus its mark |
| 2 | not set, pressed | outline at 2 px stroke |
| 3 | set, pressed | 2 px outline plus its mark |
| Row | Contents |
|---|---|
| 0 | check box: a hollow square; checked is an X drawn corner to corner |
| 1 | radio button: a ring; selected is a filled disc in the ring |
| 2 | the grayed third state: a 50 % checkerboard (columns 1 and 3; the others are unused scratch art) |
| Release, display | Sheet | Cell |
|---|---|---|
| 1.01, EGA hi-res, Hercules, mono | 56 x 42 | 14 x 14 |
| 1.01, CGA, EGA lo-res | 64 x 24 | 16 x 8 |
| 2.03, EGA, Hercules | 56 x 33 | 14 wide; bands 11 / 10 / 12 |
| 2.03, VGA | 56 x 39 | 14 x 13 |
| 2.03, 1024x768 | 64 x 48 | 16 x 16 |
Facts that matter for a reconstruction:
- The X is from November 1985. It is often presented as a Windows 3.x trait; 3.x inherited it.
- Two marks for two jobs. A checked check box is an X; a checked menu item is a tick
(
OBM_CHECK). Windows 95 later collapses them. - Pressed is emboldened, not inverted. The stroke thickens; ink and paper do not swap.
- No well. Not one of the twelve cells has an interior fill or an edge with a direction. A check box is a hollow square with a 1 px outline sitting on the dialog background.
- Grouping: radio buttons carry
WS_GROUPon the first member only and noWS_TABSTOP, so Tab skips the group and the arrow keys move within it. Each check box carriesWS_TABSTOP | WS_GROUP.
Edit Control and Static Text¶
| Property | Value |
|---|---|
| Height | 12 DU with a border, 8 without; every shipped edit is 12 |
| Frame | 1 px COLOR_WINDOWFRAME (WS_BORDER) |
| Fill, text | COLOR_WINDOW, COLOR_WINDOWTEXT |
| Font | fixed-pitch, by rule; EM_SETFONT requires a fixed-pitch font |
| Selection | reverse video, shown on focus and hidden on focus loss unless ES_NOHIDESEL |
| Caret | a flashing vertical bar, 550 ms blink |
| Styles | the seven ES_* values are identical from 1.01 to 2.03; no password, read-only or case styles |
STATIC is both the label and the dialog editor's only decorative primitive. Its six rectangle
styles, SS_BLACKRECT, SS_GRAYRECT, SS_WHITERECT and the matching *FRAME trio, are flat
single-color fills or one-unit frames in three tones, and they are the era's whole ornamental
vocabulary.
List Box¶
Four LBS_* styles, unchanged across the era, and LB_DIR fills one with a file listing in a
single message. There is no combo box: not in the headers, the style guide, the User's Guides,
the 57 sample scripts or the 507 dialog items decoded from 12 shipped binaries. An Open dialog pairs
an edit field with a list box because that was the only way to get the combination. There is no
height rule either; the shipped habit is 56 DU (seven rows at 8 DU) for a file list.
Scroll Bar¶
The 1985 User's Guide describes it as "the gray bars" with "the small white box" as the thumb,
the only control whose colors any source states. The shaft is COLOR_SCROLLBAR.
| Part | EGA hi-res (1.01) | Note |
|---|---|---|
| Up / down arrow | 15 x 16 | a solid triangle on a stem, floating on background, no box and no pressed variant |
| Left / right arrow | 20 x 13 | |
Thumb (OBM_BTSIZE) |
15 x 14 | 15 x 13 in the 2.03 EGA set |
| Vertical thumb height | 18 px | 12 on CGA |
| Horizontal thumb width | 20 px | 24 on CGA |
libwinui draws this bar under Windows 1.x/2.x in a 17 px gutter: the stemmed arrows in
COLOR_WINDOWFRAME on COLOR_WINDOW boxes, a white scroll box of the driver's fixed 18 px (20 on
a horizontal bar) framed the same way, and the flat COLOR_SCROLLBAR shaft, inverted under a held
page click. The bar's thickness is not on file; 17 holds the 15 px square-pixel arrow art in its
frame.
The four arrows and the size box are byte-identical between 1985 and 1988. The size box
(OBM_SIZE, 13 x 14) is two 3 px bars forming an elbow: a divider, not a grip. There is no
trackbar in the era; Control Panel uses a horizontal scroll bar between Slow and Fast labels as
its slider.
Group Box¶
BS_GROUPBOX, a member of the BUTTON class: "a rectangle that has an identifying text string in
its upper left corner". No source states its line weight or corner treatment, and there is no
bitmap for it; a one-pixel rectangle is the only plausible reading. There is no etched groove in
any source. In shipped dialogs the first child sits 4 DU in from the side and 12 DU down from the
top.
libwinui's GroupBox draws that reading: a 1 px COLOR_WINDOWFRAME rectangle with the label at the
upper left breaking its top line, and the content 8 px in and 24 px down.
Menus¶
The menu bar is the entire navigation model. There is no toolbar, status bar, context menu, cascading menu, tooltip or Help menu. Menu text is on a fixed 8 px grid, so accelerator columns line up with literal spaces.
| Element | Treatment |
|---|---|
| Bar, drop-down | COLOR_MENU fill, COLOR_MENUTEXT text, 1 px frame |
| Highlight | reverse video |
| Disabled item | grayed, never removed |
| Toggle | a tick beside the name |
| Separator | one kind only, a single "line separator" |
| Dialog-opening item | name ends in an ellipsis |
| Accelerators | to the right of the name; ^key for Ctrl, Fn for function keys |
The prescribed Edit accelerators are Shift+Esc (Undo), Del (Cut), F2 (Copy), Ins (Paste). Windows 2.0 moves to Alt+Backspace, Shift+Del, Ctrl+Ins and Shift+Ins. Ctrl+Z/X/C/V arrives with Windows 3.1.
Dialogs and Message Boxes¶
| Property | Value |
|---|---|
| Surface | COLOR_WINDOW, the same white as every client area; there is no gray dialog page |
| Modal frame | the double flat frame of WS_DLGFRAME |
| Modeless | a title bar and a System menu, captioned with the command that opened it |
| Shadow, scrim | none |
| Message-box types | four in the guide, matching four icons: note, exclamation, question, hand |
| Message-box caption | the application name; "should not use "WARNING" or exclamation points" |
| Icon position | upper left |
Windows¶
| Release | Model |
|---|---|
| 1.0x | Tiled. WS_TILED is 0: tiled is what you get when you ask for nothing. The screen is split column-first into tiles, with an icon area along the bottom; Zoom is the only way to overlap. |
| 2.x | Overlapping. WS_OVERLAPPED is defined as WS_TILED, the same bit pattern renamed. Free drag and resize, and Minimize / Maximize / Restore replace Icon / Zoom. |
The chrome bitmaps across the era, EGA high resolution:
| Bitmap | 1.01 | 2.03 DDK | Change |
|---|---|---|---|
OBM_BTNCORNERS |
30 x 10 | 30 x 10 | byte-identical |
OBM_UPARROW, OBM_DNARROW |
15 x 16 | 15 x 16 | byte-identical |
OBM_LFARROW, OBM_RGARROW |
20 x 13 | 20 x 13 | byte-identical |
OBM_SIZE |
13 x 14 | 13 x 14 | byte-identical |
OBM_BTSIZE |
15 x 14 | 15 x 13 | redrawn |
OBM_CHECK |
16 x 16 | 14 x 14 | redrawn |
OBM_CHECKBOXES |
56 x 42 | 56 x 33 | redrawn |
OBM_CLOSE |
26 x 14 | 50 x 14 | redesigned, with the 1 : 2 shadow edge |
OBM_REDUCE, OBM_ZOOM, OBM_RESTORE |
none | new | 2.x only |
Controls the Era Does Not Have¶
Slider, progress bar, combo box, tab control, tree view, toolbar, status bar, toggle switch,
tooltip, spin box and every common dialog are later inventions. BS_USERBUTTON and SS_USERITEM
are the only owner-supplied escape hatches, and the shipped applets use neither.
Reproducing It Today¶
Windows1x theme, in a window opened with Frame::Themed.Unusually for an old era, most of the look can be rebuilt exactly on a modern stack such as Direct2D and DirectWrite. The chrome is one-bit line art on one-pixel frames and the colors are in Microsoft's own driver source, so there is no bitmap archive to approximate and no bevel ramp to reconstruct. The hard part is suppression: every instinct a modern toolkit has (a gray face, a bevel, hover, antialiasing, animation) has to be turned off.
Exactly Reproducible¶
| Era fact | What it takes |
|---|---|
| The four default palettes | the ten or thirteen values from the table above, one row at a time |
| No relief | flat fills and 1 px frames in COLOR_WINDOWFRAME, stroked inside the bounds, and no two-tone edge anywhere |
| White page | dialogs, fields and every client area use COLOR_WINDOW; there is no gray surface to fall back to |
| Push button | a rounded outline on the page, with a 2 px outline for the default button and an inverted fill with an unmoved label for pressed |
| Check box, radio | a hollow square with a corner-to-corner X, and a ring with a filled disc; pressed thickens the outline from 1 px to 2 px |
| Dialog frame | a cxBorder line in COLOR_WINDOWFRAME plus a flat band in COLOR_ACTIVECAPTION, two flat bands rather than a heavier border |
| Selection | reverse video, swapping text and background colors |
| Focus | the 1.0x blinking underscore or the 2.x dotted box, matched to the version of the palette |
| States | no hover, no transition, no easing; disabled grays the label only |
| Rasterization | aliased geometry and aliased text, snapped to whole device pixels |
| Layout | dialog units computed from the System font's cell, as in Metrics |
Approximated¶
| Gap | Why, and what the choice costs |
|---|---|
The System font |
It cannot be redistributed and DirectWrite cannot load a .FON face. The options are a re-authored 8 x 12 bitmap face under a license you hold, or a monospaced outline face at the size whose advance is 8 px, drawn aliased (see Substitutes on current Windows). The outline face gives 1 px stems where the era's are 2 px and a dotted or plain zero where the era's is slashed. A proportional face changes layout, not just texture, because every caption, menu and dialog was built on cell arithmetic. |
| The hand-drawn glyph sheets | OBM_CHECKBOXES and OBM_BTNCORNERS are Microsoft's art and must not be extracted or redistributed. They have to be re-drawn from the measurements on this page. Everything else (arrows, thumb, size box, menu tick) is simple enough to generate as geometry. |
| Per-pixel art vs geometry | The corner of a push button is a hand-cut pixel pattern, not a radius; a 1 px radius only stands in for motif A's cut, and motif B cuts two pixels. The era also redrew its art per adapter rather than scaling it, so at a modern DPI an implementation either picks one adapter's art and scales it by whole multiples, or draws geometry that no longer matches it pixel for pixel. |
| The disabled gray | The era's gray is a 50 % checkerboard. Drawn as a pattern it needs pixel snapping to stay crisp; drawn flat it becomes the color it averages to (#808080 for black on white). |
| Reverse video on color rows | The era's prose rule is a swap of foreground and background. The actual InvertRect is a bitwise complement, and on a color row the two differ: over the 2.03 cyan menu bar a complement comes out red, not black. |
cxBorder of 2 |
On CGA and EGA low resolution vertical rules are 2 px thick to make up for tall pixels. Current displays have square pixels, so a re-creation targets the square-pixel adapters and draws 1 px everywhere. |
| The title bar | DWM owns the modern title bar and takes square corners and caption and border colors, which gets close to the era's flat caption. A libwinui window opened with Frame::Themed draws the caption itself. A 2.x scheme gets the System-menu box and the outline-arrow boxes inside a sizing frame. A 1.0x scheme gets a caption with only the three-bar box, inside a single frame line. Which of 1.01's two box glyphs shows at rest is not settled, so libwinui's early-Windows theme draws the three bars. |
| Controls the era lacks | A modern application expects sliders, progress bars, toggle switches, combo boxes, tabs, tooltips and more. The era has five window classes and nothing else, so anything drawn for the rest is an invention. Building them from era parts (a 1 px rule, a flat fill, the checkerboard, the scroll-bar thumb) keeps them plausible. The era's own slider was a horizontal scroll bar. |
Behavior, Not Appearance¶
Some of the most recognizable parts of the era are behavior, content or layout. A theme that changes only how controls are drawn cannot give them; an application or a window manager has to.
| Era trait | What it actually is |
|---|---|
| Tiled windows in 1.0x, the icon area along the bottom | window management |
| Del / F2 / Ins as Cut / Copy / Paste, Shift+Esc as Undo | input handling |
| The five-item System menu, no mnemonics in 1.0x | menu content |
Ok vs OK |
string content, and the sharpest dating marker there is |
| No combo box, no MDI, no common dialogs, no Help menu | which controls and dialogs an application uses |
| The five-second dead-air ceiling | application responsiveness |
High Contrast¶
The era has no high-contrast setting and no accessibility settings at all. The style guide never names accessibility, although its rule that every command must work from the keyboard as well as the mouse has the same effect for keyboard users. What the era did have is the next best thing: four of the six Windows 1.01 display drivers are monochrome, so the default for most installations was already black on white, and every color slot could be set by hand in Control Panel. Because nothing in the model is derived from anything else, any set of slot values, including a modern contrast theme mapped onto the ten or thirteen slots, leaves the construction intact.
The next era, Windows 3.x, keeps this era's rounded button corner and check-box X and adds the first real bevel.
Sources¶
-
Microsoft, Microsoft Windows Software Development Kit: Application Style Guide, version 1.03, document 050051016-103-101-1086, October 1986, 92 pp. Windows 1.03 SDK manuals. Cited by section; §10.8 (color), §8.5 (default button), §8.6 (button placement and disabled label), §8.11.1 (push-button height), §10.1 to §10.5 (cooperation), §12 (help). ↩
-
Microsoft, Windows Programming Guide, Windows 1.03 SDK, 1986. §7.3.1 and §7.3.3 (button styles,
BM_SETSTATE), §7.3.6 (push-button size), §7.4.2 (edit-control heights), §7.10.8 (dialog units), §7.10.11 ("Creating Pretty Dialog Borders"). The Programmer's Reference (document 050051053-103-101-1086) from the same set supplies theSTATICstyle table andCreateCaret. ↩↩↩ -
Microsoft, Microsoft Windows User's Guide, version 1.0, document 050050001-100-R00-0885, August 1985, 205 pp. Appendix A p. 140 (default
[colors]); pp. 4, 62, 74 (the flashing underscore); p. 164 (scroll bar glossary). ↩ -
Microsoft, Microsoft Windows User's Guide, version 2.0, document 050050001-200-R01-0887, August 1987, 298 pp. Appendix A p. 208 (
[colors]); pp. 24, 58, 91 (the dotted box); pp. 142 to 145 (fonts); pp. 150, 206 (BorderWidth). ↩ -
Microsoft Windows 1.01 SDK (November 1985),
WINDOWS.H:COLOR_*slots,OBM_*ordinals,WS_*styles,SM_*metrics, drawing functions. The 1.03 and 1.04 SDK headers are identical on every value cited. ↩ -
Microsoft Windows 2.03 SDK (January 1988),
INC/WINDOWS.H. ↩ -
Microsoft Windows 1.01 retail runtime (also the Runtime disk set of the Windows 1.01 SDK), display drivers
EGAHIRES.DRV,EGALORES.DRV,EGAMONO.DRV,EGAHIBW.DRV,HERCULES.DRV,CGA.DRV:OEMBINresource 1 (metrics and default palette),RT_BITMAPresources (theOBM_*chrome), andUSER.EXEandCONTROL.EXEresources (System menu, button strings, Screen Colors dialog), plus the shippedWIN.INI. ↩ -
Microsoft Windows 2.03 DDK (January 1988),
RESOURCE/<adapter>/COLOR.ASM,BLKWHITE.ASM,CONFIG.ASM,FONTS.ASMand the loose*.BMPchrome artwork;DRIVER/COLOR.ASMandBLKWHITE.ASMfor the commented-out pre-release palettes.COLOR.ASMheader: "Created: 06-Jan-1987. Author: Walt Moore [waltm]." ↩ -
Windows 1.01 retail runtime
HIFONTS.FONandLOFONTS.FON; Windows 2.03 DDKFONTS/SYS08CGA.FNT,SYS08EGA.FNT,SYS12VGA.FNT,SYSHIRES.FNT. Values read from theFONTINFOheaders. ↩ -
Microsoft Windows 3.0 SDK (May 1990),
VGA.DRV:RT_BITMAPids 32738 to 32767, compared row by row against the 1.01 art after reversing the DIB row order. ↩