windows-nt/Source/XPSP1/NT/multimedia/media/test/sbtest/inst.c
2020-09-26 16:20:57 +08:00

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;
}