さらに追加したいと思います。
※Declare宣言部分は上記サンプルと同じですので省略します。
・ImageBoxへ表示
図形を描画したものをImageBoxへ表示します。
図形はImageBoxの大きさに合わせて拡大縮小されます。
(あらかじめ、ImageBoxをメインウィンドウに配置してください)
まず、Declare宣言部分の下へ以下のグローバル変数を定義します
コード:
'保持しておくべき拡張メタファイルハンドル
Dim memKeepEMF As DWord
次に、MainWnd_Destroy()イベントに次のように書き加えます
コード:
Sub MainWnd_Destroy()
'拡張メタファイルのハンドルを破棄する
DeleteEnhMetaFile(memKeepEMF)
*****_DestroyObjects()
PostQuitMessage(0)
End Sub
次に、CommandButton1がクリックされたときのイベントに以下のように
書き加えます。
コード:
Sub MainWnd_CommandButton1_Click()
'一旦、拡張メタファイルのハンドルを破棄する
DeleteEnhMetaFile(memKeepEMF)
'メモリデバイスコンテキストハンドル
Dim memEMFDC As DWord
'図形の塗りつぶし色。
Dim colorBrush As DWord
Dim colorOldBrush As DWord
'図形の線色。
Dim colorPen As DWord
Dim colorOldPen As DWord
'メモリ内に拡張メタファイルを作成。
'CreateEnhMetaFileの第3引数がByVal 0となっているが、
'描画するもののサイズに沿って変更されるので問題ない
memEMFDC = CreateEnhMetaFile(0, NULL, ByVal 0, 0)
'メモリデバイスコンテキストのブラシを交換する
'ブラシ色=黄色
colorBrush = CreateSolidBrush(RGB(255,255,0))
colorOldBrush = SelectObject(memEMFDC,colorBrush)
'メモリデバイスコンテキストのペンを交換する
'青色・太さ2の実線
colorPen = CreatePen(PS_SOLID,2,RGB(0,0,255))
colorOldPen = SelectObject(memEMFDC,colorPen)
'メモリデバイスコンテキストへ描画する
'ここでは☆形を描く
Dim pPoint[9] As POINTAPI
pPoint[0].x = 0 :pPoint[0].y = 30
pPoint[1].x = 35 :pPoint[1].y = 30
pPoint[2].x = 50 :pPoint[2].y = 0
pPoint[3].x = 65 :pPoint[3].y = 30
pPoint[4].x = 100 :pPoint[4].y = 30
pPoint[5].x = 75 :pPoint[5].y = 55
pPoint[6].x = 85 :pPoint[6].y = 100
pPoint[7].x = 50 :pPoint[7].y = 75
pPoint[8].x = 15 :pPoint[8].y = 100
pPoint[9].x = 25 :pPoint[9].y = 55
Polygon(memEMFDC,pPoint[0],10)
'描画がすんだらメモリデバイスコンテキストのブラシとペンを戻す
SelectObject(memEMFDC,colorOldBrush)
SelectObject(memEMFDC,colorOldPen)
'メモリデバイスコンテキストを閉じて
'拡張メタファイルのハンドルを取得する
memKeepEMF = CloseEnhMetaFile(memEMFDC)
'イメージボックスへ拡張メタファイルを扱うように指示
'定数「SS_ENHMETAFILE」はABで定義済みだが、ヘルプには記載されていない。
'「SS_METAPICT」とすると失敗するのでご注意!
SetWindowLong(GetDlgItem(hMainWnd,ImageBox1),GWL_STYLE,GetWindowLong(GetDlgItem(hMainWnd,ImageBox1),GWL_STYLE) Or SS_ENHMETAFILE Or WS_BORDER)
'イメージボックスへ拡張メタファイルのハンドルを渡す
SendMessage(GetDlgItem(hMainWnd,ImageBox1),STM_SETIMAGE,IMAGE_ENHMETAFILE,memKeepEMF)
UpdateWindow(GetDlgItem(hMainWnd,ImageBox1))
'不要になったブラシとペンを破棄
DeleteObject(colorBrush)
DeleteObject(colorPen)
End Sub
・ファイルから読み込んでImageBoxへ表示
ファイルに保存してある拡張メタファイルをImageBoxへ表示します。
図形はImageBoxの大きさに合わせて拡大縮小されます。
(あらかじめ、ImageBoxをメインウィンドウに配置してください)
***12/10 15:20 追加訂正
最初に提示したサンプルのDeclare宣言に加えて、以下の宣言を追加します。
コード:
Declare Function GetEnhMetaFile Lib "gdi32" Alias "GetEnhMetaFileA" _
(lpszMetaFile As BytePtr) As DWord
***************
次に、Declare宣言部分の下へ以下のグローバル変数を定義します
コード:
'保持しておくべき拡張メタファイルハンドル
Dim memKeepEMF As DWord
次に、MainWnd_Destroy()イベントに次のように書き加えます
コード:
Sub MainWnd_Destroy()
'拡張メタファイルのハンドルを破棄する
DeleteEnhMetaFile(memKeepEMF)
*****_DestroyObjects()
PostQuitMessage(0)
End Sub
次に、CommandButton1がクリックされたときのイベントに以下のように
書き加えます。
コード:
Sub MainWnd_CommandButton1_Click()
'一旦、拡張メタファイルのハンドルを破棄する
DeleteEnhMetaFile(memKeepEMF)
'拡張メタファイルを読み込み、ハンドルを取得する
'ファイル名は、実際に存在するものを指定すること
memKeepEMF = GetEnhMetaFile("C:\Test.emf")
'イメージボックスへ拡張メタファイルを扱うように指示
'定数「SS_ENHMETAFILE」はABで定義済みだが、ヘルプには記載されていない。
'「SS_METAPICT」とすると失敗するのでご注意!
SetWindowLong(GetDlgItem(hMainWnd,ImageBox1),GWL_STYLE,GetWindowLong(GetDlgItem(hMainWnd,ImageBox1),GWL_STYLE) Or SS_ENHMETAFILE Or WS_BORDER)
'イメージボックスへ拡張メタファイルのハンドルを渡す
SendMessage(GetDlgItem(hMainWnd,ImageBox1),STM_SETIMAGE,IMAGE_ENHMETAFILE,memKeepEMF)
UpdateWindow(GetDlgItem(hMainWnd,ImageBox1))
End Sub