ラスタースクロールプログラミング その2 の続きです。
とうとう7行コーディングを達成 しました~♪
(※ 2ちゃんねるに掲載されていた元コードのままでは、VC++2005でコンパイルエラーが発生した為、コンパイルが通る様、若干修正を加えてあります^^;)
#include <windows.h>
#include <math.h>
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){HDC d,e;int x=GetSystemMetrics(
0),y=GetSystemMetrics(1),n,f;d=GetDC(0);SelectObject(e=CreateCompatibleDC(d),
CreateCompatibleBitmap(d,x,y));BitBlt(e,0,0,x,y,d,0,0,SRCCOPY);while(!(
GetKeyState(1)&(1<<31))){for(n=0;n<y;n++)BitBlt(d,sin((n)*3.0/y)*sin((f++)/
40.0)*60,n,x,1,e,0,n,SRCCOPY);Sleep(1);}InvalidateRect(0,0,1);return 0;}
適当にインデント・改行を入れて、見やすくしたものがこちら↓
#include <windows.h>
#include <math.h>
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HDC d, e;
int x = GetSystemMetrics(0),
y = GetSystemMetrics(1),
n,
f;
d = GetDC(0);
SelectObject(
e = CreateCompatibleDC(d),
CreateCompatibleBitmap(d,x,y)
);
BitBlt(e, 0, 0, x, y, d, 0, 0, SRCCOPY);
while (! (GetKeyState(1)&(1<<31)) ) {
for (n = 0; n < y; n++)
BitBlt(d, sin((n) * 3.0/y) * sin((f++) / 40.0) * 60, n, x, 1, e, 0, n, SRCCOPY);
Sleep(1);
}
InvalidateRect(0,0,1);
return 0;
}
ウィンドウを作成せず、デスクトップDCにそのまま描画してしまう方法です。
whileループ内で、
GetKeyState()の戻り値と 「1 << 31」をAnd演算する事により、GetKeyState()の戻り値の最上位bitを取得 します。
これがfalseの間、つまり、キーが押されていない間デスクトップDCに描画を行います。
最後に InvalidateRect(NULL, NULL, TRUE)で描画のお掃除をして、処理終了♪
チャンチャン \(* ̄(エ) ̄*)/