2017-10-11 21 views
0

article in MSDNからのコピー貼り付けである「シンプルな」ストレートフォワードコードは出力を生成しません。私は、座標が正しいことを確認するために、いくつかの行(プレーンなGDIで描画)を追加しました。これらの行はうまく動作します。MFCアプリケーション内のGdiplus :: PathGradientBrushは描画されません

コードはSTATICコントロールの背景を変更しており、描画はOnPaintハンドラーで実行されます。 OnCtlColorは、このSTATICコントロールのNULL_BRUSHを返すように拡張されているため、フレームワークによるペイントオーバーはありません。

GDI +のオブジェクトとメソッドの状態をチェックすると(デバッガとログ経由で)、すべてが正常であることがわかります。私は迷っています。このパズルを解くのを手伝ってください。

CPaintDC dc(this); 
Graphics graphics(dc); 
CRect rc; 
GetDlgItem(IDC_STATIC_GS_COLOR)->GetWindowRect(&rc); // the STATIC to paint 
ScreenToClient(&rc); 

// GDI+ uses real numbers, not integers 
const Rect gdirc = Rect(rc.left, rc.top, rc.Width(), rc.Height()); 

// next 2 lines work just fine - painting a RED background 
const SolidBrush solidBrush((ARGB)Color::Red); 
graphics.FillRectangle(&solidBrush, gdirc); 

const PointF sz(rc.Width() - 1, rc.Height() - 1); 
PointF pts[] = {PointF(0, 0), PointF(sz.X, 0), PointF(sz.X, sz.Y), PointF(0, sz.Y)}; 
PathGradientBrush brush(pts, 4); 

Color colors[] = {Color(0, 0, 0), Color(255, 0, 0), Color(0, 255, 0), Color(0, 0, 255)}; 
int count = 4; 
brush.SetSurroundColors(colors, &count); 
brush.SetCenterColor(Color(128, 128, 128)); 

// !!!!! this doesn't fail, returns a status OK, and has NO EFFECT on the image :(
const auto status = graphics.FillRectangle(&brush, gdirc); 

// this draws a smaller inner GREEN rectangle, works as expected 
rc.DeflateRect(20, 20); 
dc.FillSolidRect(&rc, m_rgb); 

答えて

0

ブラシのに第三、デフォルトパラメータとして使用されているWrapMode列挙、上MSDN documentationによると:

ここでは、関連するコードは(削除エラー処理とstatic_cast年代、私は\ W4のために持っている)ですコンストラクタは、デフォルト値WrapModeClampは意味:

WrapModeClamp
にはタイリングは取らないことを指定します場所。

コンストラクタに3番目のパラメータを追加し、WrapModeTile値を指定すると、ペイントが開始されました。

Gdiplus::PathGradientBrush brush(pts, 4, WrapModeTile); 

ORことが予想されるパターンをペイントして、正しくそれを相殺するためにブラシのTranslateTransformを使用!この場合、タイリングが不要になるので、タイリングを指定する必要はありません。

関連する問題