初めての投稿です。
ActiveBasicの勉強を初めてまだ2週間の初心者です。
StaticText等のフォントを調べるのにLOGFONT構造体を取得し、
ファイス名を表示したいのですがうまくいきません。
どなたか教えていただけないのでしょうか?
勉強中ですのでその都度復帰値を調べながらやっています。
'Staticのハンドル取得
dim Static_hwnd as HWND
Static_hwnd=GetDlgItem(hMainWnd,Static1)
'Staticのデバイスコンテキスト取得
dim Static_hdc as HDC
Static_hdc=GetDC(Static_hwnd)
'Staticのフォントのハンドルを取得
dim Static_handle as HANDLE
Static_handle=GetCurrentObject(Static_hdc,OBJ_FONT)
'LOGFONT構造体のバッファを取得
dim Buffer_Need as Long
Buffer_Need=GetObject(Static_handle,0,byval NULL)
'LOGFONT構造体を取得
dim uValue1 as Long
dim Static_font as LOGFONT
uValue1=GetObject(Static_handle,Buffer_Need,Static_font)
'ファイス名を取得
dim Static_FaceName as string
Static_FaceName=MakeStr(VarPtr(Static_font.lfFaceName(0)))
'取得したファイス名を確認
dim uValue2 as Long
uValue2=SetWindowText(Static_hwnd,Static_FaceName)
LOGFONT構造体を取得してファイス名を調べる
Re: LOGFONT構造体を取得してファイス名を調べる
おそらくこれで出来てます。
本題とは関係ないのですけど、日本語訳された作品ですがたしかムーミンは全作読んだような気がします。
「こんなやつ蹴り殺しちゃおうぜ!」みたいなムーミンの台詞に「アニメと印象違う...」と思った記憶があります...(笑)
[ここをクリックすると内容が表示されます]
スタティックコントロールのデバイスコンテキストに設定されているフォントフェイスネームを取得するのであって、スタティックコントロールのそれを取得するのではないことに気を付けてください。コード: 全て選択
'Staticのハンドル取得
dim Static_hwnd as HWND
Static_hwnd=GetDlgItem(hMainWnd,Static1)
'Staticのデバイスコンテキスト取得
dim Static_hdc as HDC
Static_hdc=GetDC(Static_hwnd)
'Staticのフォントのハンドルを取得
dim Static_handle as HANDLE
Static_handle=GetCurrentObject(Static_hdc,OBJ_FONT)
'LOGFONT構造体を取得
dim uValue1 as Long
dim Static_font as LOGFONT
uValue1=GetObject(Static_handle,SizeOf(LOGFONT),Static_font)
'取得したファイス名を確認
dim uValue2 as Long
uValue2=SetWindowText(Static_hwnd,Static_font.lfFaceName)
本題とは関係ないのですけど、日本語訳された作品ですがたしかムーミンは全作読んだような気がします。
「こんなやつ蹴り殺しちゃおうぜ!」みたいなムーミンの台詞に「アニメと印象違う...」と思った記憶があります...(笑)
LOGFONT構造体を取得してファイス名を調べる
7 さん ご指導ありがとうございます。
ファイス名と思える文字列は取得しているのですが
別のコードでフォントを変更してもそのファイス名が取得できません。
RADツールで初期段階からフォントを変更してもその結果が変わらず
[System]としかファイス名がかえってきません。
LOGFONTの内容を調べると初期値の情報に思えます。
AB(API)では正確に取得でないのでしょうか?
又、不都合があるならGetTextFaceを用いた方がベターなのでしょうか?
Declare Function GetTextFace Lib "gdi32" Alias "GetTextFaceA" (
ByVal hDC As HDC,
ByVal nCount As Long,
ByVal lpFacename As *Char)As Long
ムーミンは私が小さい頃のニックネームでした。
7サンのおっしゃる通り、かわいい顔した冷血タイプの面があったかもしれませんね。
アッハハ!!!
ファイス名と思える文字列は取得しているのですが
別のコードでフォントを変更してもそのファイス名が取得できません。
RADツールで初期段階からフォントを変更してもその結果が変わらず
[System]としかファイス名がかえってきません。
LOGFONTの内容を調べると初期値の情報に思えます。
AB(API)では正確に取得でないのでしょうか?
又、不都合があるならGetTextFaceを用いた方がベターなのでしょうか?
Declare Function GetTextFace Lib "gdi32" Alias "GetTextFaceA" (
ByVal hDC As HDC,
ByVal nCount As Long,
ByVal lpFacename As *Char)As Long
ムーミンは私が小さい頃のニックネームでした。
7サンのおっしゃる通り、かわいい顔した冷血タイプの面があったかもしれませんね。
アッハハ!!!
というわけで、WM_GETFONTはどうでしょうか。これはコントロールが現在使用しているフォントのハンドルを問い合わせるメッセージです。7さん さんが書きました:スタティックコントロールのデバイスコンテキストに設定されているフォントフェイスネームを取得するのであって、スタティックコントロールのそれを取得するのではないことに気を付けてください。
コード: 全て選択
'Staticのフォントのハンドルを取得
Dim Static_handle As HFONT
Static_handle = SendDlgItemMessage(hMainWnd, Static1, WM_GETFONT, 0, 0) As HFONT
'LOGFONT構造体を取得
Dim uValue1 As Long
Dim Static_font As LOGFONT
uValue1 = GetObject(Static_handle, Len(Static_font), Static_font)
If uValue1 <> 0 Then
'取得したファイス名を確認
SetWindowText(Static_hwnd, Static_font.lfFaceName)
End If
LOGFONT構造体を取得してファイス名を調べる
イグトランス (egtra) さん ありがとうございます。
早速試してみるとファイス名が取得している事が確認できました。
おそらくLOGFONT自体が正常に取得できていると思います。
ただ、他CODEでフォント更新をするとイグトランス (egtra) さんのCODEでは再度
の呼び出しではフォント更新の結果が反映できませんでした。
おそらくコントロール用にFONTに関するハンドル,LOGFONT構造体等をグローバル変数にして呼び出すのが確実なのかと考えています。
教えていただいたCODEを参考に作ってみます。CODEができたら投稿します。
次はTEXTBOX(STATICTEXT)等の文字色、背景の変更を考えて行きます。
7 さん、 イグトランス (egtra) さん ありがとうございました。
早速試してみるとファイス名が取得している事が確認できました。
おそらくLOGFONT自体が正常に取得できていると思います。
ただ、他CODEでフォント更新をするとイグトランス (egtra) さんのCODEでは再度
の呼び出しではフォント更新の結果が反映できませんでした。
おそらくコントロール用にFONTに関するハンドル,LOGFONT構造体等をグローバル変数にして呼び出すのが確実なのかと考えています。
教えていただいたCODEを参考に作ってみます。CODEができたら投稿します。
次はTEXTBOX(STATICTEXT)等の文字色、背景の変更を考えて行きます。
7 さん、 イグトランス (egtra) さん ありがとうございました。
Re: LOGFONT構造体を取得してファイス名を調べる
> ただ、他CODEでフォント更新をするとイグトランス (egtra) さんのCODEでは再度
> の呼び出しではフォント更新の結果が反映できませんでした。
> おそらくコントロール用にFONTに関するハンドル,LOGFONT構造体等をグローバル変数にして呼び出すのが確実なのかと考えています。
おそらくコントロール自体(?)のフォントとデバイスコンテキストのフォントをごっちゃにして考えているんじゃないでしょうか?
SetWindowText()関数などで描写する文字列のフォントはコントロールのフォントに依存していて、DrawText()関数などで描写する文字列はコントロールのデバイスコンテキストのフォントに依存しています。
まずムーミンさんが、SetWindowText()関数で描写する文字列のフォントを操作したいのか、DrawText()関数で描写する文字列のフォントを操作したいのか、そこがはっきりするとなんの問題もなくスッキリ解決できると思うのですけど、どうでしょう?
> の呼び出しではフォント更新の結果が反映できませんでした。
> おそらくコントロール用にFONTに関するハンドル,LOGFONT構造体等をグローバル変数にして呼び出すのが確実なのかと考えています。
おそらくコントロール自体(?)のフォントとデバイスコンテキストのフォントをごっちゃにして考えているんじゃないでしょうか?
SetWindowText()関数などで描写する文字列のフォントはコントロールのフォントに依存していて、DrawText()関数などで描写する文字列はコントロールのデバイスコンテキストのフォントに依存しています。
まずムーミンさんが、SetWindowText()関数で描写する文字列のフォントを操作したいのか、DrawText()関数で描写する文字列のフォントを操作したいのか、そこがはっきりするとなんの問題もなくスッキリ解決できると思うのですけど、どうでしょう?
LOGFONT構造体を取得してファイス名を調べる
7 さん ヘ
おっしゃる通り、フォントといっても取得設定には幾つかの方法があると思います。
私の最終目標はDraw系のプログラムです。
コントロールの設定はコントロール自体の設定変更(表現がおかしい?)
SetWindowText等で、描画部分はDC(xxxDrawxxx)でと考えています。
DCの方が様々な設定ができる(特にプリンター?)と思っていますのでインターフェース
(コントロール)にはSetWindowText程度?で良いと思っています
※設定方法を検索していたら最初にでてきたのがSetWindowTextでした....(^^);
何か良い方法がありましたなら教えていただけないでしょうか?
おっしゃる通り、フォントといっても取得設定には幾つかの方法があると思います。
私の最終目標はDraw系のプログラムです。
コントロールの設定はコントロール自体の設定変更(表現がおかしい?)
SetWindowText等で、描画部分はDC(xxxDrawxxx)でと考えています。
DCの方が様々な設定ができる(特にプリンター?)と思っていますのでインターフェース
(コントロール)にはSetWindowText程度?で良いと思っています
※設定方法を検索していたら最初にでてきたのがSetWindowTextでした....(^^);
何か良い方法がありましたなら教えていただけないでしょうか?
Re: LOGFONT構造体を取得してファイス名を調べる
> おっしゃる通り、フォントといっても取得設定には幾つかの方法があると思います。
フォントを取得・設定する方法が幾つかあるといった感じではなく、フォントが幾つかあるので取得・設定もそれらに合わせて幾つか用意されていると言った感じじゃないかと僕は思います。
> 私の最終目標はDraw系のプログラムです。
> コントロールの設定はコントロール自体の設定変更(表現がおかしい?)
> SetWindowText等で、描画部分はDC(xxxDrawxxx)でと考えています。
> DCの方が様々な設定ができる(特にプリンター?)と思っていますのでインターフェース
> (コントロール)にはSetWindowText程度?で良いと思っています
> 何か良い方法がありましたなら教えていただけないでしょうか?
すみません、意図をうまく飲み込めないんですけど...。
最初の質問のコードを見るとコントロールのデバイスコンテキストに設定されているフォントの情報を取得しているので、それを動くようにしてみても「別のコードでフォントを変更してもそのファイス名が取得でき」ないと仰るだけでその「別のコード」がどういったものなのか提示されていないのでよく分かりませんし、「ただ、他CODEでフォント更新をするとイグトランス (egtra) さんのCODEでは再度の呼び出しではフォント更新の結果が反映でき」ないとも仰いますが、やっぱりその「他CODE」が提示されていません。
明確な質問をしてくれれば明確な答えが返せるのですけど、曖昧な質問でちょっと...。
コントロールのフォントとデバイスコンテキストのフォントは別だってことを主張したかったんですけど、分かります? 自分がうまく説明できればいいのですけど、うまく説明できなくて...。
フォントを取得・設定する方法が幾つかあるといった感じではなく、フォントが幾つかあるので取得・設定もそれらに合わせて幾つか用意されていると言った感じじゃないかと僕は思います。
> 私の最終目標はDraw系のプログラムです。
> コントロールの設定はコントロール自体の設定変更(表現がおかしい?)
> SetWindowText等で、描画部分はDC(xxxDrawxxx)でと考えています。
> DCの方が様々な設定ができる(特にプリンター?)と思っていますのでインターフェース
> (コントロール)にはSetWindowText程度?で良いと思っています
> 何か良い方法がありましたなら教えていただけないでしょうか?
すみません、意図をうまく飲み込めないんですけど...。
最初の質問のコードを見るとコントロールのデバイスコンテキストに設定されているフォントの情報を取得しているので、それを動くようにしてみても「別のコードでフォントを変更してもそのファイス名が取得でき」ないと仰るだけでその「別のコード」がどういったものなのか提示されていないのでよく分かりませんし、「ただ、他CODEでフォント更新をするとイグトランス (egtra) さんのCODEでは再度の呼び出しではフォント更新の結果が反映でき」ないとも仰いますが、やっぱりその「他CODE」が提示されていません。
明確な質問をしてくれれば明確な答えが返せるのですけど、曖昧な質問でちょっと...。
コントロールのフォントとデバイスコンテキストのフォントは別だってことを主張したかったんですけど、分かります? 自分がうまく説明できればいいのですけど、うまく説明できなくて...。