投稿者 yamada  (社会人) 投稿日時 2010/7/29 22:57:08
さっそくありがとうごさいます。
調べたサンプルをそのまま張り付けてしまったのがバレバレですが、VB6のLongは2008ではIntegerになるのをうっかりしていました。そのほかにも書き方がずいぶん違うみたいですね。
MarshalAs属性で型が定義されていないというエラーが出るのも何とか克服しました。

>塗りつぶし情報は、SelectObject API で切り替えます。
とのことで、これについて調べてみるとVB6中級講座に6.ペンとブラシという項目があったので、それを参考に書き換えてみました。
Imports System.Runtime.InteropServices
Public Class Form1

    Private Declare Function ExtFloodFill Lib "gdi32" ( _
    ByVal hdc As IntPtr, _
    ByVal x As Integer, _
    ByVal y As Integer, _
    ByVal crColor As Integer, _
    ByVal wFillType As UIntegerAs <MarshalAs(UnmanagedType.Bool)> Boolean


    'hdc             '/* 塗りつぶしを行うデバイスハンドル */ 
    'x             '/* 塗りつぶしを行う開始座標(x) */ 
    'y             '/* 塗りつぶしを行う開始座標(y) */ 
    'crColor       '/* 塗りつぶしを行う対象色 or 境界線色 */ 
    'wFillType      '/* 塗りつぶしモードフラグ */ 

    '/* 塗りつぶしモードフラグ */ 
    Public Const FLOODFILLBORDER As UInteger = 0UI
    '/* crColorの色の境界線色まで塗りつぶしなさいモード */ 
    Public Const FLOODFILLSURFACE As UInteger = 1UI
    '/* crColorの色の部分を塗りつぶしなさいモード */ 

    Private Declare Function CreateBrushIndirect Lib "gdi32" _
        (ByVal lpLogBrush As LOGBRUSH) As <MarshalAs(UnmanagedType.Bool)> Boolean
    Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As IntPtr, _
        ByVal hObject As IntegerAs <MarshalAs(UnmanagedType.Bool)> Boolean
    Private Structure LOGBRUSH
        Public lbStyle As Integer
        Public lbColor As Integer
        Public lbHatch As Integer
    End Structure

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        Dim g As Graphics = Me.CreateGraphics

        Dim hdc As IntPtr = Me.Handle
        Dim x As Integer = 150
        Dim y As Integer = 150
        Dim crcolor As Integer = ColorTranslator.ToWin32(Me.BackColor)
        Dim wFillType As UInteger = FLOODFILLSURFACE

        Dim hNewBrush As Integer
        Dim hOldBrush As Integer
        Dim NewBrush As LOGBRUSH

        g.Clear(Me.BackColor)
        g.DrawRectangle(Pens.Red, 100, 100, 100, 100)

        'ブラシの作成 
        NewBrush.lbColor = ColorTranslator.ToWin32(Color.Blue)
        NewBrush.lbStyle = 0
        NewBrush.lbHatch = 5
        hNewBrush = CreateBrushIndirect(NewBrush) 'ここでエラー 

        'ブラシを持ち替える 
        hOldBrush = SelectObject(hdc, hNewBrush)

        ExtFloodFill(hdc, x, y, crcolor, wFillType)

    End Sub
End Class

これを実行すると
hNewBrush = CreateBrushIndirect(NewBrush)のところで、AccessViolationExceptionはハンドルされませんでした。保護されているメモリに読みとりまたは書き込み操作を行おうとしました。
というエラーになります。
これはなぜでしょうか。

APIを使わない方法ですが、シード・フィル アルゴリズムを調べてみたところ、2008にはPointと言うメソッドがないというのが大問題でここでまた進まなくなってしまいました。
bitmapならGetPixelが使えるのですが、FormやPictureBoxなどは、調べてみてもBackColorプロパティを使うとかここでは意味のないことしかわかりませんでした。