ザ~っという砂嵐プログラミングです^^;)
(2ちゃんねるから拾ってきたコードの為、元ネタではアプリケーションタイトルが "2ch"になっていましたが、ここでは "砂" にしますw)
#include <windows.h>
int i,r,a=640,b=400;long t[11]={40,640,400,2097153};char*k,y[0xfa000];long
WINAPI WndProc(HWND d,UINT m,UINT w,long l){PAINTSTRUCT p;switch(m){case 15:
HBITMAP q;HDC e;e=CreateCompatibleDC(BeginPaint(d,&p));GetDIBits(e,(q=
CreateCompatibleBitmap(p.hdc,a,b)),0,b,0,(BITMAPINFO*)t,0);for(k=y;k<y+a*b*4;
k+=4)*k=*(k+1)=*(k+2)=(r=r*9+5)>>16;SetDIBitsToDevice(p.hdc,0,0,a,b,0,0,0,b,y
,(BITMAPINFO*)t,0);DeleteObject(q);DeleteDC(e);EndPaint(d,&p);InvalidateRect
(d,0,0);return 0;case 2:PostQuitMessage(0);}return DefWindowProc(d,m,w,l);}int
WINAPI WinMain(HINSTANCE i,HINSTANCE,LPSTR,int n){MSG m;WNDCLASS w;w.style=3;w
.lpfnWndProc=WndProc;w.cbWndExtra=w.cbClsExtra=0;w.lpszMenuName=0;w.hIcon=0;w.
hbrBackground=0;w.hCursor=LoadCursor(0,IDC_ARROW);w.lpszClassName="Tricky゙";w.
hInstance=i;RegisterClass(&w);ShowWindow(CreateWindow("Tricky","砂",1<<19,99,
99,a,b,0,0,i,0),n);while(GetMessage(&m,0,0,0))DispatchMessage(&m);return 0;}
さっそくコンパイルして実行してみましょう~♪
※ VC++2005では、構成プロパティ - 全般 - 文字セット を「マルチバイト文字セットを使用する」に設定しないと、
おそらくコンパイルエラーが発生します。
※ また、「warning C4244: 'return' : 'LRESULT' から 'long' への変換です。データが失われる可能性があります。」
といった警告が表示されますが、無視しちゃいましょう^^;)
実行結果は以下の通り。
適当にインデント・改行を入れて、見やすくしたものがこちら↓
#include <windows.h>
int i,r,a=640,b=400;
long t[11]={40,640,400,2097153};
char*k,y[0xfa000];
long WINAPI WndProc(HWND d,UINT m,UINT w,long l)
{
PAINTSTRUCT p;
switch(m){
case 15: /* WM_PAINT */
HBITMAP q;
HDC e;
e=CreateCompatibleDC(BeginPaint(d,&p));
GetDIBits(e,
(q = CreateCompatibleBitmap(p.hdc,a,b)),0,b,0,(BITMAPINFO*)t,0);
for (k=y; k<y+a*b*4; k+=4)
*k = *(k+1) = *(k+2) = (r = r*9+5) >> 16;
SetDIBitsToDevice(p.hdc,0,0,a,b,0,0,0,b,y,(BITMAPINFO*)t,0);
DeleteObject(q);
DeleteDC(e);
EndPaint(d,&p);
InvalidateRect(d,0,0);
return 0;
case 2: /* WM_DESTROY */
PostQuitMessage(0);
}
return DefWindowProc(d,m,w,l);
}
int WINAPI WinMain(HINSTANCE i,HINSTANCE,LPSTR,int n)
{
MSG m;
WNDCLASS w;
w.style = 3;
w.lpfnWndProc = WndProc;
w.cbWndExtra = w.cbClsExtra = 0;
w.lpszMenuName = 0;
w.hIcon = 0;
w.hbrBackground = 0;
w.hCursor = LoadCursor(0,IDC_ARROW);
w.lpszClassName = "Tricky";
w.hInstance = i;
RegisterClass(&w);
ShowWindow(CreateWindow("Tricky","砂",1<<19,99,99,a,b,0,0,i,0),n);
while (GetMessage(&m,0,0,0))
DispatchMessage(&m);
return 0;
}
必要最低限のWindowsAPIが、モリモリ詰め込まれていてステキ (n‘∀‘)η)
※ 最適化前のコードはコチラに載せてあります。
さてさて、
このコードだけでも、Windowsプログラミング初心者には、非常~~に勉強になるわけですが、
機能はそのままで、更にどんどんコードが短くなっていきます。
砂嵐プログラミング その2へ続きます。