質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

2回答

3116閲覧

エディットボックスの文字のサイズを正確に取得できない

mery

総合スコア27

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2018/08/13 11:35

前提・実現したいこと

文字のサイズ情報を取得するときはGetTextMetrics関数を使えばいいと本に書いていたので、これを使いエディットボックス内の文字の高さを取得したら、TEXTMETRIC構造体のtmHeightの値は22でした。
しかし、エディットボックスのフォントの大きさを変化させてもTEXTMETRIC構造体のtmHeightの値は22のまま変化しません。
どうすればエディットボックス内の文字のサイズを正確に取得できますか?

該当のソースコード

※文字サイズを取得する部分のコード

hdc=GetDC(hedit); GetTextMetrics(hdc,&tm); wsprintf(moji,TEXT("文字の高さtm.Height=%d"),tm.tmHeight); SendMessage(hedit,EM_REPLACESEL,TRUE,(LPARAM)moji); ReleaseDC(hedit,hdc);

補足情報(FW/ツールのバージョンなど)

Microsoft Visual C++ 2010 Express C言語
WIN32 ユニコードビルド

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

以下のようにSelectObjectでフォントを選択してから取得してみてください。

c

1hdc=GetDC(hedit); 2 3HFONT hfont = (HFONT)SendMessage(hedit,WM_GETFONT,0,0); 4HFONT hfont_old = (HFONT)SelectObject(hdc,hfont); 5 6GetTextMetrics(hdc,&tm); 7 8SelectObject(hdc,hfont_old); 9 10wsprintf(moji,TEXT("文字の高さtm.Height=%d"),tm.tmHeight); 11SendMessage(hedit,EM_REPLACESEL,TRUE,(LPARAM)moji); 12ReleaseDC(hedit,hdc);

なおmapping-modeはGetMapModeで確認してください。

投稿2018/08/13 14:50

hmmm

総合スコア818

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mery

2018/08/14 02:49

回答ありがとうございました。教えていただいたコードを試したところうまくいきました。 SelectObject関数を使わなければいけなかったのですね。 私はCreateFont関数でフォントを作成後にSendMessage( hedit, WM_SETFONT, (WPARAM)hFont, 0);を実行していたのですが、エディットボックスの文字の大きさは変わっていたので、SelectObject関数の実行は必要ないと思っていました。
guest

0

マニュアル曰く:

All sizes are specified in logical units; that is, they depend on the current mapping mode of the display context.

論理単位での値で、DCに設定されたmapping-modeに依存する、だそうですよ。pixel数とは限らないのでしょう。

投稿2018/08/13 11:54

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mery

2018/08/14 01:53

回答ありがとうございました。論理単位やマッピングモードについてはまだ完全には分かっていないのでこれから勉強してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問