• ベストアンサー

WM_PAINTとWM_MOVEで同じ事をしたいけど

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

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>hdc = BeginPaint(hWnd, &paint); と、 >EndPaint(hWnd, &paint); これはWM_PAINTの中でしか使用できません。 WM_MOVEで描画を行うのでしたらGetDC()、ReleaseDC()を使用してください。

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

ちょっと補足 >WM_PAINTはウインドウの形変わった ウィンドウの形が変わった際はWM_SIZEです。 WM_PAINTは描画が必要なときです。 変わった結果、描画が必要な範囲が発生することでWM_PAINTが投げられます。 ウィンドウクラスの登録で、CS_VREDRAWやCS_HREDRAWを指定していない場合、サイズ変更ではWM_PAINTは発生しない場合もあります。 他のアプリのウィンドウを重ねて動かす等でもWM_PAINTは投げられますよ。描画しなおさないといけなくなるからです。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

具体的にどうやってWM_MOVEのタイミングで描画してるか不明なのでわかりません。 ちゃんと処理組んでれば描画できるはずです、としかいえません。

kan520
質問者

補足

ウインドウクラスの定義の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; }

関連するQ&A