▼Windows Mobileプログラミングメモ▼
タイマーの利用

タイマーを利用するプログラムを作成する。


リソースの準備
  1. ソリューションエクスプローラのリソースファイルを右クリックし、ポップアップ「追加→リソース」を選択。
  2. インポートボタンを押し、以下の画像を追加。
IDB_BITMAP1



ソースコードの作成
  1. ソースコードを以下のように編集。
    main.cpp
    #include <windows.h>
    #include "resource.h"
    
    //定数の宣言
    #define TIMER_ID     100 //タイマの識別ID
    #define TIMER_ELAPSE 100 //WM_TIMERの発生間隔
    
    //関数の宣言
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    ATOM InitApp(HINSTANCE);
    BOOL InitInstance(HINSTANCE,int,LPTSTR);
    void Create(HWND hWnd);
    void Paint(HWND hWnd);
    void Destroy(HWND hWnd);
    void SetColor(int,int,int);
    void FillRect(int,int,int,int);
    void DrawImage(HBITMAP hBmp,int x,int y); 
    
    //変数の宣言
    HINSTANCE ghInst;    //インスタンス
    HGDIOBJ   hPen;      //ペン
    HGDIOBJ   hBrush;    //ブラシ
    HDC       hMdc;      //メモリDC
    HDC       hBdc;      //バッファDC
    HBITMAP   hBBmp;     //バッファBMP
    RECT      clientRect;//クライアント領域
    
    //ビットマップ
    HBITMAP hBmp; //ビットマップ
    int     bmpX; //ビットマップX座標
    int     bmpY; //ビットマップY座標
    int     bmpVX;//ビットマップX速度
    int     bmpVY;//ビットマップY速度
    
    //メイン
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
        LPWSTR lpCmdLine,int nShowCmd) {
        MSG msg;
        BOOL bRet;
    
        //インスタンスの保持
        ghInst=hInstance;
    
        //ウィンドウの生成
        if (!InitApp(hInstance)) return FALSE;
        if (!InitInstance(hInstance,nShowCmd,
            _T("TimerEx"))) 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;
        HDC hdc;
    
        switch (msg){
        //生成
        case WM_CREATE: 
            GetClientRect(hWnd,&clientRect);
            Create(hWnd);
            break;
        //描画
        case WM_PAINT:
            //前処理
            hdc=BeginPaint(hWnd,&ps);
            hMdc=CreateCompatibleDC(hBdc);
    
            //描画
            Paint(hWnd);
            SelectObject(hdc,hBBmp);
            BitBlt(hdc,0,0,clientRect.right,
                clientRect.bottom,hBdc,0,0,SRCCOPY);
    
            //後処理
            DeleteDC(hMdc);
            EndPaint(hWnd,&ps);
            break;
        //タイマーイベント
        case WM_TIMER:
            if (wp==TIMER_ID) {
                //移動
                if (bmpX<0 || clientRect.right<bmpX) bmpVX=-bmpVX;
                if (bmpY<0 || clientRect.bottom<bmpY) bmpVY=-bmpVY;
                bmpX+=bmpVX;
                bmpY+=bmpVY;
    
                //再描画
                InvalidateRect(hWnd,NULL,FALSE);
            } else {
                return (DefWindowProc(hWnd,msg,wp,lp));
            }
            return 0;
    
        //破棄
        case WM_DESTROY:
            Destroy(hWnd);
            PostQuitMessage(0);
            break;
        //その他
        default:
            return (DefWindowProc(hWnd,msg,wp,lp));
        }
        return 0;
    }
    
    //生成
    void Create(HWND hWnd) {
        PAINTSTRUCT ps;
        HDC hdc;
    
        //ダブルバッファの生成
        hdc=BeginPaint(hWnd,&ps);
        hBdc=CreateCompatibleDC(hdc);
        hBBmp=CreateCompatibleBitmap(hdc,
            clientRect.right,clientRect.bottom);
        SelectObject(hBdc,hBBmp);
        EndPaint(hWnd,&ps);
    
        //ビットマップの読み込み
        hBmp=LoadBitmap(ghInst,MAKEINTRESOURCE(IDB_BITMAP1));
    
        //ビットマップの位置
        bmpX=120;
        bmpY=120;
        bmpVX=10;
        bmpVY=10;
    
        //タイマーの生成
        SetTimer(hWnd,TIMER_ID,TIMER_ELAPSE,NULL);
    }
    
    //描画
    void Paint(HWND hWnd) {
        //背景の描画
        SetColor(255,255,255);
        FillRect(0,0,clientRect.right,clientRect.bottom);
    
        //イメージの描画
        DrawImage(hBmp,bmpX-57,bmpY-57);
    }
    
    //破棄
    void Destroy(HWND hWnd) {
        //ダブルバッファの解放
        DeleteDC(hBdc);
        DeleteObject(hBBmp);
    
        //ビットマップの破棄
        DeleteObject(hBmp);
    
        //タイマーの破棄
        KillTimer(hWnd,TIMER_ID);
    }
    
    //色の指定
    void SetColor(int r,int g,int b) {
        //ペンとブラシの解放
        DeleteObject(hPen);
        DeleteObject(hBrush);
    
        //ペンとブラシの生成
        hPen=CreatePen(PS_SOLID,1,RGB(r,g,b));
        SelectObject(hBdc,hPen);
        hBrush=CreateSolidBrush(RGB(r,g,b));
        SelectObject(hBdc,hBrush);
    }
    
    //矩形の塗り潰し
    void FillRect(int x,int y,int w,int h) {
        Rectangle(hBdc,x,y,x+w,y+h);
    }
    
    //イメージの描画
    void DrawImage(HBITMAP hBmp,int x,int y) {
        BITMAP info;
        GetObject(hBmp,sizeof(BITMAP),&info);
        SelectObject(hMdc,hBmp);
        BitBlt(hBdc,x,y,info.bmWidth,info.bmHeight,hMdc,0,0,SRCCOPY);
    }
    



−戻る−