mirror of
https://github.com/reactos/reactos.git
synced 2024-08-30 15:18:33 +00:00
283 lines
4.9 KiB
C
283 lines
4.9 KiB
C
/* Copyright 1998 DJ Delorie <dj@delorie.com>
|
|
Distributed under the terms of the GNU GPL
|
|
http://www.delorie.com/store/hcalc/
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
|
|
#define STRICT
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
|
|
#include "hcalc.h"
|
|
|
|
#define WIDTH 125
|
|
#define HEIGHT 147
|
|
|
|
/*
|
|
** local vars
|
|
*/
|
|
static char szAppName[16];
|
|
static char szTitle[80];
|
|
static HINSTANCE hInst;
|
|
static HBITMAP face, chars, bits;
|
|
|
|
static int r=0, g=0, b=0;
|
|
static HWND window;
|
|
|
|
static char shown_offsets[15];
|
|
static int shown_bitmask;
|
|
static int show_bits;
|
|
|
|
#define CHARS_LEFT 6
|
|
#define CHARS_TOP 6
|
|
|
|
#define BITS_RIGHT 92
|
|
#define BITS_TOP 6
|
|
|
|
char charmap[] = " 0123456789ABCDEF-x,.ro+";
|
|
int char_to_x[256];
|
|
|
|
void
|
|
paint_bits(HDC dc, HDC bdc)
|
|
{
|
|
int i;
|
|
SelectObject(bdc, bits);
|
|
for (i=0; i<32; i++)
|
|
{
|
|
int b = (shown_bitmask >> i) & 1;
|
|
BitBlt(dc, BITS_RIGHT-2*i-3*(i/4), BITS_TOP, 1, 7,
|
|
bdc, b, 0, SRCCOPY);
|
|
}
|
|
|
|
}
|
|
|
|
void
|
|
paint_chars(HDC dc, HDC bdc)
|
|
{
|
|
int i;
|
|
SelectObject(bdc, chars);
|
|
for (i=0; i<15; i++)
|
|
{
|
|
BitBlt(dc, CHARS_LEFT+6*i, CHARS_TOP, 5, 7,
|
|
bdc, shown_offsets[i], 0, SRCCOPY);
|
|
}
|
|
}
|
|
|
|
int
|
|
paint()
|
|
{
|
|
PAINTSTRUCT paintstruct;
|
|
HDC dc = BeginPaint(window, &paintstruct);
|
|
HDC bdc = CreateCompatibleDC(dc);
|
|
SelectObject(bdc, face);
|
|
BitBlt(dc, 0, 0, WIDTH, HEIGHT, bdc, 0, 0, SRCCOPY);
|
|
|
|
if (show_bits)
|
|
paint_bits(dc, bdc);
|
|
else
|
|
paint_chars(dc, bdc);
|
|
|
|
DeleteDC(bdc);
|
|
EndPaint(window, &paintstruct);
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
redraw()
|
|
{
|
|
RECT r;
|
|
r.left = 0;
|
|
r.right = WIDTH-1;
|
|
r.top = 0;
|
|
r.bottom = HEIGHT-1;
|
|
InvalidateRect(window, &r, FALSE);
|
|
}
|
|
|
|
void
|
|
set_bits(int b)
|
|
{
|
|
shown_bitmask = b;
|
|
show_bits = 1;
|
|
redraw();
|
|
}
|
|
|
|
void
|
|
set_string(char *s)
|
|
{
|
|
char tmp[16];
|
|
int i;
|
|
sprintf(tmp, "%15.15s", s);
|
|
for (i=0; i<15; i++)
|
|
shown_offsets[i] = char_to_x[tmp[i]];
|
|
show_bits = 0;
|
|
redraw();
|
|
}
|
|
|
|
static int count=0;
|
|
static char tmp[100];
|
|
static char ctmp[20] = " ";
|
|
|
|
void
|
|
do_exit(int ec)
|
|
{
|
|
PostQuitMessage(ec);
|
|
}
|
|
|
|
/*
|
|
** Main Windows Proc
|
|
*/
|
|
LRESULT CALLBACK
|
|
WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
// int i;
|
|
// int lw = LOWORD(wParam);
|
|
// int hw = HIWORD(wParam);
|
|
// HWND w = (HWND)lParam;
|
|
|
|
window = hWnd;
|
|
|
|
switch (message)
|
|
{
|
|
case WM_DESTROY:
|
|
PostQuitMessage(0);
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
return paint();
|
|
|
|
case WM_LBUTTONDOWN:
|
|
#if 0
|
|
count++;
|
|
wsprintf(tmp, "%3d %3d", LOWORD(lParam), HIWORD(lParam));
|
|
set_string(tmp);
|
|
#else
|
|
button(1, LOWORD(lParam), HIWORD(lParam));
|
|
#endif
|
|
break;
|
|
|
|
case WM_RBUTTONDOWN:
|
|
#if 0
|
|
count++;
|
|
set_bits(count);
|
|
#else
|
|
button(2, LOWORD(lParam), HIWORD(lParam));
|
|
#endif
|
|
break;
|
|
|
|
case WM_CHAR:
|
|
#if 0
|
|
for (i=0; i<20; i++)
|
|
ctmp[i] = ctmp[i+1];
|
|
ctmp[14] = wParam;
|
|
ctmp[15] = 0;
|
|
set_string(ctmp);
|
|
#else
|
|
key(wParam);
|
|
#endif
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
|
|
} /* switch message */
|
|
|
|
return DefWindowProc (hWnd, message, wParam, lParam);
|
|
}
|
|
|
|
/*
|
|
** register class
|
|
*/
|
|
static BOOL
|
|
InitApplication(HINSTANCE hInstance, int nCmdShow)
|
|
{
|
|
int i, style;
|
|
WNDCLASS wc;
|
|
HWND hWnd;
|
|
RECT size;
|
|
|
|
LoadString(hInstance, IDS_APPNAME, szAppName, sizeof(szAppName));
|
|
LoadString(hInstance, IDS_DESCRIPTION, szTitle, sizeof(szTitle));
|
|
|
|
hInst = hInstance;
|
|
|
|
wc.style = CS_HREDRAW | CS_VREDRAW;
|
|
wc.lpfnWndProc = (WNDPROC)WndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hInstance = hInstance;
|
|
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
|
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
|
wc.lpszMenuName = NULL;
|
|
wc.lpszClassName = szAppName;
|
|
|
|
if (RegisterClass(&wc) == 0)
|
|
return FALSE;
|
|
|
|
style = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX;
|
|
|
|
size.left = 0;
|
|
size.top = 0;
|
|
size.right = WIDTH-3;
|
|
size.bottom = HEIGHT-3;
|
|
AdjustWindowRect(&size, style, 0);
|
|
|
|
hWnd = CreateWindowEx(WS_EX_TOPMOST,
|
|
szAppName,
|
|
szTitle,
|
|
style,
|
|
CW_USEDEFAULT, 0,
|
|
size.right-size.left, size.bottom-size.top,
|
|
NULL,
|
|
NULL,
|
|
hInstance,
|
|
NULL
|
|
);
|
|
|
|
if (hWnd == NULL)
|
|
return FALSE;
|
|
|
|
face = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_FACE));
|
|
chars = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_CHARS));
|
|
bits = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITS));
|
|
|
|
for (i=0; i<256; i++)
|
|
char_to_x[i] = 0;
|
|
for (i=0; charmap[i]; i++)
|
|
char_to_x[charmap[i]] = i*6;
|
|
|
|
window = hWnd;
|
|
|
|
ShowWindow(hWnd, nCmdShow);
|
|
UpdateWindow(hWnd);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
** Main entry
|
|
*/
|
|
int WINAPI
|
|
WinMain(HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance,
|
|
LPSTR lpszCmdLine,
|
|
int nCmdShow)
|
|
{
|
|
MSG msg;
|
|
HANDLE hAccelTable;
|
|
|
|
if (!InitApplication(hInstance, nCmdShow))
|
|
return FALSE;
|
|
|
|
hAccelTable = LoadAccelerators(hInstance, szAppName);
|
|
|
|
while( GetMessage(&msg, NULL, 0, 0))
|
|
if (!TranslateAccelerator (msg.hwnd, hAccelTable, &msg))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
return msg.wParam;
|
|
}
|