- ベストアンサー
VC++のドラッグ中の図の描画方法について
- VC++のドラッグ中における図の描画方法について質問です。
- 具体的には、マウスドラッグしながら長方形を描画する際に、既存の図形を消去する方法について理解できません。
- SetROP2とブラシの併用によって既存の図形を消去できる理由や、ブラシの復元によって内部が真っ白になる理由、塗りつぶしの順序について教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。質問意図は理解できました。 DrawFocusRect()を使った方が合理的かもしれません。このAPIは同じ四角形座標に向かって2回呼び出すと元に戻ります。 ペンやブラシなどでも似た様な事は出来ますが、以前の四角形を残さないようにする為バックバッファなどが必要になり、SetROP2()でチョッとやそっといじくっただけでは、実現するのは難しいかもしれません。 この手の事は説明するのが難しいので以下を参考にしてみてください。 //マウスをドラッグしてDrawFocusRect()を使って領域を描きます。 //キャプチャーされているかどうか static bool s_bCapture = false; //四角形の領域を記録する static RECT s_rcFocus = {0}; //変数を初期化する static void Init() { s_bCapture = false; ::ZeroMemory(&s_rcFocus, sizeof(s_rcFocus)); } //lParamからPOINTに変換 static const POINT PointFromLParam(LPARAM lParam) { const POINT pt = {(short)LOWORD(lParam), (short)HIWORD(lParam)}; return pt; } int CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CANCELMODE : { //何かのトラブルでキャプチャーが解除されてしまった場合は変数を初期化する ::Init(); return TRUE; } case WM_LBUTTONDOWN : { //キャプチャーされているので引き返す if(s_bCapture) return TRUE; //キャプチャーする ::SetCapture(hDlg); s_bCapture = true; //最初の座標を記憶する const POINT pt = ::PointFromLParam(lParam); s_rcFocus.left = pt.x; s_rcFocus.top = pt.y; return TRUE; } case WM_LBUTTONUP : { //キャプチャーを解く ::ReleaseCapture(); //変数を初期化する ::Init(); return TRUE; } case WM_MOUSEMOVE : { //キャプチャーされていないので引き返す if(!s_bCapture) return TRUE; //新しいマウス座標を取る const POINT ptNew = ::PointFromLParam(lParam); //新しい四角形領域 const RECT rcNew = {s_rcFocus.left, s_rcFocus.top, ptNew.x, ptNew.y}; //古い四角形と新しい四角形の領域を比較する if( rcNew.left == s_rcFocus.left && rcNew.top == s_rcFocus.top && rcNew.right == s_rcFocus.right && rcNew.bottom == s_rcFocus.bottom) return TRUE; //デバイスコンテキストを取る HDC hDC = ::GetDC(hDlg); //古い四角形を消す ::DrawFocusRect(hDC, &s_rcFocus); //新しい四角形サイズに更新 s_rcFocus = rcNew; //新しい四角形を描画 ::DrawFocusRect(hDC, &s_rcFocus); //デバイスコンテキストを戻す ::ReleaseDC(hDlg, hDC); return TRUE; } default : ; } return 0; }
お礼
ありがとうございました。解決できました。