2

MFC C++ アプリを構築しています。ウィンドウを動的文字列の形状にレンダリングする必要があります。これをアーカイブするために、次のことを行いました。

  1. GDI+ を使用して、 GDI + を使用GraphicsPathしてテキストをレンダリングするAddString
  2. Regionからオブジェクトを作成するGraphicsPath
  3. に変換RegionCRngて使用SetWindowRgnし、ウィンドウの形状を設定します

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

OnInitDialog

CClientDC dc(this);
Graphics graphics(dc.GetSafeHdc());
graphics.SetSmoothingMode(SmoothingModeAntiAlias);
graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);

GraphicsPath path;
FontFamily fontFamily(L"Arial");
StringFormat strformat;
wchar_t pszbuf[] = L"testString";
path.AddString(pszbuf, wcslen(pszbuf), &fontFamily, FontStyleRegular, 14, 
Gdiplus::Point(0,16), &strformat );
Region myRgn(&path);    

CRng rgn;
rgn.FromHandle(myRgn.GetHRGN(&graphics));
SetWindowRgn(rgn,TRUE) ;

OnPaint

RECT rect;
GetWindowRect(&rect);
CBrush brush;
brush.CreateSolidBrush(color);
paint_dc.FillRect(&rect, &brush);

問題は、何も表示されていないことです。コメントはありますか?

4

3 に答える 3

0

「CRgn::FromHandle()」は、CRgn を返す静的関数です。

使用する

CRgn * rgn = CRgn::FromHandle(myRgn.GetHRGN(&graphics));

それ以外の

rgn.FromHandle(myRgn.GetHRGN(&graphics));
于 2014-02-14T09:39:18.427 に答える
0

これを機能させる最善の方法は、CRgn変数が.xml にあることを確認することOnPaintです。CRgn終了するとすぐに範囲外になりOnInitDialogます 次に、ClientDCの代わりに. を使用しWindowDCます。からアクセスできるように、 Graphics/変数をグローバルに変更する必要がある場合があります。お役に立てれば。GraphicsPathOnPaint

于 2013-04-28T22:14:58.180 に答える
0

1 つの問題は、ウィンドウが描画される前に CRgn が範囲外になることです。ドキュメント ( http://msdn.microsoft.com/en-us/library/aa930600.aspx ) を見ると、「システムはリージョンのコピーを作成しません」と書かれています。CRgn をウィンドウ クラスのメンバー変数として使用してみて、それが役立つかどうかを確認してください。

于 2013-02-28T19:07:21.843 に答える