一文字ごとにフォントを変える方法

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Cursol

一文字ごとにフォントを変える方法

#1 投稿記事 by Cursol »

フォントの大きさを一文字ごとに変えてスタティックテキストに文字を書きたいと思っています。取りあえずフォントをかえるのには

1)CreateFont()関数で変更用のフォントを作成する。
2)SendDlgItemMessage()で設定
3)SetWindowText()で文字を描写
4)使い終わったらDeleteObject()で削除

と言った感じで出来るのはわかったのですが一文字ごとに変えることが出来ません。どのようにしたらよいのでしょうか?
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

スタティックテキストは1文字ずつフォントを帰るというようなことは出来ないと思います。
TextOutやGetTextExtentPoint32などを駆使して自分で描かなければならないと思います。
Cursol

RichEditコントロールを使う事にしました

#3 投稿記事 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
Cursol

やっとできた!

#4 投稿記事 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 
返信する