HDC を取得して図形を描画する

C++/CLI で HWND や HDC を取得して図形を描画します。

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

プログラムの説明

  1. ソースプログラムです。
    ファイル名 説明
    HDC.cpp HDC を取得
  2. C++/CLI で HWND(ウインドウのハンドル) や HDC(デバイスコンテキスト) を取得して図形を描画します。
    いよいよ 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. Constructor で Paint イベント(描画)を行うメソッドを設定します。
        FormClass()
        {
            form = gcnew Form();
            Paint += gcnew PaintEventHandler(this, &FormClass::MyHandler);
        }
        
  5. Paint(描画) を行うメソッド(MyHandler) の定義です。
    最初は手始めに二本のラインを描画して見ました。
    MessageBox:: は MyHandler が呼ばれたことの確認です。
        void MyHandler(Object^ sender, PaintEventArgs^ e)
        {
            MessageBox::Show("MyHandler","check");
            Graphics^ g = e->Graphics;
            System::Drawing::Graphics^  g = e->Graphics;
            g->DrawLine(gcnew Pen(Color::Red),10,50,260,50);
            g->DrawLine(gcnew Pen(Color::Green,10),10,150,260,150);
        }
        
  6. MyHandler() で、HDC を取得して矩形を描画します。
    ::Rectangle() は Win32 の API です。スコープ演算子(::)を付けて参照して下さい。
    新しい命令を知らなくても、HDC が取得出来れば、Win32 API を使って自由に図形を描画することが出来ます。 (^_^;)
    Win32 API を使った描画は Win32 API C++ を参照して下さい。
        void MyHandler(Object^ sender, PaintEventArgs^ e)
        {
            HDC hdc = (HDC)(e->Graphics->GetHdc().ToInt32());
            ::Rectangle(hdc,50,30,200,80);
            e->Graphics->ReleaseHdc((System::IntPtr)hdc);
        }
        
  7. こんどは MyHandler() で、HWND を取得して SetPixel() で描画してみます。
    ::GetDC(hWnd) で取得した HDC は ::ReleaseDC(hWnd,hdc) で開放して下さい。
    みごとに昔ながらの Windows Program が甦ったことには感激です。 (●^o^●)
        void MyHandler(Object^ sender, PaintEventArgs^ e)
        {
            HWND hWnd = (HWND)this->Handle.ToInt32();
            HDC     hdc;
            hdc= ::GetDC(hWnd);
            for(int i=20; i<220; i++)
            {   ::SetPixel(hdc,i,20,RGB(255,0,0));
                ::SetPixel(hdc,i,40,RGB(0,0,255));
                ::SetPixel(hdc,i,41,RGB(0,0,255));
                ::SetPixel(hdc,i,42,RGB(0,0,255));
            }
            ::ReleaseDC(hWnd,hdc);
        }
        

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