重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

SetTextAlignはTextoutとExtTextOutに影響を与えるとMSDNには書いてあります
出力先の長方形領域の左右中央、上下合せを指定することで印刷文字を整頓していることを指しているのでしょう

(1)ところがTextOutにはそもそも長方形領域の指定がありません
(2)ExtTextOutで長方形領域を指定し、各種のSetTextAlignを組合わせて印刷テストしましたが、当方の想定通りであったのはTA_LEFT TA_TOPのパラメータだけでした
あとはビックリするような場所に印刷されてしまいました

どこかにTextOut ExtTextoutとSetTextAlignの関係を易しく、しかも具体的に説明した資料は御座いませんでしょうか?

A 回答 (4件)

「出力先の長方形領域」っていうのが独立に存在すると思っちゃうと, おそらくわけがわからなくなるんじゃないかなと思います.



これは出力する文字列のバウンディングボックス, つまり「出力する文字列全体を囲む (最小の) 長方形」のことです... と, ドキュメントには書いてある.
    • good
    • 0
この回答へのお礼

ありがとうございます

私も何となくそのようには感じておりました

でもなぜマイクロソフト社はこんな面倒な概念を持ち込んだのでしょうか?

とても迷惑しております

・・・・・で、  ありがとうございました

お礼日時:2012/09/24 22:05

>具体的に説明した資料は御座いませんでしょうか?


古めの本が良い気がします。
SetTextAlign のようなGDIの基礎的な解説は、私が最初に読んだもので言えば
WINDOWS 3.0パワープログラミング
http://www.amazon.co.jp/WINDOWS-3-0%E3%83%91%E3% …
等でした。
出力例も掲載されてあり、識別子から容易に想像する通りだった記憶があります。

>ビックリするような場所に印刷...
当時、素人な私が SetTextAlign を試したかどうか定かではありませんが、ビックリした記憶はないですね。当時は色んな解説記事も豊富でしたし。
正直、今、マニュアルだけでは辛いと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます

早速、古本マーケットを検索してみます

お礼日時:2012/09/30 07:42

>TextOut()でSetTextAlign()のフラグの影響を受けるのはTA_UPDATECPのみ…なのではないでしょうか?



違った…ようで。

先ほどのWM_LBUTTONDOWNのハンドラを下記に変更すると、クリックした位置を左右で中心になる位置に描画されます。
   SetTextAlign(hDC, TA_CENTER);
   TextOut(hDC, xPos, yPos, _T("TEST"), 4);
まぁ、こちらもいろいろ試してみるのがいいかと。

# 例によってプリンタの場合は不明。
# テストの為に印刷する…というのは、ちょっと。
    • good
    • 0
この回答へのお礼

重ね重ねのご指導、誠にありがとうございました

今後とも宜しくお願い申し上げます

お礼日時:2012/09/24 22:06

軽く調べただけですが……。



>(1)ところがTextOutにはそもそも長方形領域の指定がありません

TextOut()でSetTextAlign()のフラグの影響を受けるのはTA_UPDATECPのみ…なのではないでしょうか?
http://msdn.microsoft.com/ja-jp/library/cc428775 …

カレントポジションの指定はどうするんだ?って感じですが……
MoveToEx()等で指定でしょうか。
TextOut()では改行出来ませんから、カレントポジションのX座標(縦書きフォントならY座標?)のみが更新されるものと思われます。

 case WM_LBUTTONDOWN:
  {
   HDC hDC = GetDC(hWnd);

   int xPos = GET_X_LPARAM(lParam);
   int yPos = GET_Y_LPARAM(lParam);

   SetTextAlign(hDC, TA_UPDATECP);
   MoveToEx(hDC, xPos, yPos, NULL);
   TextOut(hDC, 0, 0, _T("Test"), 4);
   MoveToEx(hDC, xPos, yPos + 20, NULL);
   TextOut(hDC, 0, 0, _T("TEST"), 4);
   ReleaseDC(hWnd,hDC);
  }
  break;
で、TextOut()で指定した第2、第3引数が無視されるのを確認しました。

ExtTextOut()では、第2、第3引数で指定した箇所がSetTextAlign()で書かれている基準点となっているようです。
第4引数でETO_CLIPPEDを指定していると第4引数で渡すRECT構造体の影響を受けます。
第3引数を0にして第4引数のRECT構造体を無視させて見てはどうでしょうか?

 case WM_LBUTTONDOWN:
  {
   HDC hDC = GetDC(hWnd);
   RECT Rect1 = { 25, 22, 45, 30};

   SetTextAlign(hdc, TA_CENTER);
   ExtTextOut(hDC, 30, 20, ETO_CLIPPED, &Rect1, _T("TEST"), lstrlen(_T("TEST")), NULL);
   SetPixel(hDC, 30, 20, RGB(255, 0, 0));
   ExtTextOut(hDC, 30, 70, 0, &Rect1, _T("TEST"), lstrlen(_T("TEST")), NULL);
   SetPixel(hDC, 30, 70, RGB(255, 0, 0));
   SetTextAlign(hDC, TA_BOTTOM);
   ExtTextOut(hDC, 10, 120, 0, &Rect1, _T("TEST"), lstrlen(_T("TEST")), NULL);
   SetPixel(hDC, 10, 120, RGB(255, 0, 0));
   SetTextAlign(hDC, TA_BASELINE);
   ExtTextOut(hDC, 10, 170, 0, &Rect1, _T("TEST"), lstrlen(_T("TEST")), NULL);
   SetPixel(hDC, 10, 170, RGB(255, 0, 0));
   SetTextAlign(hDC, TA_RIGHT);
   ExtTextOut(hDC, 100, 220, 0, &Rect1, _T("TEST"), lstrlen(_T("TEST")), NULL);
   SetPixel(hDC, 100, 220, RGB(255, 0, 0));
   ReleaseDC(hWnd,hDC);
  }
  break;
で、赤の点が打たれる箇所がそれぞれ基準点ということになります。

印刷の場合にどうなるのか…についてはドライバ次第かも知れませんが…。
    • good
    • 0
この回答へのお礼

ありがとうございます

お示し頂いたサンプルをプリンタに置き換えてテストしました

結果を眺めているとおぼろげにわかって来ました

更に努力致します

ありがとうございました

お礼日時:2012/09/24 22:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!