- ベストアンサー
SetTextAlignの機能について
- SetTextAlignは、TextOutとExtTextOutに影響を与える機能です。
- SetTextAlignを使用することで、出力先の長方形領域の左右中央、上下合せを指定することができます。
- ただし、TextOutでは長方形領域の指定ができないため、ExtTextOutと組み合わせて使用する必要があります。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「出力先の長方形領域」っていうのが独立に存在すると思っちゃうと, おそらくわけがわからなくなるんじゃないかなと思います. これは出力する文字列のバウンディングボックス, つまり「出力する文字列全体を囲む (最小の) 長方形」のことです... と, ドキュメントには書いてある.
その他の回答 (3)
- davidfox
- ベストアンサー率58% (21/36)
>具体的に説明した資料は御座いませんでしょうか? 古めの本が良い気がします。 SetTextAlign のようなGDIの基礎的な解説は、私が最初に読んだもので言えば WINDOWS 3.0パワープログラミング http://www.amazon.co.jp/WINDOWS-3-0%E3%83%91%E3%83%AF%E3%83%BC%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%80%88%E4%B8%8A%E3%80%89-%E3%83%94%E3%83%BC%E3%82%BF%E3%83%BC-%E3%83%8E%E3%83%BC%E3%83%88%E3%83%B3/dp/4938455234/ref=sr_1_13?s=books&ie=UTF8&qid=1348595212&sr=1-13 等でした。 出力例も掲載されてあり、識別子から容易に想像する通りだった記憶があります。 >ビックリするような場所に印刷... 当時、素人な私が SetTextAlign を試したかどうか定かではありませんが、ビックリした記憶はないですね。当時は色んな解説記事も豊富でしたし。 正直、今、マニュアルだけでは辛いと思います。
お礼
ありがとうございます 早速、古本マーケットを検索してみます
- Wr5
- ベストアンサー率53% (2173/4061)
>TextOut()でSetTextAlign()のフラグの影響を受けるのはTA_UPDATECPのみ…なのではないでしょうか? 違った…ようで。 先ほどのWM_LBUTTONDOWNのハンドラを下記に変更すると、クリックした位置を左右で中心になる位置に描画されます。 SetTextAlign(hDC, TA_CENTER); TextOut(hDC, xPos, yPos, _T("TEST"), 4); まぁ、こちらもいろいろ試してみるのがいいかと。 # 例によってプリンタの場合は不明。 # テストの為に印刷する…というのは、ちょっと。
お礼
重ね重ねのご指導、誠にありがとうございました 今後とも宜しくお願い申し上げます
- Wr5
- ベストアンサー率53% (2173/4061)
軽く調べただけですが……。 >(1)ところがTextOutにはそもそも長方形領域の指定がありません TextOut()でSetTextAlign()のフラグの影響を受けるのはTA_UPDATECPのみ…なのではないでしょうか? http://msdn.microsoft.com/ja-jp/library/cc428775.aspx カレントポジションの指定はどうするんだ?って感じですが…… 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; で、赤の点が打たれる箇所がそれぞれ基準点ということになります。 印刷の場合にどうなるのか…についてはドライバ次第かも知れませんが…。
お礼
ありがとうございます お示し頂いたサンプルをプリンタに置き換えてテストしました 結果を眺めているとおぼろげにわかって来ました 更に努力致します ありがとうございました
お礼
ありがとうございます 私も何となくそのようには感じておりました でもなぜマイクロソフト社はこんな面倒な概念を持ち込んだのでしょうか? とても迷惑しております ・・・・・で、 ありがとうございました