αチャンネル付の DDS 画像ファイルを表示する

VC++ で DirectX で使われているαチャンネル付の DDS 画像をαチャンネルで Alph Blending して表示します。
αチャンネル付きの画像ファイルを作成するには専用のツールが必要ですが、DirectX には専用のツールが添付 されていて、誰でも無料で使うことができます。
このファイルを Windows でも使えるように DDS Object Class を作成しました。
DDS(DDSurface) ファイルの詳しい説明は DDS 形式の画像ファイルを作成する を参照して下さい。

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

プロジェクトの設定

  1. DDS Object Class を使うので DDS.h をインクルードして下さい。
    私有ライブラリを使うので my.lib をリンクします。
    my.lib に登録されている関数は my.h で定義していたのですが、DDS ではソースコードが長すぎるので DDS.h として別ファイルにしています。
    *dds が DDS Object Class の定義です。
    Object Class のソースコードは Object Class Library から取得して下さい。
    DDSFile[] は入力する DDS 画像ファイルの名前です。
        /*********************************************/
        /*★ DDS 画像ファイルを表示する    前田 稔 ★*/
        /*********************************************/
        #define     NAME    "DDS View"
        #include    "DDS.h"
        #pragma     once
        #pragma     comment(lib,"my.lib")
    
        HINSTANCE       g_hInst;
        HWND            g_hWnd;
        DDS             *dds;       //DDS Object Class
        char            DDSFile[]= "c:\\data\\testdata\\ffx2s.dds";
        
  2. CALLBACK 関数の WM_CREATE: で DDS Object Class を生成して画像を入力します。
            case WM_CREATE:
                dds= new DDS(hWnd);
                dds->Load(DDSFile);
                break;
        
  3. WM_PAINT: で DDS 画像ファイルを描画します。
    dds->Clear() でウインドウをクリアします。
    dds->Show() で BMP 画像と同じようにマスクに関係なく描画します。
    dds->ShowBlack() で黒を透明色に設定して画像をマスクして描画します。
    20 は透明にするマスクの閾値で、値が小さいほど描画範囲が広がります。
    dds->ShowBlend() で現在表示中の画像とブレンドします。
    0.0 ~ 1.0 がブレンド係数で、0.0 で元の画像のままです。
            case WM_PAINT:
                hdc = BeginPaint(hWnd,&ps);
                dds->Clear(g_hWnd,(HBRUSH)GetStockObject(LTGRAY_BRUSH));
                //dds->Show(hdc,0,0);
                //dds->ShowBlack(hdc,0,0,20);
                dds->ShowBlend(hdc,0,0,1.0F);
                EndPaint(hWnd, &ps);
                break;
        
  4. WM_CLOSE: では、終了前にリソースを開放して下さい。
            case WM_CLOSE:          // クローズ
                SAFE_DELETE(dds);
                DestroyWindow(hWnd);
                break;
            case WM_DESTROY: 
                PostQuitMessage(0);
                break;
        
  5. WinMain() は何時もと同じように画像サイズに合わせてウインドウを表示するだけです。

【演習】

  1. プログラムを完成させて下さい。
  2. dxtex.exe で αチャンネル付きの画像(DDS)を作成して下さい。
    画像の作成方法は DDS 形式の画像ファイルを作成する を参照して下さい。
  3. 次のソースコードを実行して、描画の結果を確かめて下さい。
    閾値の 20 を変えて描画を確認して下さい。
        dds->Show(hdc,0,0);
        dds->ShowBlack(hdc,0,0,20);
        dds->ShowBlend(hdc,0,0,1.0F);
        
  4. 背景に BMP 画像を表示して、画像をブレンドしてみて下さい。
  5. DDS 画像ファイルでは BMP ファイルと比べて画像イメージが上下逆になっていました。
    もっとも BMP 画像の方が逆だったので、正常に戻ったと言うことでしょうか。 (-.-;)
    ただし BitBlt() を始め Windows の描画関数が全て逆に対応しているので、手間がかかっただけでした。 (/_;)

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