TOP >> マニアックなプログラミング
トリッキーコードネット トリッキーなコード

【7行プログラミング/ショートコーディング】ラスタースクロール その1 (Win32API・C言語)

ラスタースクロールのプログラミングです^^;)

#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 へ続きます。
トリッキーコードネット の TOPへ HOTNEWS の 総合TOPへ