ページ 1 / 1
一文字ごとにフォントを変える方法
Posted: 2005年6月20日(月) 00:39
by Cursol
フォントの大きさを一文字ごとに変えてスタティックテキストに文字を書きたいと思っています。取りあえずフォントをかえるのには
1)CreateFont()関数で変更用のフォントを作成する。
2)SendDlgItemMessage()で設定
3)SetWindowText()で文字を描写
4)使い終わったらDeleteObject()で削除
と言った感じで出来るのはわかったのですが一文字ごとに変えることが出来ません。どのようにしたらよいのでしょうか?
Posted: 2005年6月20日(月) 19:56
by イグトランス
スタティックテキストは1文字ずつフォントを帰るというようなことは出来ないと思います。
TextOutやGetTextExtentPoint32などを駆使して自分で描かなければならないと思います。
RichEditコントロールを使う事にしました
Posted: 2005年6月22日(水) 00:30
by Cursol
>スタティックテキストは1文字ずつフォントを変えるというようなことは出来ないと思います
どうもそのようなのでRichEditコントロールで実現させようと思っています。とりあえずこないだの文章では伝わりにくかった面が有りますのでやりたいことをもう少し具体的に言うと化学式のようにC6H5OHの数字の部分を表示させるとき(計算結果と同時に化学式を表示したい)数字の部分を下付文字にしたいと考えています。RichEditではどうやら出来そうなので現在使い方を勉強中です。とりあえずテストをしているのですが残念ながらうまくいっていません。下のコードは一度文字を表示させて文字を選択してその部分の表示を変えようとしているのですが全く変化がありません。なぜなのでしょうか?
コード: 全て選択
Dim text1 as string
Dim cf1 As CHARFORMAT
Dim cf2 As CHARFORMAT
Dim hrEdit as Long
Dim hLib as Long
Const RichEdit = &HFF00
Const MaxText = 1024
Sub MainWnd_Destroy()
DestroyWindow(hrEdit) 'リッチエディットを破棄(1)
FreeLibrary(hLib) 'ライブラリを開放(2)
font_test_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
'RICHED32.DLL のロード
hLib = LoadLibrary("RICHED32.DLL")
'リッチエディットコントロールの作成
hrEdit = CreateWindowEx(0, _ '拡張ウィンドウスタイル
"RichEdit", _ 'ウィンドウクラス名
"", _ 'ウィンドウタイトル
WS_CHILD or WS_VISIBLE or WS_VSCROLL or _
ES_MULTILINE or ES_AUTOVSCROLL, _
10, 10, 560, 460, _ 'あとで、リサイズイベントで大きさを変える
hMainWnd, _ '親ウィンドウ
RichEdit, _ 'コントロールID
GetModuleHandle(0), _ 'インスタンスハンドル
0)
'テキストの上限を設定
SendMessage(hrEdit,EM_EXLIMITTEXT,0,MaxText)
text1 = "1つ目"
With cf1
.cbSize = SizeOf(CHARFORMAT)
.dwMask = CFM_FACE or CFM_OFFSET or CFM_SIZE or CFM_CHARSET
.yHeight = 22
.bCharSet = 128
.yOffset = -110
lstrcpy(.szFaceName,"MS ゴシック")
End With
With cf2
.cbSize = SizeOf(CHARFORMAT)
.dwMask = CFM_FACE or CFM_SIZE or CFM_CHARSET
.yHeight =270
.bCharSet = 128
lstrcpy(.szFaceName,"MS ゴシック")
End With
SendMessage(hrEdit,EM_SETCHARFORMAT,SCF_ALL,VarPtr(cf2))
SetWindowText(hrEdit,text1) '一度文字をセットする。
SendMessage(hrEdit,EM_SETSEL,1,3) '文字を選択する
SendMessage(hrEdit,EM_SETCHARFORMAT,SCF_SELECTION,VarPtr(cf1))'選択箇所の文字の設定を変える。
End Sub
やっとできた!
Posted: 2005年6月22日(水) 17:57
by Cursol
自己レスです。とりあえず過去ログ等などみていると、CHARFORMAT構造体のサイズが「60」となっていることに気がつきました。そこで以下の様に修正したところちゃんと変更できる様になりました。
コード: 全て選択
With cf1
.cbSize = SizeOf(CHARFORMAT) + 2 '+2をすることで60になる
.dwMask = CFM_FACE or CFM_OFFSET or CFM_SIZE or CFM_CHARSET
.yHeight = 22
.bCharSet = 128
.yOffset = -110
lstrcpy(.szFaceName,"MS ゴシック")
End With
With cf2
.cbSize = 60 '素直に60と書いた方が楽ですね…
.dwMask = CFM_FACE or CFM_SIZE or CFM_CHARSET
.yHeight =270
.bCharSet = 128
lstrcpy(.szFaceName,"MS ゴシック")
End With