Main Program

「Alpha Cannel 対応」画像ツールのメインプログラムです。

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

Main Program の説明

  1. *Image は、メイン画像の IMAGE Object Class です。
    *Mask は、Alpha Cannel に格納する画像の IMAGE Object Class です。
    *Alpha は、Alpha Cannel 付き画像の描画と作成のベースになる ALPHA32 Object Class です。
    Rate は、Alpha 値でマスクする時の係数です。
    Mode は、どの画像を描画するかの制御変数です。
        HINSTANCE       g_hInst;
        HWND            g_hWnd;
        IMAGE           *Image= NULL;           // IMAGE Object Class
        IMAGE           *Mask= NULL;            // Mask Image
        ALPHA32         *Alpha= NULL;           // ALPHA32 Object
        float           Rate= 1.0f;             // Fade OUT のレート
        int             Mode= 0;                // 描画モード
        
  2. アプリケーションの初期化を行う AppInit() 関数です。
    IMAGE Class 生成して、OpenFile() でメイン画像をロードします。
    メイン画像のサイズに合わせて ALPHA32 Class を生成します。
    メイン画像を LoadWBmpDC() で Alpha Class に格納します。
    メイン画像がアルファチャネル付きのとき、MessageBox() で知らせます。
        // 画像をロードして、Alpha32 を初期化
        LRESULT  AppInit(HWND hwnd)
        {   SAFE_DELETE(Image);
            SAFE_DELETE(Mask);
            SAFE_DELETE(Alpha);
    
            // IMAGE Class 生成して Dialog から画像をロード
            Image= new IMAGE(hwnd);
            Image->OpenFile();
    
            // Alpha32 の初期化
            Alpha= new ALPHA32(hwnd,Image->Width,Image->Height);
    
            // Alpha32(WBmpDC) にイメージを格納
            Alpha->LoadWBmpDC(Image->hBmpDC);
            if (Alpha->AlphFlg==TRUE)
                MessageBox(NULL,"アルファチャネルが設定されました","Alpha Image Tool",MB_OK);
    
            Rate= 1.0f;
            Mode= 0;
            Alpha->WipeAlph(Rate);
            Image->Adjust(FALSE);
            return TRUE;
        }
        
  3. 画像を描画する WM_PAINT: です。
    Mode に従って描画する画像を選択します。
        case WM_PAINT:
            hdc = BeginPaint(hWnd,&ps);
            switch(Mode)
            {
                case 0:             // ブレンド画像を描画
                    if (Image)  BitBlt(hdc,0,0,Image->Width,Image->Height,Alpha->hBmpDC,0,0,SRCCOPY);
                    EndPaint(hWnd, &ps);
                    break;
                case 1:             // 基本画像を描画
                    if (Image)  BitBlt(hdc,0,0,Image->Width,Image->Height,Image->hBmpDC,0,0,SRCCOPY);
                    EndPaint(hWnd, &ps);
                    break;
                case 2:             // マスク画像を描画
                    if (Mask)   BitBlt(hdc,0,0,Image->Width,Image->Height,Mask->hBmpDC,0,0,SRCCOPY);
                    EndPaint(hWnd, &ps);
                    break;
                case 3:             // アルファ画像を描画
                    if (Image)
                    {   Alpha->AlphImage();
                        BitBlt(hdc,0,0,Image->Width,Image->Height,Alpha->hBmpDC,0,0,SRCCOPY);
                    }
                    EndPaint(hWnd, &ps);
                default:            // 現在の hBmpDC を描画(Test用)
                    BitBlt(hdc,0,0,Image->Width,Image->Height,Alpha->hBmpDC,0,0,SRCCOPY);
                    EndPaint(hWnd, &ps);
                    break;
            }
            break;
        
  4. メニューを処理する WM_COMMAND: です。
    通常の画像とマスク画像を組み合わせて Alpha Cannel 対応の BMP32bit ファイルを作成するときは、次の手順で操作します。
    1. プログラムの起動時にメイン画像を入力します。
    2. メニューから「マスクを入力」を選択します。
    3. メニューから「BMP32 で保存」を選択します。
        case WM_COMMAND:
            wmId   = LOWORD(wp); 
            wmEvent= HIWORD(wp); 
            // 選択されたメニューの解析 :
            switch (wmId)
            {
                case ID_OPEN:        // 画像を入力
                    AppInit(hWnd);
                    Mode= 0;
                    InvalidateRect(hWnd,NULL,FALSE);
                    break;
                case ID_MASK:       // マスクを入力
                    SAFE_DELETE(Mask);
                    Mask= new IMAGE(hWnd);
                    Mask->OpenFile();
                    Alpha->LoadAlph(Mask->hBmpDC,Mask->Width,Mask->Height);
                    Mode= 2;
                    InvalidateRect(hWnd,NULL,FALSE);
                    break;
                case ID_SAVE:       // BMP32 で保存
                    if (Alpha->PutBmp32()==TRUE)
                        MessageBox(NULL,"BMP32 で保存しました","Alpha Image Tool",MB_OK);
                    else
                        MessageBox(NULL,"保存に失敗しました","Alpha Image Tool",MB_OK);;
                    break;
                case ID_VBLEND:     // ブレンド画像
                    Mode= 0;
                    Rate= 1.0f;
                    Alpha->WipeAlph(Rate);
                    InvalidateRect(hWnd,NULL,FALSE);
                    break; 
                case ID_VIMAGE:     // 基本画像
                    Mode= 1;
                    InvalidateRect(hWnd,NULL,FALSE);
                    break; 
                case ID_VMSK:       // マスク画像
                    if (Mask==NULL)
                    {   MessageBox(NULL,"マスク画像は入力されていません","Alpha Image Tool",MB_OK);
                        break;
                    }
                    Mode= 2;
                    InvalidateRect(hWnd,NULL,FALSE);
                    break; 
                case ID_VALPHA:     // アルファ画像
                    Mode= 3;
                        InvalidateRect(hWnd,NULL,FALSE);
                    break; 
                case IDM_ABOUT:
                    MessageBox(NULL,"BMP32 Alpha Image Tool","Version 1.0  maeda minoru",MB_OK);
                    break;
                case IDM_EXIT:
                    PostMessage(hWnd,WM_CLOSE,0,0);
                    break;
            }
            break;
        
  5. マウスのクリックで Alpha 値でマスクするときの Rate を設定します。
        case WM_LBUTTONDOWN:        // 左ボタンをクリック(rate を下げる)
            if (Mode!=0)    break;
            Rate-= 0.1f;
            if (Rate<0.1f)  Rate=  0.0f;
            Alpha->WipeAlph(Rate);
            InvalidateRect(hWnd,NULL,FALSE);
            break; 
        case WM_RBUTTONDOWN:        // 右ボタンをクリック(rate を上げる)
            if (Mode!=0)    break;
            Rate+= 0.1f;
            if (Rate>1.0f)  Rate= 1.0f;
            Alpha->WipeAlph(Rate);
            InvalidateRect(hWnd,NULL,FALSE);
            break; 
        

[Previous Chapter ↑] Object Class

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