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

サイト情報

トリッキーなコード

7行プログラミング

物凄いコード集

アルゴリズム

データ構造

C/C++な話題

コードサンプル

ツール/環境構築

開発ノウハウ 等

ネタ/ジョーク集

おススメ書籍/サイト

サイトTOP >> 7行プログラミング >> ラスタースクロールプログラミング - その1 (Win32API)

ラスタースクロールプログラミング その1 (Win32API)

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

#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' への変換です。データが失われる可能性があります。」 といった警告が表示されますが、無視しちゃいましょう^^;) --------------------------------------------------------------- 実行結果は以下の通り ラスタースクロールプログラミング 実行ファイル(.exe)も置いておくので、よろしければダウンロードして実行してみて下さい。⇒ code31.zip (実行したら画面全体がプルプルしている様に見えます。[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へ続きます。
         このエントリーをはてなブックマークに追加   


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




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





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




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