4

ユーザーがグラフ上のスポットをクリックしたときに、画像の上に長方形を描画しようとしています。

さまざまなグラフをスクロールするために、staticBitmap を使用しています。残念ながら、DC での試みはほぼすべて失敗しています。PaintDC と BufferedDC の両方で、無限ループが発生したり、描画が画像の背後に置かれたりすることがあります。ClientDC には、描いたボックスが表示されますが、サイズを変更すると消えます。画像だけをファイルに保存すると、MemoryDC を使用して図面を作成できましたが、staticBitmap に配置できませんでした。

私はこの問題に約 1 週間を費やし、非常に多くの異なるチュートリアルやフォーラムを読んで、この同じ問題を見つけようとしました。この問題を抱えている人は他にいないような気がします。

最も機能する ClientDC は、ウィンドウのサイズが変更されるたびに再描画する必要があり、ちらつきが発生します。ここに私がClientDCのために持っているものがあります:

    self.imageCtrl = wx.StaticBitmap(self.thePanel, wx.ID_ANY, 
                                     wx.EmptyBitmap(517,524))

def OnGoSelect(self,e):
    print "GO"
    img = wx.Image("./poster/"+self.picChoice,wx.BITMAP_TYPE_PNG) 
    self.imageCtrl.SetBitmap(wx.BitmapFromImage(img))

def DrawLine(self):
    dc = wx.ClientDC(self.imageCtrl)
    dc.SetPen(wx.Pen(wx.BLUE, 2))
    dc.DrawLines(((223, 376), (223, 39), (240, 39), (240,376), (223,376)))

現在の PaintDC は無限ループには入りませんが、代わりに画像が staticBitmap に配置され、何らかの理由で描画が画像の背後にあります。そのため、サイズを変更すると、ComboBoxes は画像の一部を消去し、ウィンドウのサイズを変更して画像を覆うと、その部分が消去されます。ウィンドウのサイズを元に戻すと、描画は残っていますが、画像は消去されています。ここに私が持っているものがあります:

    self.imageCtrl = wx.StaticBitmap(self.thePanel, wx.ID_ANY, 
                                     wx.EmptyBitmap(517,524))

def OnGoSelect(self,e):
    print "GO"
    img = wx.Image("./poster/"+self.picChoice,wx.BITMAP_TYPE_PNG) 
    self.imageCtrl.SetBitmap(wx.BitmapFromImage(img))

    self.imageCtrl.Bind(wx.EVT_PAINT, self.OnPaint)

def OnPaint(self, e):
    print "OnPaint Triggered"
    dc = wx.PaintDC(self.imageCtrl)
    dc.Clear()
    dc.SetPen(wx.RED_PEN)
    dc.DrawLines(((100, 200), (100, 100), (200, 100), (200,200), (100,200))) 

MemoryDC については、EmptyBitmap をすべて単独で読み込み、描画してから、staticBitmap に配置しようとしました。空白の灰色の画面が表示されました。EmptyBitmap に描画しなかった場合は、通常の黒になります。描画してもファイルに保存したのですが、アプリケーション内で灰色の画面が表示されました。MemoryDC コードは次のとおりです。

    self.imageCtrl = wx.StaticBitmap(self.thePanel, wx.ID_ANY, 
                                     wx.EmptyBitmap(517,524))

def Draw(self, e):
    print "Draw" 
    img = wx.Image("./poster/Test2.png", wx.BITMAP_TYPE_ANY)
    bit = wx.EmptyBitmap(517,524)
    dc = wx.MemoryDC(bit)
    dc.SetBackground(wx.Brush(wx.BLACK))
    dc.Clear()
    dc.SetPen(wx.Pen(wx.RED, 1))
    dc.DrawLines(((83, 375), (83, 42), (120, 42), (120,375), (83,375)))
    self.imageCtrl.SetBitmap(bit)  
    bit.SaveFile("bit.bmp", wx.BITMAP_TYPE_BMP)

私は途方に暮れています。どんなアドバイスでも大歓迎です!

4

1 に答える 1

6

見つけた!

その前は、MemoryDCを使用するときに、描画先のビットマップの選択を解除する必要があることを知りませんでした。これは、wx.NullBitmapをSelectObjectメソッドに渡すことによって行われます。

MemoryDCのコードは次のとおりです。

def Draw(self, e):
    print "Draw" 
    img = wx.Image("./poster/Test2.png", wx.BITMAP_TYPE_ANY)
    bit = wx.EmptyBitmap(517,524)
    imgBit = wx.BitmapFromImage(img)
    dc = wx.MemoryDC(imgBit)
    dc.SetPen(wx.Pen(wx.RED, 1))
    dc.DrawLines(((83, 375), (83, 42), (120, 42), (120,375), (83,375)))
    dc.SelectObject(wx.NullBitmap)# I didn't know I had to deselect the DC
    self.imageCtrl.SetBitmap(imgBit)  
    imgBit.SaveFile("bit.bmp", wx.BITMAP_TYPE_BMP)
于 2012-08-03T16:11:47.227 に答える