モッカディートのスクリーンセーバー

ぐへへ:
http://d.hatena.ne.jp/ore_de_work/20130318#1363763563

つくってた。(おれなにやってんだ...
さらに変更した。
Y位置とX位置とモッカディートのサイズ自動調整するようにしたからサンプルウインドウで確認できるようになった。
あと調整で見れるようにもした。

神様のメモ帳BDを買った人は、モッカディートを最高画質で取り込んでカクカク無くしてください(ワラ
#define ANIME 4になってるところを変えるだけ
...いやもともとカクカクか

使い方

使い方は簡単。適当にスクリーンセイバーのサンプル http://www.6809.net/tenk/html/prog/scrnsvr.htm 拾ってきて ソース貼り付けて
リソースにIDB_BITMAP1から4枚連続で読み込んでコンパイルするだけ。
ねっ簡単でしよ。

経歴

fla:verのやつが転がってたので*1VMWareで実行してハードキャプチャかけて画像採取して作った。
んで連続キャプチャしたら61枚程度の画像が出来上がった。。。(;゜Д゜)これぜんぶパースすんの?とか考えながらとりあえずPaintShopでレイヤー化して誤差修正 < 61レイヤーなw。
で、レイヤー分離とてGiam http://www.forest.impress.co.jp/library/software/giam/ でアニメーション確認したところ、16枚くらいになったが、
もうメンドクセーので画像は4枚程度にした。
結果的には4枚でよかった。少しカクカクするかもしれんがw

/* モッカディート スクリーンセーバー */

#include <windows.h>
#include <scrnsave.h>
#include "resrc1.h"

/* スクリーンセーバー用ライブラリの指定 */
//#pragma comment(lib,"scrnsave.lib")
#pragma comment(lib,"scrnsavw.lib")
#pragma comment(lib,"comctl32.lib")

// Y位置調整用
#define Y ((rc.bottom - rc.top)/50)

// 速度
#define XX ((rc.right - rc.left) / 50)

// 一列のくまさんの数 
#define MOKKADEET 4

// アニメーション
#define ANIME 4

HBITMAP hBitmap[ANIME*2];

LONG i, x1, x2;

_CRTIMP int __cdecl sprintf(char *, const char *, ...);
char str [256];

/* ------------------------------------------------------------------ */
BOOL WINAPI RegisterDialogClasses(HANDLE hInst)
{
    return TRUE;
}

/* ------------------------------------------------------------------ */
/* 設定ダイアログだけどモッカディート表示します */
BOOL WINAPI
ScreenSaverConfigureDialog(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch(uMsg) {
    case WM_INITDIALOG:uMsg = WM_CREATE;
    case WM_CREATE:
        // 塗りつぶしタイマー
        SetTimer(hWnd,2, 800, NULL);
        return ScreenSaverProc( hWnd,  uMsg,  wParam,  lParam);
    case WM_DESTROY:
    case WM_TIMER:
        return ScreenSaverProc( hWnd,  uMsg,  wParam,  lParam);

    case WM_COMMAND:
    case WM_CLOSE:
        EndDialog(hWnd, 0);
        break;

    default:
        break;
    }
    return FALSE;
}

/* ------------------------------------------------------------------ */
/* スクリーンセーバー処理 */
LONG WINAPI
ScreenSaverProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC    hdc;
    LONG cx1, cx2;
    BITMAP bmp_info;
    HDC hdc_mem;
    RECT rc;
    LONG bmpw, bmph;
    LONG scrw, scrh;

    switch(uMsg) {
    case WM_CREATE:
        {
            int i, j;
            // bitmap 読込
            for( i = 0; i < ANIME; i++ )
                hBitmap[i] = LoadBitmap(hMainInstance, (LPCTSTR)IDB_BITMAP1 + i);

            // 逆像を作る
            j = ANIME;
            for( ; i < ANIME * 2; i++ )
                hBitmap[i] = hBitmap[--j];

        }

        // 100ms くらいでいい
        SetTimer(hWnd,1, 100, NULL);
        break;

    case WM_DESTROY:
        KillTimer(hWnd,1);
        /* タイマー割り込み終了 */
        for( i = 0; i < ANIME; i++ )
            DeleteObject(hBitmap[i]);
        break;

    case WM_TIMER:
        hdc = GetDC(hWnd);
        GetClientRect(hWnd, &rc);

        if(wParam == 2)
        {
            /* それなりの色で塗りつぶす */
            HBRUSH hBrush, hOldBrush;
            hBrush = CreateSolidBrush(RGB(0, 0, 0)); 
            //hBrush = CreateSolidBrush(RGB(0, 24, 24)); 
            hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);
            Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);
            SelectObject(hdc, hOldBrush);
        }

        if(wParam == 1)
        {
            i++;
            i %= ((ANIME) * 2);
            hdc_mem = CreateCompatibleDC(hdc);
            SelectObject(hdc_mem, hBitmap[i]);
            GetObject(hBitmap[i], sizeof(BITMAP), &bmp_info);
            bmpw =bmp_info.bmWidth;
            bmph =bmp_info.bmHeight;

            // スクリーンサイズからモッカディートのサイズを算出
            scrw = (rc.right - rc.left) / MOKKADEET;
            scrh = scrw * (bmph/bmpw);

            //
            x1 += XX;
            x2 += XX;

            cx1 = scrw - x1;
            cx2 = x2;

            cx1 %= scrw;
            cx2 %= scrh;


            for(; cx1 < rc.right ; cx1 += scrw)
                StretchBlt(hdc, cx1, Y, scrw, scrh,
                hdc_mem, 0, 0, bmpw, bmph, SRCCOPY);
            for(; cx2 < rc.right + scrw ; cx2 += scrw)
                StretchBlt(hdc, cx2, rc.bottom - scrh - Y, -scrw, scrh,
                hdc_mem, 0, 0, bmpw, bmph, SRCCOPY);

            if( cx1 < 0) x1 = 0;
#if 0
            sprintf( str, "%d/%d %d/%d %d/%d ",  
                rc.bottom - rc.top,  rc.right - rc.left,
                scrw, scrh, bmpw, bmph);
            TextOut(hdc, 0, 0, str ,  strlen(str));
#endif
            DeleteDC(hdc_mem); 

        }

        ReleaseDC(hWnd, hdc);
        break;

    default:
        return DefScreenSaverProc(hWnd,uMsg,wParam,lParam);
    }

    return 0;
}

*1:なんかずっとスクリーンセイバーかかってると重くなるからVC++ + scrnsavw.lib で車輪再開発