• ベストアンサー

GetTextExtentの動きが違う

VC++2008でmfcによるグラフィックス系のアプリを開発しています。 ビューに文字列を描画する前にその幅を取得したく、 文字列入力用のエディットボックスに文字列を入力中にメモリデバイスコンテキストを作成し、 GetTextExtent関数を用いて取得しています。 しかし、Releaseビルドして実行したところ、Debug版で取得したサイズと違うため困っています。 例えばDebug版で1文字の幅が18、2文字で35となっているものが、 Release版だと28, 57になっていました。 幅を同じにするための解決案はございますでしょうか。

  • sanato
  • お礼率72% (170/236)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

コードは提示できないですか? DebugとReleaseで動作が違う場合、初期化忘れや設定の不足などが考えられますが、処理内容を文章で書かれると、必要なコードが書かれているかどうかがわかりません。

sanato
質問者

お礼

すみません、初期化忘れということで見直すと原因が分かりました。 LOGFONT型の変数で、フォントの変更に必要な設定値だけを初期化していたのですが、それがダメでした。 すべて初期化すると正常な動きになりました。お手数をおかけして申し訳ありません。

関連するQ&A

  • Visual C++ リンクエラー

    VC++でビルドすると、Debug版では、成功するのですが、Release版では、「error LNK2001: 外部シンボル "__CIpow" は未解決です」が出て、ビルドに失敗します。 どなたか、原因あるいは解決方法をご存知ありませんでしょうか? 因みに、OSはWindws2000 Professional VC++ 6.0です。

  • ピクチャーコントロールのデバイスコンテキストを取得するためには?

    VC2005についてです ピクチャーコントロールのデバイスコンテキストを取得するためには どうすればよいでしょうか? MDIGetActive()->GetDC()->TextOutA(20,50,"文字列です"); この様にすれば、アクティブになった 子ウィンドウデバイスコンテキストを取得することができますが、 アクティブになった、この子ウィンドウの上にある ピクチャーコントロールに 描画するためには どうすればよいでしょうか? MDIで、複数のウィンドウのうちで アクティブになった ものだけを 操作したいのです。 よろしくお願いします。

  • エディットボックスに入力されている文字列が、スペースだけで構成されているかどうか。

    VC++6.0・Win32APIを用いて、ウィンドウズアプリケーションを作成しています。 エディットボックスに入力されている文字列が、スペース(全角スペース又は半角スペース)のみ (それらの組み合わせでも構わない)で構成されているかどうかを判別するアルゴリズムを教えてください。 ヒントでも構いません。 エディットボックスの作成や、そこからの文字列の取得については理解しています。 あっ、でもよく考えてみたらエディットボックスかどうかは関係ないですね(^_^;) 『ある文字列が・・・』で十分ですね。 お手数をお掛けしますが、よろしくお願いいたします。

  • TrueTypeの文字の形を取得したい(C#)

    C#(Visual Studio 2012)にてTrueType文字の外形を直線&3次ベジェで取得したいと考えています。 以前、VC++で同様のものを作りました。 そのときは、メモリDCに描画した後、デバイスコンテキストからGetPath()にて座標を取り出すことで 実現していました。 C#でも同様の方法でやれると思ったのですが、デバイスコンテキストにDrawTextで描画したものの、 そこから先がわかりません。 何か参考になるURLがございましたら教えてください。

  • メニューバーでクリックした個々のメニューのキャプションとプロンプト変更

    VC++6.0 で メニューバーでクリックした個々のメニューの文字を変更しようとして、 void C~View::OnUpdate~(CCmdUI* pCmdUI) { if( ~flg ) pCmdUI->SetText( "文字1" ); else pCmdUI->SetText( "文字2" ); } でメニューの文字自体は切替出来たのですが、 ステータスバーには リソースビュー上でメニューのプロパティの "プロンプト"エディットボックスに入力した文字列は そのまま表示されてしまっていました。 ステータスバー側の文字列を変更することは可能なのでしょうか?

  • VC++2010 エディットボックス 数値検出

    VC++2010 エディットボックス 数値検出について質問なんですが、 そういう関数とかありますか?  数値が0.01~65536まで入力される仕様になっており 文字列を受信したら無効にするようにしたいのですが よろしくお願いします

  • GDI+のDrawStringを使って文字を滑らかに描画したいのですが。。。

    GDI+のDrawStringを使って文字を滑らかに描画したいのですが。。。 環境は、VC++のWin32プロジェクトです。 WindowのデバイスコンテキストからGraphicsオブジェクトを生成し、DrawStringとすると滑らかに描画されます。 しかし、BitmapオブジェクトからGraphicsオブジェクトを生成し、DrawStringを行うとビットマップフォントのようです。 Graphics g(hdc); g.DrawString(......); -> この場合はなめらか(画像の下の方) しかし、 Bitmap bmp(w, h, PixelFormat32bppARGB); Graphics g (&bmp); g.SetSmootingMode(SmoothingModeHighQuality); g.DrawString(...); -> ジャギが目立つ。(画像の上の方) ビットマップ(メモリ)にスムーズなテキストを描画することはできないのでしょうか? ちなみにフォントはメイリオです。

  • SQLLIB80.DLLリンクの警告について

    VCでCGIを作成しています。 Pro*Cを使用しているのですが、ビルドする時に以下の警告が発生します。 「LINK : worning LNK4089: "sqllib80.dll" へのすべての参照は /OPT:REF によって廃棄されます」 ちなみに ビルド→アクティブな構成の設定 で Win32 Debug にすると警告は出ないのですが、 Win32 Release にすると上記の警告が発生します。 見たところ、設定等はDebugとReleaseで全く同じです。 どなたかお分かりになる方がいらっしゃったら よろしくお願いします。

  • リビルド後に実行しようとするとビルド要求のメッセージが出る

    VC++6.0のMFCを使って開発しているアプリケーションがあります。そのアプリケーションをビルドする際に起きる問題についてです。 リビルドした後に実行ファイルを実行しようとすると「ビルドしますか?」というメッセージが出てきます。リビルドしたばかりなのに何故ビルドが必要なのかわかりません。それから、再ビルド時には全ソースファイルがコンパイルされているようですので、実行されるまで時間がかかってしまいます。 リビルドしたときにはコンパイルエラーや警告はありませんし、リビルド後には確かに実行ファイルは生成されています。「ビルドしますか?」のメッセージが出ても「はい」ボタンをクリックしてビルドが完了すれば実行ファイルが実行されます。この問題は開発当初からあった問題ではなく、あるときから突然起きた問題です。いつから起きた問題なのかはわかりません。ちなみに、この問題は「バッチビルド」を使って複数のコンフィグレーションをリビルドした時に起きるようです。1つのコンフィグレーション(実行したいコンフィグレーション)のみをリビルドした後にはこの問題は起きません。また、リリース版、デバッグ版ともにこの問題は起きます。 下記はメッセージの内容です。(英語版のVCなのでメッセージは英語です。) (xxxは実行ファイル名、aaa、bbb、cccはソースファイル名) ---------------------------------------------------- One or more files are out of date or do not exist. These files need to be build: .\Debug\xxx.bsc .\Debug\xxx.exe .\Debug\aaa.obj .\Debug\bbb.obj .\Debug\ccc.obj <more file ...> Would you like to build them? ---------------------------------------------------- 原因や解決方法をご存知の方、ご教授をお願い致します。 環境:Win2000(日本語版)、VC++6.0(英語版)、MFC

  • GetTextExtentPoint32での高さ

    こんにちは。 数字が入った文字列をGetTextExtentPoint32関数で幅と高さを取得しようとすると、幅は正しく取得できるのですが、高さが倍近い値で返ってきてしまいます。どうやら高さはフォント全体の高さで取得しているようです。"0123"と"0123j"をセットしても同じ高さが返ってきます。 これを実際の描画範囲で取得するにはどうすればよろしいのでしょうか?

専門家に質問してみよう