#include #include"resource.h" /// 入力キー取得ウィンドウを閉じる時にキーコンフィグダイアログに送るメッセージ /// ( wParam , lParam には WM_KEYDOWN のそれが入る) #define WM_INPUT WM_APP typedef enum{MU=0,MD,ML,MR,KC,KEYNUM}KEY; /// キー操作定数 WPARAM Key[KEYNUM]={'E','X','A','F',VK_SPACE}; /// 操作キー HINSTANCE hInst; /// インスタンスハンドル /// 各種プロシージャ LRESULT CALLBACK KeyDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); LRESULT CALLBACK InputWindowProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; static POINT pt={100,100}; //円の中心座標 const int R=50; //円の半径 switch(uMsg) { case WM_DESTROY: PostQuitMessage(0); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); Ellipse(hdc,pt.x-R,pt.y-R,pt.x+R,pt.y+R); EndPaint(hWnd,&ps); return 0; case WM_KEYDOWN: if(wParam==Key[MU]) pt.y-=5; else if(wParam==Key[MD]) pt.y+=5; else if(wParam==Key[ML]) pt.x-=5; else if(wParam==Key[MR]) pt.x+=5; else if(wParam==Key[KC]) DialogBox(hInst,"KEY",hWnd,(DLGPROC)KeyDlgProc); else return 0; //関係ない入力 InvalidateRect(hWnd,NULL,TRUE); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } /// キーコンフィグダイアログボックスのプロシージャ LRESULT CALLBACK KeyDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { static KEY button; static WPARAM wp[KEYNUM]; static char tempKeyText[KEYNUM][32]; static char keyText[KEYNUM][32]={"E","X","A","F","Space"}; const char ope[KEYNUM][32]={"上移動","下移動","左移動","右移動","キーコンフィグ"}; const DWORD IDC[KEYNUM]={IDC_BMU,IDC_BMD,IDC_BML,IDC_BMR,IDC_BKC}; char str[64]; RECT rc; int i,k; switch(uMsg){ case WM_INITDIALOG: for(i=0;ilpCreateParams)); GetClientRect(hWnd,&rc); rc.top=50; paint=TRUE; SetTimer(hWnd,1,500,NULL); return 0; case WM_TIMER: paint=!paint; InvalidateRect(hWnd,NULL,TRUE); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); SetTextColor(hdc,RGB(0,255,0)); SetBkColor(hdc,RGB(0,0,0)); if(paint) wsprintf(str,"%s\n\n%s",params,explain); else strcpy(str,params); DrawText(hdc,str,-1,&rc,DT_CENTER); EndPaint(hWnd,&ps); /// ↓タスクバーの項目をクリックする事で return 0; /// ↓再び最前面になった場合はフォーカスを失っている case WM_WINDOWPOSCHANGED: SetForegroundWindow(hWnd); return 0; case WM_KEYDOWN: PostMessage(GetWindow(hWnd,GW_OWNER),WM_INPUT,wParam,lParam); KillTimer(hWnd,1); DestroyWindow(hWnd); return 0; } return DefWindowProc(hWnd,uMsg,wParam,lParam); } int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nCmdShow) { WNDCLASS wc; MSG msg; hInst=hInstance; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = __FILE__; if(!RegisterClass(&wc)) return 0; /// 入力キー取得ウィンドウ wc.lpfnWndProc = InputWindowProc; wc.lpszClassName = "Input"; wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); if(!RegisterClass(&wc)) return 0; HWND hWnd=CreateWindow( __FILE__,"キーコンフィグ", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInstance,NULL); if(hWnd==NULL) return 0; BOOL bRet; while((bRet=GetMessage(&msg,NULL,0,0))!=0){ if(bRet==-1) break; DispatchMessage(&msg); } return (int)msg.wParam; }