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

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


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


ダイアログの準備
  1. ソリューションエクスプローラのリソースファイルを右クリックし、ポップアップ「追加→リソース」を選択。
  2. Dialogをダブルクリックし、ダイアログ(IDD_DIALOG1)を生成。
  3. OKボタン(IDOK)とキャンセルボタン(IDCANCEL)を削除。
  4. ツールボックスの「Picture Control」をダイアログに配置。
  5. Picture ControlのIDを"IDC_STATIC1"に変更。
ソースコードの作成
  1. ソースコードを以下のように編集。
    main.cpp
    #include <windows.h>
    #include <windowsx.h>
    #include "resource.h"
    #include <aygshell.h> 
    #pragma comment(lib,"aygshell.lib")
    
    #define TIMER_ID     100 //タイマの識別ID
    #define TIMER_ELAPSE 100 //WM_TIMERの発生間隔
    
    //システム関数の宣言
    BOOL DlgProc(HWND,UINT,WPARAM,LPARAM);
    BOOL GetWorkArea(int*,int*,int*,int*);
    void Create();
    void Paint();
    void Destroy();
    
    //システム変数の宣言
    HWND hDlg   =NULL;
    int  screenW=0;
    int  screenH=0;
    
    //ビットマップ
    int bmpX=160; 
    int bmpY=160; 
    int bmpVX=10;
    int bmpVY=10;
    
    //メイン
    int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
        LPWSTR lpCmdLine,int nShowCmd) {
        //ダイアログの生成
        DialogBoxW(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DlgProc);
        return 0;
    }
    
    //ダイアログのイベント処理
    BOOL DlgProc(HWND hDialog,UINT uMsg,WPARAM wp,LPARAM lp) {
        switch(uMsg) {
        //初期化
        case WM_INITDIALOG:
            {
            //インスタンスの保持
            hDlg=hDialog;
    
            //ダイアログの設定
            SHINITDLGINFO sidi={
                SHIDIM_FLAGS,hDlg,
                SHIDIF_DONEBUTTON|SHIDIF_SIZEDLGFULLSCREEN|SHIDIF_EMPTYMENU};
            SHInitDialog(&sidi);
    
            //生成
            Create();
            
            //描画処理
            Paint();
            }
            break;
        //タイマーイベント
        case WM_TIMER:
            if (wp==TIMER_ID) {
                //移動
                if (bmpX<0 || screenW<bmpX) bmpVX=-bmpVX;
                if (bmpY<0 || screenH<bmpY) bmpVY=-bmpVY;
                bmpX+=bmpVX;
                bmpY+=bmpVY;
    
                //再描画
                Paint();
            } else {
                return (DefWindowProc(hDlg,uMsg,wp,lp));
            }
            break;
        //コマンド
        case WM_COMMAND:
            switch(LOWORD(wp)) {
            //OKボタン
            case IDOK:
                EndDialog(hDlg,LOWORD(wp));
                break;
            }
            break;
        //クローズ
        case WM_CLOSE:
            //解放
            Destroy();
            DestroyWindow(hDlg);
            break;
        }
        return FALSE;
    }
    
    //ワークエリアの計算
    BOOL GetWorkArea(int *x,int *y,int *w,int *h) {
        SIPINFO si={sizeof(SIPINFO)};
        if (!SipGetInfo(&si)) return FALSE;
        *x=si.rcVisibleDesktop.left;
        *y=si.rcVisibleDesktop.top;
        *w=si.rcVisibleDesktop.right-*x;
        if (si.fdwFlags&SIPF_ON) {
            *h=si.rcSipRect.top-*y;
        } else {
            *h=si.rcSipRect.bottom-*y;
        }
        return TRUE;
    }
    
    //生成
    void Create() {
        //ワークエリアの計算
        int x,y;
        GetWorkArea(&x,&y,&screenW,&screenH);
    
        //タイマーの生成
        SetTimer(hDlg,TIMER_ID,TIMER_ELAPSE,NULL);
    }
    
    //描画
    void Paint() {
        //ピクチャの配置
        MoveWindow(GetDlgItem(hDlg,IDC_STATIC1),
            bmpX-57,bmpY-57,114,114,FALSE);
    }
    
    //解放
    void Destroy() {
        //タイマーの破棄
        KillTimer(hDlg,TIMER_ID);
    }
    



−戻る−