トリッキーコードネット トップへ戻る   C/C++, Java, Perl, PHP, JavaScript, アルゴリズム, ショートコーディング, IOCCCコードの解説, 等々

サイト情報

トリッキーなコード

7行プログラミング

物凄いコード集

アルゴリズム

データ構造

C/C++な話題

コードサンプル

ツール/環境構築

開発ノウハウ 等

ネタ/ジョーク集

おススメ書籍/サイト

サイトTOP >> 7行プログラミング >> 砂嵐表示プログラミング - その3 (Win32API)

砂嵐プログラミング その3 (Win32API)

砂嵐プログラミング その2の続きです。
11行 ⇒ 10行になりました~♪

#include <windows.h> 
HBITMAP q;HDC e,v;char*k,y[1<<20];int a=640,b=400,c,i,t[11]={40,a,b,1572865},r
;long WINAPI f(HWND d,UINT m,UINT w,long l){c=DefWindowProc(d,m,w,l);if(m==2)
PostQuitMessage(0);if(m==15){GetDIBits((v=GetDC(d)),(q=CreateCompatibleBitmap(
v,a,b)),0,b,0,(BITMAPINFO*)t,0);for(k=y;k<y+a*b*3;k+=3)*k=*(k+1)=*(k+2)=(r=r*9
+5)>>16;SetDIBitsToDevice(v,0,0,a,b,0,0,0,b,y,(BITMAPINFO*)t,0);DeleteObject(q
);InvalidateRect(d,0,0);ReleaseDC(d,v);}return c;}int WINAPI WinMain(HINSTANCE
i,HINSTANCE,LPSTR,int n){MSG m;WNDCLASS w={3,f,0,0,i,0,LoadCursor(0,IDC_ARROW)
,0,0,"Tricky"};RegisterClass(&w);ShowWindow(CreateWindow("Tricky","砂",1<<19,99
,99,a,b,0,0,i,0),n);for(m;GetMessage(&m,0,0,0);DispatchMessage(&m));return 0;}
適当にインデント・改行を入れて、見やすくしたものがこちら↓
#include <windows.h> 
HBITMAP q;
HDC e,v;
char * k, y[1<<20];
int a=640,b=400,c,i,t[11]={40,a,b,1572865},r;

long WINAPI f(HWND d,UINT m,UINT w,long l)
{
    c = DefWindowProc(d, m, w, l);

    if (m == 2)     /* WM_DESTROY */
        PostQuitMessage(0);
    
    if (m == 15) {  /* WM_PAINT */
        GetDIBits(
                    (v=GetDC(d)),
                    (q=CreateCompatibleBitmap(v,a,b)),
                    0,
                    b,
                    0,
                    (BITMAPINFO *)t,
                    0
                );

        for (k = y; k < y+a*b*3; k += 3)
            *k = *(k+1) = *(k+2) = (r=r*9+5)>>16;

        SetDIBitsToDevice(v, 0, 0, a, b, 0, 0, 0, b, y, (BITMAPINFO*)t, 0);
        DeleteObject(q);
        InvalidateRect(d,0,0);
        ReleaseDC(d,v);
    }
    return c;
}

int WINAPI WinMain(HINSTANCE i, HINSTANCE, LPSTR, int n)
{
    WNDCLASS w = {3,f,0,0,i,0,LoadCursor(0,IDC_ARROW),0,0,"Tricky"};
    RegisterClass(&w);
    ShowWindow(CreateWindow("Tricky","砂",1<<19, 99, 99, a, b, 0, 0, i, 0),n);

    for(MSG m; GetMessage(&m,0,0,0); DispatchMessage(&m));

    return 0;
}
ウィンドウプロシージャ(慣例は「WndProc」、でも上記コード内では「f」)に、 WM_PAINT (winuser.h内で「#define WM_PAINT 0x000F」と定義されています)メッセージが渡された場合の処理が、 前回と大きく異なっています。 WM_PAINTメッセージ処理の際 (以下、WM_PAINTの際) に、 前回は、BeginPaint()でデバイスコンテキストを取得し、EndPaint()で解放していましたが、 今回はその代わりにGetDC()でデバイスコンテキストを取得し、ReleaseDC()で解放しています。 さて、WM_PAINTの際は、必ずBeginPaint(), EndPaint()を呼び出す必要があります。 また、WM_PAINTの処理を行わない場合は、 DefWindowProcを呼び出すと、内部でBeginPaint(), EndPaint()を呼び出してくれます。 (※ BeginPaint(), EndPaint()を呼び出さずにWM_PAINTをreutrnすると、WM_PAINTが延々と呼ばれ続けるんだそうです。 (((( ;゚Д゚))))ガクガクブルブル) 上記コード内では、ウィンドウプロシージャの先頭でDefWindowProc()を呼び出して、 WM_PAINTの際にBeginPaint(), EndPaint()の明示的な呼び出しを避けているというワケです。(←もちろん、少しでも文字数を減らす為w) 砂嵐プログラミング その4へ続きます。
         このエントリーをはてなブックマークに追加   


作業効率化・ライフハックのオススメ記事




コンピュータ・テクノロジーのオススメ記事





恋愛・人間関係のオススメ記事




※ 当サイトは、トップページからリンクで辿る事の出来るページに限り、リンクフリーです。
※ 当サイトの閲覧/利用によって生じた如何なる損害も、当サイト管理人は責任を負いません。
※ 当サイトの内容を転載される場合は、当サイトへのリンクをお願い致します。