▼Windows Mobileプログラミングメモ▼
キーイベントの処理

押した上下左右キーの表示を行うプログラムを作成する。



ソースコードの作成
  1. ソースコードを以下のように編集。
    main.cpp
    #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);
    }          



−戻る−