「ちらつき」を抑えて fadein/fadeout

BackBuffer を取得して「ちらつき」を抑えて fadein / fadeout します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. BACKBUF Object Class を使うので My.h をインクルードして my.lib をリンクしています。
    BackBuffer を使わなくても描画できますが、多少画面がチラツキます。
    Object Class のソースコードは Object Class Library から取得して下さい。
    BACKBUF *Back は BACKBUF Object Class の定義です。
    HFONT hFont; はタイトルを表示するフォントを設定する領域です。
    CNT は fadein/fadeout の文字の濃さを制御する領域で、タイマ割り込みで「200~0」まで変化します。
        /******************************************************/
        /*★ FadeIN, FadeOUT  Mylib のプログラム    前田 稔 ★*/
        /******************************************************/
        #define     NAME    "Fade IN/OUT Mylib"
        #include    <windows.h>
        #include    "my.h"
        #pragma     comment(lib,"my.lib")
        #define     ID_TIMER    (WM_APP + 0)
        #define     WIDTH       600
        #define     HEIGHT      300
    
        HINSTANCE   g_hInst;
        HWND        g_hWnd;
        BACKBUF     *Back= NULL;        //BACKBUF Object Class
        HFONT       hFont,hFontOld;
        int         CNT= 200;
        
  2. CALLBACK 関数の WM_CREATE: です。
    new BACKBUF(hWnd); で BackBuffer Object Class を生成します。
    SetMyFont() でタイトルを表示するフォントを生成します。
    SetTimer() でタイマを起動して fadein を開始します。
            case WM_CREATE:
                Back= new BACKBUF(hWnd);
                hFont = SetMyFont((LPCTSTR)"MS 明朝",128,0);
                SetTimer(hWnd,ID_TIMER,50,NULL);
                break;
        
  3. WM_TIMER: では CNT がゼロになるまでカウントダウンします。
    WM_PAINT: から描画するとチラツクので、ここから View() 関数で描画しています。
            case WM_TIMER:
                if (CNT)
                {   CNT--;
                    View();
                }
                break;
        
  4. WM_KEYDOWN: では、ESC キーを検出してプログラムを終了します。
            case WM_KEYDOWN:            //KEY が押された
                switch(wParam)
                {   case VK_ESCAPE:     //ESC KEY
                        DestroyWindow(hWnd);
                        return 0L;
                }
                break;
        
  5. WM_DESTROY: ではタイマを停止して、リソースを開放して下さい。
            case WM_DESTROY:
                KillTimer(hWnd,ID_TIMER);
                SAFE_DELETE(Back);
                DeleteObject(hFont);
                PostQuitMessage(0);
                return 0L;
        
  6. タイトル文字を表示する View() 関数です。
    画面全体を GRAY_BRUSH でクリアします。
    r,g,b が赤緑青のレベルで、128 が GRAY_BRUSH と同じ色の設定です。
    CNT はタイマ割りこみで「200から0」にカウントダウンされるので、i の値は「0~100~0」になります。
    i=0 のときが背景色と同じ色で、i=100 のときが最も濃い色です。
    if 命令で r,g,b の値が「0~255」を超えないようにしています。
    色の設定が終わればフォントを設定してタイトルを描画します。
    Back->Blt() で BackBuffer から一挙に転送することによりチラツキを抑えます。
        void  View()
        {   int     i;
            int     r,g,b;
    
            //裏画面をクリア
            Back->Clear((HBRUSH)GetStockObject(GRAY_BRUSH));
            i= CNT;
            if (i>100)  i= 100-(i-100);     //i= 0~100~0
            r= 128+i;
            g= 128+i/3;
            b= 128-i*2;
            if (r>255)  r= 255;
            if (b<0)    b= 0;
            SetTextColor(Back->hBackDC,RGB(r,g,b));
            SetBkMode(Back->hBackDC,TRANSPARENT);
            hFontOld= (HFONT)SelectObject(Back->hBackDC,hFont);
            TextOut(Back->hBackDC,50,60,"Windows",7);
            SelectObject(Back->hBackDC,hFontOld);
            Back->Blt();
        }
        

【演習】

  1. プログラムを完成させて下さい。
  2. フォントの設定は 文字フォントを設定して描画する を参照して下さい。
  3. Enter キーで fadein を開始するようにプログラムして下さい。

超初心者のプログラム入門(Win32API C++)