StatusBar に画像情報を表示する



ウインドウに StatusBar を設定して SendMessage(hStatus, SB_SETTEXT, ...) で画像情報を表示します。
StatusBar とは、通常ウインドウの下に表示される細長いメッセージ領域ですが、使い方によっては重宝します。

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

プロジェクトの設定

  1. テンプレート機能を使ってプロジェクトを作成して下さい。
    新規プロジェクト(Status)を作成して my.lib と my.h をフォルダーに格納して下さい。
    my.h 私有 Object Class Library のヘッダファイル
    my.lib 私有 Object Class Library のプログラムファイル
    超初心者の方は ★Object Class Library から提供している Image Object Class を使って下さい。
  2. my.h をプロジェクトに追加して、次のヘッダファイルを stdafx.h に取り込んで下さい。
    ステータスバーとか、ツールバーなどコモンコントロールコモンコントロールを使うには commctrl.h をインクルードして、 Comctl32.lib を組み込んで下さい。
    また、使用前に InitCommonControls() 関数で初期化が必要です。
    // TODO: プログラムに必要な追加ヘッダーをここで参照してください。
    #include <commctrl.h>
    #include "My.h"
  3. ページ先頭の画像を参考にして、ファイル(&F) の下に「画像入力」のメニューを追加します。
    キャプション ID
    画像の入力(&S) IDC_SELECT
  4. Status.cpp に追加するソースコードです。
    #pragma でリンカにライブラリを組み込むことを指示します。
    これは [プロジェクト] [プロパティ] [リンカ] [入力] からライブラリを追加することと同じことです。
    ID_STATUS は StatusBar のIDで、hStatus は StatusBar のハンドルです。
    BMP *Bmp は BMP Object Class の定義です。
    HWND CreateMyStatus(HWND, HINSTANCE); は StatusBar を生成する関数のプロトタイプ宣言です。
        #pragma     comment(lib,"comctl32.lib")
        #pragma     comment(lib,"my.lib")
        #define     ID_STATUS    100
        HWND        hStatus;                // ステータスバーのウィンドウハンドル
        BMP         *Bmp= NULL;
        char        szDir[64]= { "c:\\My Documents\\My Pictures" };
    
        HWND        CreateMyStatus(HWND, HINSTANCE);
        
  5. WM_CREATE: で BMP Object Class を生成して StatusBar を生成します。
    StatusBar の詳細は Status Bar を表示する を参照して下さい。
        LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
        {      :
            char    str[64];
    
            switch (message) 
            {   case WM_CREATE:
                    Bmp= new BMP(hWnd);
                    CreateMyStatus(hWnd, hInst);
                    break;
        
  6. メニューから [画像の入力] が選ばれたときのソースコードです。
            case IDC_SELECT:
                Bmp->Open(szDir);
                InvalidateRect(hWnd,NULL,TRUE);
                UpdateWindow(hWnd);
                break;           
        
  7. WM_PAINT に画像を表示するコードと、StatusBar に画像情報を表示するコードを追加します。
            case WM_PAINT:
                hdc = BeginPaint(hWnd, &ps);
                // TODO: 描画コードをここに追加してください...
                Bmp->Show(hdc);
                wsprintf(str,"ファイル名 = %s\nBMP幅 = %d  BMP高さ = %d\n",
                         Bmp->szFile,Bmp->Width,Bmp->Height);
                SendMessage(hStatus, SB_SETTEXT, 255 | 0, (WPARAM)(LPSTR)str);
                EndPaint(hWnd, &ps);
                break;
        
  8. WM_SIZE: で StatusBar のサイズを設定しています。
    この行をコメントにするとその効果が一目瞭然です。
            case WM_SIZE:
                SendMessage(hStatus, WM_SIZE, wParam, lParam);
                break;
        
  9. WM_CLOSE: で BMP Object を開放します。
    SAFE_DELETE は my.h で次のように宣言されています。
    #define SAFE_DELETE(p) { if (p) { delete (p); (p)=NULL; } }
            case WM_CLOSE:
                SAFE_DELETE(Bmp);
                DestroyWindow(hWnd);
                break;
        
  10. ビルドに続いて実行を行います。
    メニューから[画像の入力]を選んで画像を表示します。
    StatusBar に画像情報が表示されたら完成です。

【演習】

フルパスのファイル名(Bmp->szFile) からパスを除いたファイル名を抜き出す関数も用意されています。
この関数を使ってファイル名を抜き出して StatusBar に表示して下さい。
char    szTitle[128]= "Title";

    GetFileTitle(Bmp->szFile,szTitle,sizeof(szTitle));

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