#include <windows.h>
//関数の宣言
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE,int,LPTSTR);
void Create();
void Paint();
void Destroy();
HFONT CreateFont(LPTSTR,int,int);
void SetColor(int,int,int);
void DrawString(LPTSTR,int,int);
void FillRect(int,int,int,int);
//変数の宣言
HDC hdc; //デバイスコンテキスト
HFONT hFont; //フォント
HGDIOBJ hPen; //ペン
HGDIOBJ hBrush; //ブラシ
RECT clientRect; //クライアント領域
BOOL keyFlag[256];//キー
//メイン
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,int nShowCmd) {
MSG msg;
BOOL bRet;
//ウィンドウの生成
if (!InitApp(hInstance)) return FALSE;
if (!InitInstance(hInstance,nShowCmd,
_T("KeyEx"))) return FALSE;
//メインループ
while((bRet=GetMessage(&msg,NULL,0,0))!=0) {
if (bRet==-1) {
break;
} else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
//ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst) {
WNDCLASSW wc;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInst;
wc.hIcon=NULL;
wc.hCursor=NULL;
wc.hbrBackground=(HBRUSH)COLOR_WINDOW;
wc.lpszMenuName=NULL;
wc.lpszClassName=_T("win01");
return (RegisterClassW(&wc));
}
//ウィンドウの生成
BOOL InitInstance(HINSTANCE hInst,int nShowCmd,
LPTSTR title) {
HWND hWnd;
hWnd=CreateWindowW(_T("win01"),title,
WS_CLIPCHILDREN,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInst,
NULL);
if (!hWnd) return FALSE;
ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);
return TRUE;
}
//ウィンドウのイベント処理
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp) {
PAINTSTRUCT ps;
HGDIOBJ hFontOld;
HGDIOBJ hPenOld;
HGDIOBJ hBrushOld;
switch (msg){
//生成
case WM_CREATE:
Create();
break;
//描画
case WM_PAINT:
//前処理
GetClientRect(hWnd,&clientRect);
hdc=BeginPaint(hWnd,&ps);
hFontOld=SelectObject(hdc,hFont);
hPen=CreatePen(PS_SOLID,1,RGB(0,0,0));
hPenOld=SelectObject(hdc,hPen);
hBrush=CreateSolidBrush(RGB(0,0,0));
hBrushOld=SelectObject(hdc,hBrush);
//描画
Paint();
//後処理
SelectObject(hdc,hFontOld);
SelectObject(hdc,hPenOld);
SelectObject(hdc,hBrushOld);
DeleteObject(hPen);
DeleteObject(hBrush);
EndPaint(hWnd,&ps);
break;
//キーダウン
case WM_KEYDOWN:
keyFlag[wp]=1;
InvalidateRect(hWnd,NULL,FALSE);
break;
//キーアップ
case WM_KEYUP:
keyFlag[wp]=0;
InvalidateRect(hWnd,NULL,FALSE);
break;
//破棄
case WM_DESTROY:
Destroy();
PostQuitMessage(0);
break;
//その他
default:
return (DefWindowProc(hWnd,msg,wp,lp));
}
return 0;
}
//生成
void Create() {
//フォントの生成
hFont=CreateFont(_T("MS ゴシック"),0,24);
}
//描画
void Paint() {
//背景の描画
SetColor(255,255,255);
FillRect(0,0,clientRect.right,clientRect.bottom);
//文字列の描画
SetColor(0,0,0);
DrawString(_T("KeyEx>"),0,0);
if (keyFlag[VK_UP]) DrawString(_T("上"),0,24*1);
if (keyFlag[VK_DOWN]) DrawString(_T("下"),0,24*2);
if (keyFlag[VK_LEFT]) DrawString(_T("左"),0,24*3);
if (keyFlag[VK_RIGHT]) DrawString(_T("右"),0,24*4);
}
//破棄
void Destroy() {
//フォントの解放
DeleteObject(hFont);
}
//フォントの生成
HFONT CreateFont(LPTSTR fontName,int w,int h) {
LOGFONT font;
font.lfWidth =w;
font.lfHeight =h;
font.lfEscapement =0;
font.lfOrientation =0;
font.lfWeight =0;
font.lfItalic =FALSE;
font.lfUnderline =FALSE;
font.lfStrikeOut =FALSE;
font.lfCharSet =SHIFTJIS_CHARSET;
font.lfOutPrecision =OUT_DEFAULT_PRECIS;
font.lfClipPrecision =CLIP_DEFAULT_PRECIS;
font.lfQuality =ANTIALIASED_QUALITY;
font.lfPitchAndFamily=FIXED_PITCH|FF_MODERN;
StringCchCopy(font.lfFaceName,32,fontName);
return CreateFontIndirect(&font);
}
//色の指定
void SetColor(int r,int g,int b) {
//テキスト色の指定
SetTextColor(hdc,RGB(r,g,b));
//ペンとブラシの解放
DeleteObject(hPen);
DeleteObject(hBrush);
//ペンとブラシの生成
hPen=CreatePen(PS_SOLID,1,RGB(r,g,b));
SelectObject(hdc,hPen);
hBrush=CreateSolidBrush(RGB(r,g,b));
SelectObject(hdc,hBrush);
}
//文字列の描画
void DrawString(LPTSTR str,int x,int y) {
size_t size;
StringCchLength(str,STRSAFE_MAX_CCH,&size);
ExtTextOut(hdc,x,y,NULL,NULL,str,size,NULL);
}
//矩形の塗り潰し
void FillRect(int x,int y,int w,int h) {
Rectangle(hdc,x,y,x+w,y+h);
} |