タイトル : Re: ギザギザのない、なめらか直線と円を描きたいです。 投稿日 : 2023/08/24(Thu) 21:41 投稿者 : 魔界の仮面弁士
> そこで、本サイトより「GdiPius.bas」をダウンロード致しました。 どこにあったものでしょうか? GdiPius.bas というのが GdiPlus.bas のことだったとしても、出所が分かりませんでした。 自分の場合は、SDK を基にして Const や Declare を自前で書いてしまうタチゆえ そのような .bas の存在自体把握していませんでした。 一応探してみたのですが、似たような名前の物が幾つか見つかったものの、 「本サイト」にあたる URL が何処か分かりませんでした。 ここのサイト (VB レスキュー) にありましたっけ? https://github.com/peterennis/aegit/blob/master/aerc/src/basGDIPlus.bas https://github.com/Planet-Source-Code/avery-use-gdi-aka-gdiplus-with-vb6-and-win98__1-37541/blob/master/GDIPlus%20API.bas http://freesourcecode.net/vbprojects/17603/sourcecode/ModGDIPlus.bas > SmoothingModeを使えば良さそうなのですが、 GDI+ で線を描画する時のアンチエイリアス処理であれば、そのとおりです。 .NET Framework の世界では、Graphics クラスの SmoothingMode プロパティを使い、 C++ のクラスでは、Graphics オブジェクトの SetSmoothingMode / GetSmoothingMode を使い、 GDI+ Flat API では、GdipSetSmoothingMode 関数 / GdipGetSmoothingMode 関数を使います。 ちなみに、文字を描画するときのアンチエイリアス処理ならば、TextRenderingHint です。 ( GdipSetTextRenderingHint / GdipGetTextRenderingHint ) 要件次第では PixelOffsetMode も併用すると良いかも知れません。 ( GdipSetPixelOffsetMode / GdipGetPixelOffsetMode ) > どのようにプログラムコードを記述すれば良いのか分かりません。 > Public declare Function GripsetSmoothingMode〜なる関数も示されており、とても興味深いのですが、 GripsetSmoothingMode (グリップ セット スムージング モード) というのは GdipSetSmoothingMode (ジーディーアイピー セット スムージング モード) のことですね。 スペルミスもそうですが、API 宣言では大文字小文字も区別されるので、正しく記述しましょう。 > どのようにこの関数を使えば「アンチエイリアス処理」が可能になるのか知りたいと思っております。 第一引数には、Graphics オブジェクトのハンドルを渡し、 第二引数には、下記の SmoothingMode 列挙定数を指定します。 この指定は、直線、曲線、および塗りつぶし領域の境界部に適用されます。 Public Enum SmoothingMode SmoothingModeInvalid = -1& '(無効なモードであることを表します) SmoothingModeDefault = 0& 'アンチエイリアス無しの既定の曲線スムージング SmoothingModeHighSpeed = 1& 'アンチエイリアス無しの最高パフォーマンス SmoothingModeHighQuality = 2& 'アンチエイリアス付きの最高品質 SmoothingModeNone = 3& '曲線スムージングもアンチエイリアス処理も行いません SmoothingModeAntiAlias = 4& '8x4 ボックス フィルターを使用したアンチエイリアス処理を行います #If GDIPVER >= &H110 Then SmoothingModeAntiAlias8x4 = SmoothingModeAntiAlias SmoothingModeAntiAlias8x8 = 8& '8x8 ボックス フィルターを使用したアンチエイリアス処理を行います #End If End Enum ※ SmoothingModeAntiAlias8x8 の利用には、GDI+ version 1.1 以降が必要です。(Vista 以降) 詳細は、GDI+ Flat API ドキュメント(の Graphics オブジェクトの項) をご覧ください。 https://learn.microsoft.com/ja-jp/windows/win32/gdiplus/-gdiplus-flatapi-flat 関数定義は、Windows SDK の gdiplusflat.h で示されています。 SmoothingMode の定義は、gdiplusenums.h をお読みください。 Windows SDK をお持ちでない場合は、下記から最新版 [Windows 11 SDK (10.0.22621.0)] を入手できます。 https://developer.microsoft.com/ja-jp/windows/downloads/windows-sdk/ なお「ボックス フィルター」とは、長方形領域内のピクセルの平均を算出することによって ピクセルの新しい値を計算するアンチエイリアス アルゴリズムです。(これが役に立つのは縮小時のみ) https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-emfplus/08ea5d19-dbd9-4056-9db3-424d8f47c3c1 https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-emfplus/bbd10016-833c-4da5-ba4b-6c9ae93c67f2#gt_5ec85b39-64a4-4fae-8a36-366c39238fb9 > また、この関数を使うに当たって、何か注意点等がありましたら教えて頂きたく存じます。 今回提示した参考資料などを基にして VB6 に翻訳して実装できそうですか? 正直なところ、自力調査して実装できるだけの基礎力が無いのであれば、諦めた方が無難かと思います。 何しろ、GDI+ の Flat API は公式には unsupported ですし、ましてや今回は、 利用元が VB6 という古い開発環境な組み合わせですから。 不明点を具体的に挙げてもらえれば説明はしますし、必要であればサンプルを提示することもできますが、 流石に一から十まで教えるわけにはいかないので…どこまでできていて、何が分からないのかを 明確にしてみてください。 |