tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 という古い開発環境な組み合わせですから。

不明点を具体的に挙げてもらえれば説明はしますし、必要であればサンプルを提示することもできますが、
流石に一から十まで教えるわけにはいかないので…どこまでできていて、何が分からないのかを
明確にしてみてください。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。