
SetTextAlignはTextoutとExtTextOutに影響を与えるとMSDNには書いてあります
出力先の長方形領域の左右中央、上下合せを指定することで印刷文字を整頓していることを指しているのでしょう
(1)ところがTextOutにはそもそも長方形領域の指定がありません
(2)ExtTextOutで長方形領域を指定し、各種のSetTextAlignを組合わせて印刷テストしましたが、当方の想定通りであったのはTA_LEFT TA_TOPのパラメータだけでした
あとはビックリするような場所に印刷されてしまいました
どこかにTextOut ExtTextoutとSetTextAlignの関係を易しく、しかも具体的に説明した資料は御座いませんでしょうか?
No.2ベストアンサー
- 回答日時:
「出力先の長方形領域」っていうのが独立に存在すると思っちゃうと, おそらくわけがわからなくなるんじゃないかなと思います.
これは出力する文字列のバウンディングボックス, つまり「出力する文字列全体を囲む (最小の) 長方形」のことです... と, ドキュメントには書いてある.
ありがとうございます
私も何となくそのようには感じておりました
でもなぜマイクロソフト社はこんな面倒な概念を持ち込んだのでしょうか?
とても迷惑しております
・・・・・で、 ありがとうございました
No.4
- 回答日時:
>具体的に説明した資料は御座いませんでしょうか?
古めの本が良い気がします。
SetTextAlign のようなGDIの基礎的な解説は、私が最初に読んだもので言えば
WINDOWS 3.0パワープログラミング
http://www.amazon.co.jp/WINDOWS-3-0%E3%83%91%E3% …
等でした。
出力例も掲載されてあり、識別子から容易に想像する通りだった記憶があります。
>ビックリするような場所に印刷...
当時、素人な私が SetTextAlign を試したかどうか定かではありませんが、ビックリした記憶はないですね。当時は色んな解説記事も豊富でしたし。
正直、今、マニュアルだけでは辛いと思います。
No.3
- 回答日時:
>TextOut()でSetTextAlign()のフラグの影響を受けるのはTA_UPDATECPのみ…なのではないでしょうか?
違った…ようで。
先ほどのWM_LBUTTONDOWNのハンドラを下記に変更すると、クリックした位置を左右で中心になる位置に描画されます。
SetTextAlign(hDC, TA_CENTER);
TextOut(hDC, xPos, yPos, _T("TEST"), 4);
まぁ、こちらもいろいろ試してみるのがいいかと。
# 例によってプリンタの場合は不明。
# テストの為に印刷する…というのは、ちょっと。
No.1
- 回答日時:
軽く調べただけですが……。
>(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;
で、赤の点が打たれる箇所がそれぞれ基準点ということになります。
印刷の場合にどうなるのか…についてはドライバ次第かも知れませんが…。
ありがとうございます
お示し頂いたサンプルをプリンタに置き換えてテストしました
結果を眺めているとおぼろげにわかって来ました
更に努力致します
ありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
Microsoft365で作ったword文書...
-
プログラムについての質問です...
-
4Kの外部モニターに出力すると...
-
Accessのテーブルからcsv出力す...
-
cout と cerrの違い
-
ACCESSからExcelへエクスポート...
-
KEYENCEのシーケンスプログラム...
-
VBAで有効数字の設定
-
シェルスクリプト初心者です。#...
-
printfとputcharの違いは
-
センサーのタンパー出力について
-
リストボックスの内容を テキ...
-
リッチテキストをテキストに変換
-
標準出力の上書き
-
C# 標準出力のencodingをutf8に...
-
PHPのGDで折れ線グラフを作成中...
-
C#でアクセス権限の取得方法が...
-
makeで文字化けする。migwのmak...
-
ActiveReportsで縦書きの帳票
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
プログラムについての質問です...
-
Accessのテーブルからcsv出力す...
-
FLEXSOLARパネルからAmazonで買...
-
真空管 300 B の前段について
-
cout と cerrの違い
-
printfとputcharの違いは
-
スマホ充電器購入にあたり
-
PD充電器について
-
TV出力ポートをOFFにすれば良い...
-
COBOLのMOVEで桁数が異なる場合
-
Windows Formアプリからコンソ...
-
CrystalReportの文字列の折返し...
-
C#でアクセス権限の取得方法が...
-
coutで出力した文字を消去する...
-
【UWSC】WEBページ中の特定文字...
-
KEYENCEのシーケンスプログラム...
-
CRC16計算について
-
標準出力の上書き
おすすめ情報