アプリ版:「スタンプのみでお礼する」機能のリリースについて

PAINTSTRUCT ps;
HDC hdc;
RECT rct={200,200,200,200};
char *szStr = "あけまして\n\tおめでとう";

switch (msg) {
case WM_PAINT:
GetClientRect(hWnd, &rct);
hdc = BeginPaint(hWnd, &ps);
DrawText(hdc, (LPCTSTR)szStr, -1, &rct, DT_CENTER | DT_WORDBREAK);
EndPaint(hWnd, &ps);
break;
のようにしているのですが文字列が表示される場所が中央上部です。
何故なのでしょう?
自分としてはど真ん中辺りから表示されるようにしているつもりなのですが

A 回答 (2件)

回答No1.に対する補足で、


> RECT rct={200,200,200,200};
> この宣言だけでは目的の位置に文字列を表示できないのでしょうか?
と言われているので老婆心ながら…
rctって200で初期化していますがGetClientRect()で書き潰されていません?
結果としてはクライアント領域の中央を始点としてszStrは表示されますがrctの200との関係は無い様に
見えますが…
それから上記にも記載した様に文字列書き出しの始点が画面中央になっていると思いますよ。
あなたが期待している結果を実現するには、始点-文字列全体の長さ/2などを考慮しなくてはならないかも(?)
DrawText(Ex)()辺りにDT_CALC???とか何とか…実際にそのHDCで表示する場合の文字列RECTを事前に調べれたと思います(すみません記憶です)。その辺りを使って座標を修正してみては如何でしょう。
    • good
    • 0
この回答へのお礼

ああなるほどわかりました。
初めの時点で初期化してもGetClientRect()で消えてしまうから、ここより後で座標を指定すればいいんですね、無事解決できました。
ありがとうございました。

お礼日時:2006/02/05 20:37

ど真ん中なら DT_VCENTER も必要では?



DrawText(hdc, (LPCTSTR)szStr, -1, &rct, DT_CENTER | DT_VCENTER | DT_WORDBREAK);

この回答への補足

回答ありがとうございます。
RECT rct={200,200,200,200};
この宣言だけでは目的の位置に文字列を表示できないのでしょうか?

補足日時:2006/02/05 17:48
    • good
    • 0

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