情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

C#でWIN32API step13 画像描画(その1)

step8:ここまでのまとめ(その1)

step9:FPSを測定する

step10:図形描画

step11:文字描画(その1)

step12:文字描画(その2)

今回はビットマップ画像を描画してみます。

WM_PAINTメッセージプロシージャを以下のように変更します。

LoadImage関数を使用してビットマップ画像を読み込むのが最も簡単な方法かと思います。CreateCompatibleDC関数によってデバイスコンテキストを作成し、読み込んだビットマップを選択します。画面への描画はBitBlt関数やStretchBlt関数を使ってデバイスコンテキスト間のデータコピーによって行います。

private static IntPtr WM_PAINT(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
{
    WIN32.Draw.PAINTSTRUCT paintstruct;

    IntPtr hdc = WIN32.Draw.BeginPaint(hWnd, out paintstruct);

    IntPtr hcompatibledc = WIN32.Draw.CreateCompatibleDC(hdc);

    IntPtr hbitmap = WIN32.Draw.LoadImage(IntPtr.Zero, "20090110100017.bmp", WIN32.Draw.IMAGE.IMAGE_BITMAP, 0, 0, WIN32.Draw.LR.LR_LOADFROMFILE);

    WIN32.Draw.SelectObject(hcompatibledc, hbitmap);

    WIN32.Draw.BitBlt(hdc, 0, 0, 104, 104, hcompatibledc, 0, 0, WIN32.Draw.SRCCOPY);
    WIN32.Draw.StretchBlt(hdc, 0, 104, 208, 208, hcompatibledc, 0, 0, 104, 104, WIN32.Draw.SRCCOPY);

    WIN32.Draw.DeleteObject(hbitmap);

    WIN32.Draw.DeleteDC(hcompatibledc);

    WIN32.Draw.EndPaint(hWnd, ref paintstruct);

    return IntPtr.Zero;
}

こちらが、P/I用のコードです(前回からの追加部分)。

using System;
using System.Runtime.InteropServices;

namespace Anttn.WIN32
{
    public static partial class Draw
    {
    (省略)

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr LoadImage(IntPtr hinst, string lpszName, IMAGE uType, int cxDesired, int cyDesired, LR fuLoad);

        [DllImport("gdi32.dll")]
        public static extern IntPtr CreateCompatibleDC(IntPtr hdc);

        [DllImport("gdi32.dll")]
        public static extern bool DeleteDC(IntPtr hdc);

        [DllImport("gdi32.dll")]
        public static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, uint dwRop);

        [DllImport("gdi32.dll")]
        public static extern bool StretchBlt(IntPtr hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, uint dwRop);

    (省略)

        public enum IMAGE : uint
        {
            IMAGE_BITMAP = 0,
            IMAGE_ICON = 1,
            IMAGE_CURSOR = 2
        }

        [Flags]
        public enum LR : uint
        {
            LR_DEFAULTCOLOR = 0,
            LR_MONOCHROME = 0x1,
            LR_COLOR = 0x2,
            LR_COPYRETURNORG = 0x4,
            LR_COPYDELETEORG = 0x8,
            LR_LOADFROMFILE = 0x10,
            LR_LOADTRANSPARENT = 0x20,
            LR_DEFAULTSIZE = 0x40,
            LR_VGACOLOR = 0x80,
            LR_LOADMAP3DCOLORS = 0x1000,
            LR_CREATEDIBSECTION = 0x2000,
            LR_COPYFROMRESOURCE = 0x4000,
            LR_SHARED = 0x8000
        }

    (省略)

        public const uint SRCCOPY = 0x00CC0020;
        public const uint SRCPAINT = 0x00EE0086;
        public const uint SRCAND = 0x008800C6;
        public const uint SRCINVERT = 0x00660046;
        public const uint SRCERASE = 0x00440328;
        public const uint NOTSRCCOPY = 0x00330008;
        public const uint NOTSRCERASE = 0x001100A6;
        public const uint MERGECOPY = 0x00C000CA;
        public const uint MERGEPAINT = 0x00BB0226;
        public const uint PATCOPY = 0x00F00021;
        public const uint PATPAINT = 0x00FB0A09;
        public const uint PATINVERT = 0x005A0049;
        public const uint DSTINVERT = 0x00550009;
        public const uint BLACKNESS = 0x00000042;
        public const uint WHITENESS = 0x00FF0062;
        public const uint NOMIRRORBITMAP = 0x80000000;
        public const uint CAPTUREBLT = 0x40000000;
    }
}

描画結果は以下のようになります。

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-C#, WIN32API