ラスタースクロールのプログラミングです^^;)
#include <windows.h>
#include <math.h>
HDC v,d,e;HWND g;int n,f,t[10]={40,0,0,1572865},m[8];int WINAPI WinMain(
HINSTANCE i,HINSTANCE,LPSTR,int){t[1]=GetSystemMetrics(0);t[2]=GetSystemMetrics
(1);WNDCLASS w={67,DefWindowProc,0,0,i,0,0,0,0,"T"};RegisterClass(&w);v=GetDC(
g=CreateWindow("T",0,WS_VISIBLE|WS_POPUP,0,0,t[1],t[2],0,0,i,0));d=GetDC(0);
SelectObject(e=CreateCompatibleDC(d),CreateCompatibleBitmap(d,t[1],t[2]));
BitBlt(e,0,0,t[1],t[2],d,0,0,SRCCOPY);while(GetMessage((MSG*)m,g,0,0)!=-1){if
(m[1]==15)for(n=0;n<t[2];n++)BitBlt(v,sin(n*3.0/t[2])*sin((f++)/40.0)*60,n,t[1
],1,e,0,n,SRCCOPY);DispatchMessage((MSG*)m);InvalidateRect(g,0,0);}return 0;}
さっそくコンパイルして実行してみましょう~♪
[幾つか注意点があります。(〃▽〃)キャー ]
※ 2ちゃんねるに掲載されていた元コードのままでは、VC++2005でコンパイルエラーが発生した為、コンパイルが通る様、若干修正を加えてあります^^;)
※ VC++2005では、構成プロパティ - 全般 - 文字セット を「マルチバイト文字セットを使用する」に設定しないと、おそらくコンパイルエラーが発生します。
※ また、「warning C4244: '引数' : 'double' から 'int' への変換です。データが失われる可能性があります。」といった警告が表示されますが、無視しちゃいましょう^^;)
--------------------
実行結果は以下の通り
実行したら画面全体がプルプルしている様に見えます。
([Alt + F4]のキー入力でプログラムが終了)
適当にインデント・改行を入れて、見やすくしたものがこちら↓
#include <windows.h>
#include <math.h>
HDC v,d,e;
HWND g;
int n,f,t[10]={40,0,0,1572865},m[8];
int WINAPI WinMain(HINSTANCE i, HINSTANCE, LPSTR, int)
{
t[1] = GetSystemMetrics(0);
t[2] = GetSystemMetrics(1);
WNDCLASS w = {67, DefWindowProc, 0, 0, i, 0, 0, 0, 0, "T"};
RegisterClass(&w);
v = GetDC(
g = CreateWindow("T" , 0, WS_VISIBLE | WS_POPUP, 0, 0, t[1], t[2], 0, 0, i, 0)
);
d = GetDC(0);
SelectObject(
e = CreateCompatibleDC(d),
CreateCompatibleBitmap(d, t[1], t[2])
);
BitBlt(e, 0, 0, t[1], t[2], d, 0, 0, SRCCOPY);
while ( GetMessage((MSG*)m, g, 0, 0) != -1) {
if (m[1] == 15) /* WM_PAINT */
for (n=0; n<t[2]; n++)
BitBlt(v, sin(n * 3.0 / t[2]) * sin((f++) / 40.0) * 60, n, t[1], 1, e, 0, n, SRCCOPY);
DispatchMessage((MSG*)m);
InvalidateRect(g,0,0);
}
return 0;
}
砂嵐プログラミングその4 のtype1 の内容が元になっていますが、一応補足。
WinMain()先頭の「GetSystemMetrics(0)」でモニタの横幅、「GetSystemMetrics(1)」でモニタの縦幅を取得します。
(※ winuser.hにて「#define SM_CXSCREEN 0」「#define SM_CYSCREEN 1」という定義があります。)
取得した値を元に、モニタの縦横幅サイズのポップアップウィンドウを作成し、そのウィンドウのデバイスコンテキストを保存します。(← 変数v)
デスクトップウィンドウのデバイスコンテキストを取得します。(← 変数d)
(※ 「GetDC(NULL)」でデスクトップウィンドウのデバイスコンテキストを取得)
そして、CreateCompatibleDC(), CreateCompatibleBitmap()を使用してダブルバッファを作成し、(← 変数e)
BitBlt()で、ダブルバッファにデスクトップウィンドウの内容をコピーします。(← d から e にSRCCOPYしているBitBlt)
後は、WM_PAINTメッセージを取得する度に、ダブルバッファからポップアップウィンドウへと画面をコピーします。
(↑ e から v へSRCCOPYしているBitBlt)
この際、BitBltする座標の計算でsin()を使っているため、表示がグニョグニョになりますがw、
この座標計算をオリジナルにアレンジする事で、いろいろと面白い事ができる様になります^^;)
ラスタースクロールプログラミング その2 へ続きます。