質問する質問する
 

回答済みCreateFont 関数のドキュメントについて

  • 2009年7月1日 7:13ミッヒー ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    タイトルの通り、CreateFont 関数のドキュメントが間違っています。

    第 6 引数から 13 引数まで DWORD となっていますが、LOGFONT と同様に BYTE ではないでしょうか?

回答

  • 2009年7月1日 14:12AzuleanMVPユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み
    タイトルの通り、CreateFont 関数のドキュメントが間違っています。
    ドキュメントは間違っていません。
    Visual Studio 2008に付随するWindows SDKでは下記のように宣言されています。

    WINGDIAPI HFONT   WINAPI CreateFontA( __in int cHeight, __in int cWidth, __in int cEscapement, __in int cOrientation,  __in int cWeight, __in DWORD bItalic,
      __in DWORD bUnderline, __in DWORD bStrikeOut, __in DWORD iCharSet, __in DWORD iOutPrecision,  __in DWORD iClipPrecision,
      __in DWORD iQuality, __in DWORD iPitchAndFamily, __in_opt LPCSTR pszFaceName);
    WINGDIAPI HFONT   WINAPI CreateFontW( __in int cHeight, __in int cWidth, __in int cEscapement, __in int cOrientation,  __in int cWeight, __in DWORD bItalic,
      __in DWORD bUnderline, __in DWORD bStrikeOut, __in DWORD iCharSet, __in DWORD iOutPrecision,  __in DWORD iClipPrecision, __in DWORD iQuality, __in DWORD iPitchAndFamily, __in_opt LPCWSTR pszFaceName);


    これを見る限り、APIの定義とドキュメントで、型は一致しているため、ドキュメントは間違っていないと言えます。


    第 6 引数から 13 引数まで DWORD となっていますが、LOGFONT と同様に BYTE ではないでしょうか?
    同じような意味合いを持つ引数、メンバの型が違うことは、仕様として一貫性がないということですよね?
    そのように設計された理由までは何とも言えませんが、今更変えられるところではないとも思えます。

    合わせることによって良くなると言うことであれば、それを明確にして、ご提案下さい。
    (但し、ドキュメントフィードバックではなくなりますが…)
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
  • 2009年7月1日 14:54AzuleanMVPユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み
    間違っている (と思う) ドキュメントは

    http://msdn.microsoft.com/en-us/library/dd183499(VS.85).aspx
    http://msdn.microsoft.com/ja-jp/library/cc428368.aspx

    の 2 つです。
    私がどのドキュメントを参照したかを引っ張り忘れたためにお手数をおかけしていますが、その2つ共に正しいと評価しています。

    CFont::CreateFontはAPIのMFCでの単なるラッパーです。(APIのCreateFont(第6引数からDWORDのもの)を呼ぶだけ)


    逆にお聞きしたいのですが、何を以て間違えていると判断されているのでしょうか?
    LOGFONTのメンバーと型が異なることによって、すぐに間違いにはなりません。(デザイン上、一貫性がないという点は残りますが、間違いとは言えません)


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。

すべての返信

  • 2009年7月1日 14:12AzuleanMVPユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み
    タイトルの通り、CreateFont 関数のドキュメントが間違っています。
    ドキュメントは間違っていません。
    Visual Studio 2008に付随するWindows SDKでは下記のように宣言されています。

    WINGDIAPI HFONT   WINAPI CreateFontA( __in int cHeight, __in int cWidth, __in int cEscapement, __in int cOrientation,  __in int cWeight, __in DWORD bItalic,
      __in DWORD bUnderline, __in DWORD bStrikeOut, __in DWORD iCharSet, __in DWORD iOutPrecision,  __in DWORD iClipPrecision,
      __in DWORD iQuality, __in DWORD iPitchAndFamily, __in_opt LPCSTR pszFaceName);
    WINGDIAPI HFONT   WINAPI CreateFontW( __in int cHeight, __in int cWidth, __in int cEscapement, __in int cOrientation,  __in int cWeight, __in DWORD bItalic,
      __in DWORD bUnderline, __in DWORD bStrikeOut, __in DWORD iCharSet, __in DWORD iOutPrecision,  __in DWORD iClipPrecision, __in DWORD iQuality, __in DWORD iPitchAndFamily, __in_opt LPCWSTR pszFaceName);


    これを見る限り、APIの定義とドキュメントで、型は一致しているため、ドキュメントは間違っていないと言えます。


    第 6 引数から 13 引数まで DWORD となっていますが、LOGFONT と同様に BYTE ではないでしょうか?
    同じような意味合いを持つ引数、メンバの型が違うことは、仕様として一貫性がないということですよね?
    そのように設計された理由までは何とも言えませんが、今更変えられるところではないとも思えます。

    合わせることによって良くなると言うことであれば、それを明確にして、ご提案下さい。
    (但し、ドキュメントフィードバックではなくなりますが…)
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
  • 2009年7月1日 14:21ミッヒー ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    間違っている (と思う) ドキュメントは

    http://msdn.microsoft.com/en-us/library/dd183499(VS.85).aspx
    http://msdn.microsoft.com/ja-jp/library/cc428368.aspx

    の 2 つです。

    http://msdn.microsoft.com/en-us/library/2ek64h34.aspx
    http://msdn.microsoft.com/en-us/library/aa279837(VS.60).aspx
    http://msdn.microsoft.com/ja-jp/library/2ek64h34.aspx
    http://msdn.microsoft.com/ja-jp/library/2ek64h34(VS.80).aspx

    の 4 つは問題なさそうです。

    間違っている、と思っているドキュメントがもしかして 64 bit 版のものでしたらすいません。

  • 2009年7月1日 14:54AzuleanMVPユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み
    間違っている (と思う) ドキュメントは

    http://msdn.microsoft.com/en-us/library/dd183499(VS.85).aspx
    http://msdn.microsoft.com/ja-jp/library/cc428368.aspx

    の 2 つです。
    私がどのドキュメントを参照したかを引っ張り忘れたためにお手数をおかけしていますが、その2つ共に正しいと評価しています。

    CFont::CreateFontはAPIのMFCでの単なるラッパーです。(APIのCreateFont(第6引数からDWORDのもの)を呼ぶだけ)


    逆にお聞きしたいのですが、何を以て間違えていると判断されているのでしょうか?
    LOGFONTのメンバーと型が異なることによって、すぐに間違いにはなりません。(デザイン上、一貫性がないという点は残りますが、間違いとは言えません)


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
  • 2009年7月1日 15:44ミッヒー ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    Azulean さん、すいません。2 回目の書き込みの途中で書き込まれたようで気付きませんでした。

    その後、よくよく確認をしてみると、VS 2008 のドキュメントを見ながら、VS 2005 で検証していた、というお粗末な結果でした。Azulean さんにはもちろんですが、Microsoft 社の方々にもご迷惑をお掛けしました。

    すいませんでした。
  • 2009年7月1日 15:53AzuleanMVPユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    その後、よくよく確認をしてみると、VS 2008 のドキュメントを見ながら、VS 2005 で検証していた、というお粗末な結果でした。
    「VS2005で検証していた」ことで、「正しいのはBYTE型だと誤認した」ということでしょうか?
    よろしければ、そのVS2005で検証していたというあたりをお聞かせ頂ければと思います。

    これを問う理由としては、VS2005に付属しているPlatformSDKでもCreateFontA/CreateFontWの第6引数はDWORD型であるからです。
    なお、参考ですが、MFCのCFont::CreateFontはVS2005/VS2008共に第6引数はBYTE型です。

    # MFCとAPIの取り違えなら納得かもしれない。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
  • 2009年7月1日 16:29ミッヒー ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    ご指摘の通り、MFC と API を取り違えていました。

    CFont::CreateFont 関数を記述していた際、ドキュメントを読み間違え、上位 4 ビットに設定する値 (既にそこにある値でした) をシフトした時に、

    warning C4309: '引数' : 定数値が切り捨てられました。

    という警告が出た為、おかしいな、と思ったのが始まりでした。

    本当にすいませんでした。