OnPaint を override して画像を描画する

C++/CLI で OnPaint を override して Win32 API を使って画像を描画します。

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

プログラムの説明

  1. ソースプログラムです。
    ファイル名 説明
    ImageDC.cpp 画像を描画
  2. 今回は OnPaint を override して BMP 画像を描画してみましょう。
    ついでと言ったらなんですが、HDC(デバイスコンテキストのハンドル) を取得して Win32 API で描画します。
    C++/CLI の面目躍如と言った所でしょうか。 ヽ(^^ )
    今回も必要なファイルは、ごく簡単なプログラムファイル一本だけです。
    コンパイルと実行の方法は Set UP を参照して下さい。
  3. Win32 API を使うときは windows.h を #include して、user32.lib と gdi32.lib をリンクして下さい。
        #include <windows.h>
        #pragma comment(lib, "user32.lib")
        #pragma comment(lib, "gdi32.lib")
        
  4. OnPaint を override するメソッドです。
    GetHdc().ToInt32() で HDC を取得して、BMP 画像を描画するメソッド ShowBMP() を呼びます。
    "c:\\data\\test\\ayu.bmp" が画像が格納されているフォルダーと画像ファイルの名前です。
    あまり大きくない適当な BMP 画像を調達して来て下さい。
    取得した HDC は ReleaseHdc() で開放して下さい。
        virtual void OnPaint(PaintEventArgs ^e) override
        {
            HDC hdc = (HDC)(e->Graphics->GetHdc().ToInt32());
            ShowBMP(hdc, "c:\\data\\test\\ayu.bmp");
            e->Graphics->ReleaseHdc((System::IntPtr)hdc);
        }
        
  5. 画像ファイルを入力して描画するメソッド ShowBMP() の定義です。
    Win32 API のプログラムは Win32 API C++ を参照して下さい。
        HRESULT ShowBMP(HDC hdc, LPCSTR szBitmap)
        {   HBITMAP         hBmp;
            HDC             hBmpDC;
            BITMAP          bm;
    
            //ファイルからイメージをロード
            hBmp = (HBITMAP)::LoadImage(NULL,szBitmap,IMAGE_BITMAP,0,0,
                                        LR_LOADFROMFILE|LR_CREATEDIBSECTION);
            if (hBmp==NULL)     return FALSE;
            hBmpDC= ::CreateCompatibleDC(hdc);
            ::SelectObject(hBmpDC,hBmp);
            ::GetObject(hBmp,sizeof(bm),&bm);
            ::BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,hBmpDC,0,0,SRCCOPY);
            ::DeleteDC(hBmpDC);
            ::DeleteObject(hBmp);
            return TRUE;
        }
        

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