#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);
}
|