171 lines
4.4 KiB
C
171 lines
4.4 KiB
C
/****************************************************************************
|
|
*
|
|
* inst.c
|
|
*
|
|
* Copyright (c) 1991 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#include <windows.h>
|
|
#include <mmsystem.h>
|
|
#include "wincom.h"
|
|
#include "sbtest.h"
|
|
|
|
/****************************************************************************
|
|
*
|
|
* public data
|
|
*
|
|
***************************************************************************/
|
|
|
|
HWND hInstWnd;
|
|
BYTE bInstrument = 0;
|
|
|
|
/****************************************************************************
|
|
*
|
|
* local data
|
|
*
|
|
***************************************************************************/
|
|
|
|
static int width;
|
|
static int height;
|
|
static TEXTMETRIC tm;
|
|
|
|
/****************************************************************************
|
|
*
|
|
* internal function prototypes
|
|
*
|
|
***************************************************************************/
|
|
|
|
static void Paint(HWND hWnd, HDC hDC);
|
|
|
|
void CreateInstrument(HWND hWnd)
|
|
{
|
|
HDC hDC;
|
|
POINT pt;
|
|
int w, h;
|
|
|
|
hDC = GetDC(hWnd);
|
|
GetTextMetrics(hDC, &tm);
|
|
ReleaseDC(hWnd, hDC);
|
|
|
|
w = tm.tmMaxCharWidth * 3;
|
|
h = tm.tmHeight + tm.tmExternalLeading;
|
|
width = w * 8;
|
|
height = h * 16;
|
|
GetCursorPos(&pt);
|
|
|
|
hInstWnd = CreateWindow("SELECTOR",
|
|
"Instrument",
|
|
WS_POPUP | WS_CAPTION | WS_VISIBLE | WS_SYSMENU,
|
|
pt.x, pt.y,
|
|
width,
|
|
height + GetSystemMetrics(SM_CYCAPTION),
|
|
hWnd,
|
|
NULL,
|
|
ghInst,
|
|
NULL);
|
|
|
|
}
|
|
|
|
static void Paint(HWND hWnd, HDC hDC)
|
|
{
|
|
int x, y;
|
|
char szVal[20];
|
|
RECT rect;
|
|
|
|
for (y = 0; y < 16; y++) {
|
|
for (x = 0; x < 8; x++) {
|
|
wsprintf(szVal, "%d", y * 8 + x + gInstBase);
|
|
TextOut(hDC,
|
|
width * x / 8 + tm.tmMaxCharWidth / 2,
|
|
height * y / 16,
|
|
szVal,
|
|
lstrlen(szVal));
|
|
|
|
}
|
|
}
|
|
for (y = 0; y < 16; y++) {
|
|
MoveToEx(hDC, 0, height * y / 16, NULL);
|
|
LineTo(hDC, width, height * y / 16);
|
|
}
|
|
for (x = 0; x < 8; x++) {
|
|
MoveToEx(hDC, width * x / 8, 0, NULL);
|
|
LineTo(hDC, width * x / 8, height);
|
|
}
|
|
|
|
rect.left = ((bInstrument % 8) * (width / 8)) + 1;
|
|
rect.right = rect.left + (width / 8) - 1;
|
|
rect.top = ((bInstrument / 8) * (height / 16)) + 1;
|
|
rect.bottom = rect.top + (height / 16) - 1;
|
|
InvertRect(hDC, &rect);
|
|
}
|
|
|
|
long FAR PASCAL InstWndProc(HWND hWnd, unsigned message, UINT wParam, LONG lParam)
|
|
{
|
|
PAINTSTRUCT ps; // paint structure
|
|
int x, y;
|
|
SHORTMSG sm;
|
|
HMENU hMenu;
|
|
RECT rect;
|
|
|
|
// process any messages we want
|
|
|
|
switch (message) {
|
|
|
|
case WM_CREATE:
|
|
hMenu = GetMenu(hMainWnd);
|
|
CheckMenuItem(hMenu, IDM_INSTRUMENT, MF_CHECKED);
|
|
break;
|
|
|
|
case WM_LBUTTONDOWN:
|
|
// revert old patch
|
|
rect.left = ((bInstrument % 8) * (width / 8)) + 1;
|
|
rect.right = rect.left + (width / 8) - 1;
|
|
rect.top = ((bInstrument / 8) * (height / 16)) + 1;
|
|
rect.bottom = rect.top + (height / 16) - 1;
|
|
InvalidateRect(hWnd, &rect, TRUE);
|
|
|
|
// calculate new patch
|
|
x = LOWORD(lParam) * 8 / width;
|
|
y = HIWORD(lParam) * 16 / height;
|
|
bInstrument = (BYTE) y * 8 + x;
|
|
sm.b[0] = (BYTE) 0xC0 + bChannel;
|
|
sm.b[1] = bInstrument;
|
|
|
|
// invert new patch
|
|
rect.left = ((bInstrument % 8) * (width / 8)) + 1;
|
|
rect.right = rect.left + (width / 8) - 1;
|
|
rect.top = ((bInstrument / 8) * (height / 16)) + 1;
|
|
rect.bottom = rect.top + (height / 16) - 1;
|
|
InvalidateRect(hWnd, &rect, TRUE);
|
|
|
|
// send patch change message
|
|
if (hMidiOut) {
|
|
midiOutShortMsg(hMidiOut, sm.dw);
|
|
if (ISBITSET(fDebug, DEBUG_PATCH))
|
|
sprintf(ach, "\nPatch Change to %d on Channel %d",
|
|
bInstrument, bChannel);
|
|
dbgOut;
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
BeginPaint(hWnd, &ps);
|
|
Paint(hWnd, ps.hdc);
|
|
EndPaint(hWnd, &ps);
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
hMenu = GetMenu(hMainWnd);
|
|
CheckMenuItem(hMenu, IDM_INSTRUMENT, MF_UNCHECKED);
|
|
hInstWnd = NULL;
|
|
break;
|
|
|
|
default:
|
|
return DefWindowProc(hWnd, message, wParam, lParam);
|
|
break;
|
|
}
|
|
return NULL;
|
|
}
|