どうも、まどかですぅ。
さかなさんいらっしゃいませ。どうもはじめまして(^^
>まずCommand1をクリックしたらForm1に文字が描画されるよう、下記のような
>ソースを書いてみましたが、ボタンをクリックしても何もおこりません。
>少しお手上げ状態になっていますので、どなたかサンプルになるソース教えてください。
まず、GGO_BITMAPを指定するとアンチエイリアス無しの文字がモノクロ1bitのBMP
として生成されるので、もしこの処理が上手く動いたとしてもアンチエイリアスは
かかりません。
それと、おそらくこのソースは
http://www.systemyou.co.jp/tips/delphi/tips2.htm
ここを参考に書かれているのだと思いますが、この掲示板に書いていただいた
ソースを見る限り、pBmp2にメモリは確保するものの、pBmp2に対してpBmpの内容
をコピーしていないので、描画に成功したとしても何も描かれないでしょう。
また、確保したメモリはちゃんと解放してくださいね。
そして最後の
hbmpold = SelectObject(Form1.hdc, hbmp)
BitBlt hbmp, 0, 0, 100, 100, Form1.hdc, 0, 0, vbSrcCopy
という2行ですが、作成したhbmpを描画先のデバイスコンテキストに選択している
のが間違っているのと、BitBltの第一引数は転送先のデバイスコンテキストの
ハンドルなので、hbmp(ビットマップのハンドル)だと、BitBltは失敗してしまいます。
というわけで、さかなさんのソースが上手く動かないのは極端な話、失敗している
からということになりますね(^^;
GetGlyphOutlineを利用するサンプルは非常に少なく、特にVBではほとんど無いよう
なので、簡単ではありますが、取得したアンチエイリアス付きの文字データを1ピク
セルずつ描画するサンプルをVBで書いてみましたので、良かったら参考にして下さい。
GetGlyphOutlineで取得できるデータは、GGO_GRAY4_BITMAP等を指定してアンチエイリ
アスをかけた場合、単純なBMPデータではなく、前景色の背景色に対する合成比率と
して返って来る(いわゆるアルファ値)ので、描画する際はその描画比率に従って、
1ピクセルずつ色を変えて描画していくというのが妥当な処理だと思います。
ただし、1ピクセルずつ描いていくのでかなり遅い処理になってしまうと思います。
もしかしたらもっと高速に描画するやり方があるのかもしれませんが、今のところ
よく判ってません(j−j
以下にサンプルコードを書いておきます。
一応動作確認はしましたが、もし動かない場合は状況を教えてくださいね。
Private Sub Command1_Click()
Dim mat As MAT2
Dim uicharacter As Long
Dim dsize As Long
Dim pBMP() As Byte
Dim gm As GLYPHMETRICS
Dim Align As Integer
Dim x, y As Integer
Dim color As Integer
With mat
.eM11.Value = 1 '-1にすると左右反転
.eM12.Value = 0
.eM21.Value = 0
.eM22.Value = 1 '-1にすると上下反転
End With
'GetGlyphOutlineは1文字ずつしか扱えません
uicharacter = Asc("あ")
'データ格納に必要なサイズを計算
'フォントの種類、サイズ等はForm1のフォント設定に依存します
dsize = GetGlyphOutline(Form1.hdc, uicharacter, GGO_GRAY4_BITMAP, gm, 0, Null, mat)
'必要なサイズのメモリを確保
ReDim pBMP(dsize)
'アンチエイリアス付きの文字DIBデータを取得(1ピクセル=1バイト)
'GGO_GRAY4_BITMAPだと、17階調(0〜16)のアンチエイリアスになります
GetGlyphOutline Form1.hdc, uicharacter, GGO_GRAY4_BITMAP, gm, dsize, pBMP(0), mat
'1行のバイト数を算出(4バイト境界になります)
Align = CInt(((gm.gmBlackBoxX + 3) \ 4) * 4)
'取得した文字DIBのアルファ値を利用してアンチエイリアス文字を1ピクセルずつ描画
'ちゃんとした描画位置を計算するには、以下のサイト等の計算式を使用してください
'http://home.att.ne.jp/yellow/hide_n/programming/tips08.html
For y = 0 To gm.gmBlackBoxY - 1
For x = 0 To gm.gmBlackBoxX - 1
'色は白地に黒になります
color = 255 - pBMP(y * Align + x) * (255 / 17)
'Form1のScaleModeはピクセルにして下さい
Form1.PSet (x, y), RGB(color, color, color)
Next x
Next y
End Sub