プロが教えるわが家の防犯対策術!

VC.NETにて、
ウィンドウプロシージャでWM_PAINTとWM_MOVEを拾って、テキストを書き直す関数に飛ばしているのですが、WM_MOVEでは書き直してくれません。
書き直し関数はウインドウの座標の絶対と相対をGetClientRectとGetWindowRectで得て表示をするだけです。
WM_MOVEでも関数に飛んで、座標を得てはいるようですが、表示しなおしてくれません。
ウインドウの大きさを変えると表示し直してくれます。
何故でしょうか?

A 回答 (3件)

>hdc = BeginPaint(hWnd, &paint);


と、
>EndPaint(hWnd, &paint);

これはWM_PAINTの中でしか使用できません。

WM_MOVEで描画を行うのでしたらGetDC()、ReleaseDC()を使用してください。
    • good
    • 0

ちょっと補足



>WM_PAINTはウインドウの形変わった

ウィンドウの形が変わった際はWM_SIZEです。
WM_PAINTは描画が必要なときです。

変わった結果、描画が必要な範囲が発生することでWM_PAINTが投げられます。
ウィンドウクラスの登録で、CS_VREDRAWやCS_HREDRAWを指定していない場合、サイズ変更ではWM_PAINTは発生しない場合もあります。

他のアプリのウィンドウを重ねて動かす等でもWM_PAINTは投げられますよ。描画しなおさないといけなくなるからです。
    • good
    • 0

具体的にどうやってWM_MOVEのタイミングで描画してるか不明なのでわかりません。



ちゃんと処理組んでれば描画できるはずです、としかいえません。

この回答への補足

ウインドウクラスの定義のlpfnWndProcに定義した関数内で、メッセージ?を拾って、WM_PAINTとWM_MOVEを同じ扱いにしてみましたが、ウインドウ移動した時には書き換わりません。My_textout関数内でMessageBox()で座標表示は出来たので、関数に飛んでくるし、値も得てはいるのですが、表示が変わりません。
×ボタンで終了が出来るので、この中に入ってくるのは確かのようです。
WM_PAINTはウインドウの形変わった
WM_MOVEはウインドウ動いた
と解釈しています。

[lpfnWndProcに定義した関数]
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;

case WM_PAINT:
case WM_MOVE:
My_textout(hWnd);
break;

default:
return(DefWindowProc(hWnd, msg, wParam,lParam));
}
return (0L);
}

[表示する関数]
void My_textout(HWND hWnd)
{
HDC hdc;
char strx[256],strx2[256];

PAINTSTRUCT paint;
RECT rt,rt2;

LPCSTR str;

GetClientRect(hWnd, &rt);
GetWindowRect(hWnd, &rt2);

wsprintf((LPSTR)strx, (LPCSTR)"相対=[left=%d top=%d right=%d bottom=%d]"
,rt.left
,rt.top
,rt.right
,rt.bottom);
wsprintf((LPSTR)strx2, (LPCSTR)"絶対=[left=%d top=%d right=%d bottom=%d]"
,rt2.left
,rt2.top
,rt2.right
,rt2.bottom);
hdc = BeginPaint(hWnd, &paint);

SetTextColor(hdc, RGB(0, 0, 255));
TextOut(hdc, 10, 10, (LPSTR)strx, strlen(strx));
SetTextColor(hdc, RGB(255, 0, 0));
TextOut(hdc, 10, 30, (LPSTR)strx2, strlen(strx2));

EndPaint(hWnd, &paint);

return;
}

補足日時:2004/09/29 18:06
    • good
    • 0

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