投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/7/30 15:33:03
> この時点で魔界の弁護士さんのご指摘に気付きました。
弁護士ジャナイデスヨー? (ಥ_ಥ)
http://yaplog.jp/orator/archive/20

> ハンドルを渡すのではなくデバイスコンテキストなるものを渡すのだとわかりました。
ここで渡すデバイスコンテキストもハンドルです。
「ウィンドウ ハンドル(HWND)」と「デバイスコンテキスト ハンドル(HDC)」の違いですね。

デバイスコンテキストとは、描画ツールを意味するオブジェクトです。
いわば画材や画用紙。VB2008 で言えば、Brush/Pen/Font などを表します。
(ウィンドウについては説明不要ですよね)

ちなみに、デバイスコンテキスト ハンドルと Grapchis オブジェクトは、
Grapchis.FromHdc メソッド/Graphics.GetHdc メソッドを通じて変換できます。


> Private Declare Function CreateBrushIndirect Lib "gdi32" (ByRef lpLogBrush As LOGBRUSH) As IntPtr
Declare 宣言は正しくなりましたが、使い方が間違ったままです。

現在のコードは
> Dim hNewBrush As Integer
> hNewBrush = CreateBrushIndirect(NewBrush)
のように Integer で受けていますが、これは誤りです。API 宣言の戻り値は
As IntPtr なのですから、それを受け取る変数も As IntPtr にする必要があります。


> Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As IntPtr, _
>  ByVal hObject As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
戻り値の型が間違っています。UnmanagedType.Bool にしてはいけません。
先ほどの CreateBrushIndirect と同様、この戻り値も IntPtr とすべきです。

そもそも、使用時に
> Dim hOldBrush As Integer
> hOldBrush = SelectObject(hwdc, hNewBrush)
--
> Dim hNewBrush As Integer
> hNewBrush = SelectObject(hwdc, hOldBrush)   '元のブラシに戻す 
のように、Integer 型に入れているのですから、宣言側が Boolean ではおかしいですよね。


> Dim g As Graphics = Me.CreateGraphics
よねKENさんも指摘されていますが、CreateGraphics() メソッドは
基本的には使わないようにしましょう。