2016-05-20 19 views
0

以下は関連するコード行です。基本的に私は、より大きなビットマップを作成し、これに描画し、それからより小さなイメージを作成し、それを画面(wxDC mdc)に描画します。それを透明にするために、まずwxMemoryDCとwxGCDCを使用します。これが私がどのようにして分かりますか?wxWidgets描画の透明性の問題

問題は、切り抜かれたsub_bmpに何も描画されていない場合を除き、完全に機能し、透明ではなく黒い背景が描画されることです。

アイデア?

*bmp = wxBitmap(bwidth, bheight, 32);  
bmp->UseAlpha(); 
wxColor colour; 
colour.Set("#800020"); 
penWidth = 4; 
mdc->SetPen(wxPen(colour, penWidth)); 
wxMemoryDC memDC (*bmp); 
wxGCDC dc(memDC); 
dc.SetBackground(*wxTRANSPARENT_BRUSH); 
dc.Clear(); 

dc.SetBrush(*wxRED_BRUSH); 
dc.SetPen(wxPen(colour, penWidth)); 
... 
b1.x = pix_offset_x - (cpix.x - b1.x);     
b1.y = pix_offset_y - (cpix.y - b1.y); 
b2.x = pix_offset_x - (cpix.x - b2.x); 
b2.y = pix_offset_y - (cpix.y - b2.y); 

dc.DrawLine(b1, b2); 
memDC.SelectObject(wxNullBitmap);   //releases the bitmap from memDC 
wxRect subSize(xloc,yloc , vp->pix_width*scaleFactor, vp->pix_height*scaleFactor); 
wxBitmap sub_bmp = bmp->GetSubBitmap(subSize); 
wxImage tmpimg = sub_bmp.ConvertToImage(); 
const wxBitmap tbmp(tmpimg.Scale(t_width, t_height),32); 
mdc->DrawBitmap(tbmp, 0, 0, true); 
+1

これはEVT_PAINT内で行っていますか?はいの場合 - wxPaintDCを作成しましたか?そうでない場合は、EVT_PAINT内でこれを行う必要があります。新しいペイントイベントがすべてあなたのビットマップを上書きするからです。 – Igor

+0

bmpは.hファイル内でグローバルに宣言されており、プラグインを作成しているコアプログラムからwxDCが与えられています。それがmdcです。私はwxPiantDCを作成しません。 – user1489223

+0

あなたはEVT_PAINTから絵を描いていますか?この場合、wxPaintDCを使用しない場合でも作成する必要があります。または、あなたはmdcがwxPaintDCオブジェクトであると言っていますか? – Igor

答えて

0

あなたはwxWidgetsの最近のバージョンを使用していると仮定すると、あなたはwxImageに直接描くことができますが、最初にセットアップアルファチャンネルを必要があります。

次に、画像を拡大縮小して、現在行っているように、提供されているmdcにコピーすることができます。

// Setup the alpha channel. 
unsigned char* alphaData = new unsigned char[bwidth * bheight]; 
memset (alphaData, wxIMAGE_ALPHA_TRANSPARENT, bwidth * bheight); 

// Create an image with alpha. 
wxImage image (wxSize(bwidth, bheight)); 
image.SetAlpha (alphaData); 
wxGraphicsContext* gc = wxGraphicsContext::Create (image); 

gc->SetPen (wxPen(colour, penWidth)); 
gc->SetBrush (wxTRANSPARENT_BRUSH); 

// Do drawing here .... 

// Release the graphics context. 
delete gc; 

// Scale the image and convert to a bitmap. 
wxBitmap outBmp (image.Scale(t_width, t_height), 32); 

// Blit it to the provide mdc. 
mdc->DrawBitmap (outBmp, wxPoint(x,y)), true); 
+0

ちなみに、 'image.SetAlpha'は、' alphaData'メモリ割り当てステップを避けるためのパラメータとしてNULLを取ることができますが、私はそれがアルファチャンネルをどのように初期化するのかは分かりません。 – iwbnwif

関連する問題