195 lines
4.2 KiB
C
195 lines
4.2 KiB
C
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include "keyboard.hpp"
|
|
|
|
HBITMAP ghbm;
|
|
|
|
BOOL OnCreate(HWND hwnd)
|
|
{
|
|
ghbm = (HBITMAP) LoadImage (0, "./tastatur.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL OnDestroy(HWND hwnd)
|
|
{
|
|
DeleteObject(ghbm);
|
|
PostQuitMessage(0);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL OnPaint(HWND hwnd)
|
|
{
|
|
PAINTSTRUCT ps;
|
|
HDC hdc = BeginPaint(hwnd,&ps);
|
|
HDC hdcMem = CreateCompatibleDC(NULL);
|
|
HBITMAP hbmT = SelectBitmap(hdcMem,ghbm);
|
|
BITMAP bm;
|
|
GetObject(ghbm,sizeof(bm),&bm);
|
|
BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,hdcMem,0,0,SRCCOPY);
|
|
SelectBitmap(hdcMem,hbmT);
|
|
DeleteDC(hdcMem);
|
|
EndPaint(hwnd,&ps);
|
|
return TRUE;
|
|
}
|
|
|
|
void HandleButton(int x,int y);
|
|
void HandleButtonDown(int x,int y);
|
|
void HandleButtonUp();
|
|
LRESULT CALLBACK KeyboardWindowProc( HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
|
|
{
|
|
static int x,y;
|
|
switch(uMsg)
|
|
{
|
|
case WM_CREATE:return OnCreate(hwnd);
|
|
case WM_DESTROY:return OnDestroy(hwnd);
|
|
case WM_PAINT:return OnPaint(hwnd);
|
|
case WM_MOUSEMOVE:x = LOWORD(lParam);y = HIWORD(lParam);return TRUE;
|
|
case WM_LBUTTONDOWN:HandleButtonDown(x,y);return TRUE;
|
|
case WM_LBUTTONUP:HandleButtonUp();return TRUE;
|
|
case WM_SIZE:return TRUE;
|
|
default:return DefWindowProc(hwnd,uMsg,wParam,lParam);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void KeyboardRegisterClass()
|
|
{
|
|
WNDCLASS wc = {0,KeyboardWindowProc,0,0, NULL,
|
|
LoadIcon(NULL,IDI_APPLICATION),
|
|
LoadCursor(NULL,IDC_ARROW),
|
|
(HBRUSH)(COLOR_WINDOW+1),
|
|
NULL,
|
|
"Keyboard" };
|
|
RegisterClass(&wc);
|
|
}
|
|
|
|
|
|
DWORD __stdcall KeyboardFunc(void *p)
|
|
{
|
|
HWND hwnd;
|
|
MSG msg;
|
|
KeyboardRegisterClass();
|
|
|
|
hwnd = CreateWindowA("Keyboard","Keyboard",WS_OVERLAPPED,500,0,CW_USEDEFAULT,0,HWND_DESKTOP,NULL,NULL,NULL);
|
|
|
|
ShowWindow(hwnd,SW_SHOW);
|
|
SetWindowPos(hwnd,HWND_TOP,0,0,260+8,362+23+4 ,SWP_NOMOVE);
|
|
UpdateWindow(hwnd);
|
|
|
|
|
|
while(GetMessage(&msg,0,0,0))
|
|
{
|
|
TranslateMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
return msg.wParam;
|
|
}
|
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
|
#define L_OFFSET 3
|
|
#define ROWS1_WIDTH 36
|
|
#define ROWS1_GRID 43
|
|
#define ROWS1_COUNT 5
|
|
#define ROWS1_HEIGHT 22
|
|
//const int giRows1[ROWS1_COUNT]={8,47,84,121,158};
|
|
#define ROWS2_WIDTH 44
|
|
#define ROWS2_GRID 52
|
|
#define ROWS2_COUNT 4
|
|
#define ROWS2_HEIGHT 22
|
|
//const int giRows2[ROWS2_COUNT]={199,243,287,331};
|
|
#define ROWS_COUNT (ROWS1_COUNT+ROWS2_COUNT)
|
|
#define ROWS_HEIGHT 22
|
|
const int giRows[ROWS1_COUNT+ROWS2_COUNT]={8,47,84,121,158,199,243,287,331};
|
|
//extra arrows
|
|
const int giUp[2]={218,50};
|
|
const int giDown[2]={218,93};
|
|
const int giLeft[2]={189,70};
|
|
const int giRight[2]={245,70};
|
|
#define ARROW_HWIDTH (ROWS1_HEIGHT >>1)
|
|
#define ARROW_HHEIGHT (ROWS_HEIGHT >>1)
|
|
static int IsArrow(const int *pi,int x,int y)
|
|
{
|
|
if(x<(pi[0]-ARROW_HWIDTH))return 0;
|
|
if(x>(pi[0]+ARROW_HWIDTH))return 0;
|
|
if(y<(pi[1]-ARROW_HHEIGHT))return 0;
|
|
if(y>(pi[1]+ARROW_HHEIGHT))return 0;
|
|
return 1;
|
|
|
|
}
|
|
|
|
int FindButton(int x,int y)
|
|
{
|
|
int i,iRow=-1,iCol;
|
|
|
|
if(IsArrow(giUp ,x,y))return KEY_PRGM_UP;
|
|
if(IsArrow(giDown ,x,y))return KEY_PRGM_DOWN;
|
|
if(IsArrow(giLeft ,x,y))return KEY_PRGM_LEFT;
|
|
if(IsArrow(giRight,x,y))return KEY_PRGM_RIGHT;
|
|
x -= L_OFFSET;
|
|
if(x< 0) return KEY_PRGM_NONE;
|
|
for(i=0;i<ROWS_COUNT;i++)
|
|
{
|
|
if((y >= giRows[i]) && (y <= giRows[i]+ ROWS_HEIGHT))
|
|
{
|
|
iRow = i;
|
|
break;
|
|
}
|
|
}
|
|
if(iRow == -1)return KEY_PRGM_NONE;
|
|
|
|
if(iRow < ROWS1_COUNT)
|
|
{
|
|
if((x % ROWS1_GRID) > ROWS1_WIDTH)return KEY_PRGM_NONE;
|
|
iCol = x / ROWS1_GRID;
|
|
}
|
|
else
|
|
{
|
|
if((x % ROWS2_GRID) > ROWS2_WIDTH)return KEY_PRGM_NONE;
|
|
iCol = x / ROWS2_GRID;
|
|
}
|
|
|
|
iRow = 9-iRow;
|
|
iCol = 7 - iCol;
|
|
i = iRow + 10*iCol;
|
|
switch(i)
|
|
{
|
|
case KEY_PRGM_LEFT:
|
|
case KEY_PRGM_RIGHT:
|
|
case KEY_PRGM_UP:
|
|
case KEY_PRGM_DOWN:
|
|
return KEY_PRGM_NONE;
|
|
case 34:
|
|
i = KEY_PRGM_ACON;
|
|
}
|
|
|
|
return i;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
KeyHandler(int iKey);
|
|
void HandleButton(int x,int y)
|
|
{
|
|
int iKey = FindButton(x,y);
|
|
if(iKey)
|
|
{
|
|
KeyHandler(iKey);
|
|
}
|
|
}
|
|
|
|
int iKeyDown = 0;
|
|
void HandleButtonDown(int x,int y)
|
|
{
|
|
iKeyDown = FindButton(x,y);
|
|
|
|
}
|
|
|
|
void HandleButtonUp()
|
|
{
|
|
iKeyDown = 0;
|
|
|
|
}
|