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

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

ただいまの
回答率

90.60%

  • C++

    3340questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1769questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Windows 10

    895questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

  • Win32 API

    215questions

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

EDITコントロールとDrawTextで文字の開始位置を同じにしたい。

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 295

kalbon

score 3

 前提・実現したいこと

Windows10とVisual Studio 2017とC++でWIN APIを用いてwindowsデスクトップアプリケーションを作成しています。CreateWindowでEDITコントロール生成し、文字入力が終わったらその文字列を入力した位置と同じ位置にDrawTextしようとしていますが、EDITコントロールとDrawTextで文字の開始位置が変わります。ついては、両者の差(ピクセル数)を取得できないでしょうか?

 発生している問題・エラーメッセージ

EDITコントロールの左マージンをEM_SETMARGINSで0にしても、CreateWindowの位置とDrawTextの位置が一致しません。DrawTextのほうが若干左に来てしまいます。

 該当のソースコード

■EDITコントロール側

HwndEditBox = CreateWindow(
        TEXT("EDIT"), NULL,
        WS_VISIBLE | WS_CHILD | ES_MULTILINE | 
        ES_LEFT | ES_WANTRETURN | WS_BORDER,
        0, 0, 1000,100, hwnd, 
        (HMENU)ID_EDITBOX,
        (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
        NULL
        );

SendMessage(HwndEditBox,EM_SETMARGINS, EC_LEFTMARGIN, 0);    

■DrawText側

WCHAR pWStr[32768];
RECT rect;
GetWindowText(HwndEditBox, pWStr, 32767);
rect.left = 0;
rect.top = 0
rect.right = 1000;
rect.bottom = 100;
DrawText(hdc,pWStr,-1, &rect,DT_LEFT| DT_EDITCONTROL ;

 試したこと

EM_GETMARGINSで左マージンを取得しましたが0でした。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

目的がテキストボックスと同じ位置にテキストを描画することであれば、テキストボックスに WM_PRINTCLIENT を送信してテキストボックス自体に描画してもらうことにより、同じ描画結果を得ることが可能となります。

以下にサンプルを作ってみました。
https://github.com/atata0319/teratail125858

WM_PRINT により枠線などを含めて描画することも可能です。これらの方法は描画位置を同じ位置に合わせる手法であって描画位置の差を計算しているわけではありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/21 09:19

    大変ありがとうございます。ソース拝見いたしました。
    今回のソフトでは、EDITコントロールで入力する領域は実画面の解像度固定ですが、その入力結果を描画するHDCのバッファは実画面より解像度が高いのです。なので、そのままBitBltできないのです。
    私も当初StretchBltでEDITコントロールの内容をHDCのバッファに拡大コピーでいいと思っていたのですが、思いのほか汚くなるので、EDITコントロールの入力内容を読み込んで、フォントサイズを変えてDrawTextする方式にしています。

    キャンセル

+1

EDIT コントロールが WS_BORDER なので、枠の分だけずれるようですね。
WS_BORDER なしにするか、GetSystemMetrics() で枠の幅を取得して調節すればよさそうですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/14 13:57

    ありがとうございます。
    SM_CXDLGFRAMEhは3、SM_CXBORDERは1でしたが、フォントを大きくするにしたがって、EDITコントロール内の文字の開始位置が右にずれるので、フォントの大きさがからんでいるのではないかと考えております。EDITコントロールとフォントの関係で考慮すべきパラメータとか、ないでしょうか?

    キャンセル

  • 2018/05/15 01:54

    すみません、間違ってました。

    RECT rect;
    SendMessage(HwndEditBox, EM_GETRECT, 0, (LPARAM)&rect);
    DrawText(hdc, pWStr, -1, &rect, DT_LEFT | DT_EDITCONTROL);

    のようにすると、うまくいくようです。

    キャンセル

  • 2018/05/17 12:16

    ご回答ありがとうございます。
    また、返信が遅くなり申し訳ありません。
    頂いた方法でrectを取っても、やはりずれました。
    Win7ではズレないのですが、調べた結果Windows8.1以上の仕様であることがわかりました。

    「Windows 8 でアプリケーションを実行した場合に文字列の表示結果が変わる」
    https://support.microsoft.com/ja-jp/help/2757148

    解決方法には「コントロールのサイズを十分な大きさに変更してください」とありますが、変更しても現象は改善されませんでした。
    ちなみに現象を確認したのは、フォント「Sitka Small」、CreateFontでの第一引数(フォントの高さ)「144」で、Win10のビルドは1607です。

    キャンセル

  • 2018/05/17 16:31

    なるほと。
    https://msdn.microsoft.com/en-us/library/dn302122(v=vs.85).aspx
    あたりで、何か対応できそうな気がしなくもないですが…

    時間が取れましたら調べてみます。

    キャンセル

  • 2018/05/21 09:10

    すみません、肝心なことを記載しておりませんでした。
    開発しているソフトはWin7~Win10まで対応します。
    OSがWin8.1以上であれば、SetProcessDpiAwareness(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);
    を呼び出しています。
    本当はSetProcessDpiAwareness(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);
    を使いたいのですが、Win10 Creator Update以上でないと動作しないので、互換性のために前者をつかっています。

    キャンセル

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

  • ただいまの回答率 90.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3340questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1769questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Windows 10

    895questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

  • Win32 API

    215questions

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