お世話になっております。ゆうと申します。
さて早速質問させていただきます。
CEditView MDI で開発をしているのですが、
EditView のフォントを「MS ゴシック」の「10pt」に変更しようと思いまして
// CMyView.h
class CMyView : CEditView
{
・・・
protected:
CFont m_Font;
・・・
};
// CMyView の OnInitialUpdate 関数内の処理です
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
strcpy(lf.lfFaceName, MS ゴシック);
lf.lfHeight = 10;
lf.lfCharSet = SHIFTJIS_CHARSET;
m_Font.CreateFontIndirect(&lf);
this->SetFont(&m_Font);
というコードを実行してみたのですが、
Word や Excel の 10pt のフォントより小さな文字になってしまいます。
試しに CFontDialog を使用して 10pt の場合の LOGFONT の値を取得してみたのですが、
lf.lfHeight の値が -13 になっていました。
CFontDialog::GetSize() の値はきちんと 100 になっていましたが、
どのような計算式で -13 という値が算出されたのでしょうか。
(ちなみに 12pt のときは -16 で、20pt のときは -21 でした。)
フォントサイズをプログラムの中で指定したいので、フォントダイアログは使用できませ
ん。
フォントダイアログから取得するフォントサイズの算出方法をご教授いただけないでしょ
うか。
(自分なりに考えて GetSize() の値に 0.13
をかけて、小数点を切り上げているような気が
するのですが自信ないです^^;)
環境は
WinXP Pro & HomeEdition
VC++6.0
MFC CEditView MDI
です。
よろしくお願いします。
すいません、なんか余計な改行が入ってしまいました。
お世話になっております。ゆうと申します。
さて早速質問させていただきます。
CEditView MDI で開発をしているのですが、
EditView のフォントを「MS ゴシック」の「10pt」に変更しようと思いまして
// CMyView.h
class CMyView : CEditView
{
・・・
protected:
CFont m_Font;
・・・
};
// CMyView の OnInitialUpdate 関数内の処理です
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
strcpy(lf.lfFaceName, MS ゴシック);
lf.lfHeight = 10;
lf.lfCharSet = SHIFTJIS_CHARSET;
m_Font.CreateFontIndirect(&lf);
this->SetFont(&m_Font);
というコードを実行してみたのですが、
Word や Excel の 10pt のフォントより小さな文字になってしまいます。
試しに CFontDialog を使用して 10pt の場合の LOGFONT の値を取得してみたのです
が、
lf.lfHeight の値が -13 になっていました。
CFontDialog::GetSize() の値はきちんと 100 になっていましたが、
どのような計算式で -13 という値が算出されたのでしょうか。
(ちなみに 12pt のときは -16 で、20pt のときは -21 でした。)
フォントサイズをプログラムの中で指定したいので、フォントダイアログは使用できま
せん。
フォントダイアログから取得するフォントサイズの算出方法をご教授いただけないでし
ょうか。
(自分なりに考えて GetSize() の値に 0.13 をかけて、小数点を切り上げているような
気が
するのですが自信ないです^^;)
環境は
WinXP Pro & HomeEdition
VC++6.0
MFC CEditView MDI
です。
よろしくお願いします。
ポイント数で指定したい場合は、
CFont::CreatePointFont()やCFont::CreatePointFontIndirect()
を使えば簡単です。
ポイント数をどうやってデバイス値に変換するかに興味がおありなら、
実際に上記関数の中をデバッガで追ってみて、
MFCがどうやって変換しているかを調べてください。
dairygoods様、素早い回答ありがとうございます。
>CFont::CreatePointFont()やCFont::CreatePointFontIndirect()
>を使えば簡単です。
ヘルプをきちんと読んでおりませんでした。
申し訳ないです。
おかげで処理が実現できました。
ありがとうございました。
>ポイント数をどうやってデバイス値に変換するかに興味がおありなら、
>実際に上記関数の中をデバッガで追ってみて、
>MFCがどうやって変換しているかを調べてください。
実際どのような処理を行っているのか興味がありますので調べてみます。
ソースを追って調べ、考えた結果を載せておきます。
(あまり役には立たないと思いますが^^;)
フォントサイズ(高さ)の算出方法:
(1) 1インチのあたりのピクセル数(縦)を取得し、文字の高さにかけます。
(2) 1インチ = 72pt となっているので (1) の値を72で割ります。
(3) 文字の高さを 1/10 (10倍されている)の整数で指定している場合は
10で割ります。
このような手順で算出できるようです。
(この後にデバイス値を論理値に変換したりするのですが、
そこはソースを参照してください。)
96 / 72 = 1.33333.... となりますので、私が最初に述べた
>(自分なりに考えて GetSize() の値に 0.13 をかけて、小数点を切り上げているよう
な
> 気がするのですが自信ないです^^;)
というのも、嘘というわけではなかったみたいですね^^;
それと、CFontDialog から取得した LOGFONT の lfHeight が負の値になっていたのは
論理単位指定とポイント単位指定の差別化を図るためではないかと考えました。
以上に述べたことは私の考えですので、間違いなどがありましたら
ご指摘お願いします。