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

【7行プログラミング/ショートコーディング】砂嵐表示 その1 (Win32API・C言語)

ザ~っという砂嵐プログラミングです^^;)
(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へ続きます。
トリッキーコードネット の TOPへ HOTNEWS の 総合TOPへ