3

カスタムウィンドウの境界線をデザインしていて、ドラッグバーとしてビットマップを上部に配置しています。これは機能しますが、ウィンドウをドラッグしようとすると、2つの異なる領域に配置され、2つの間でちらつきます。これがビデオです:

http://dl.dropbox.com/u/85700751/capture-1.avi

ウィンドウが点滅しているときに、ドラッグしようとしています(何らかの理由でカーソルが表示されません)。これが私のドラッグコードです:

case WM_LBUTTONDOWN: {
    int posX = LOWORD(lParam);
    int posY = HIWORD(lParam);
    if((isDragging==false)&&(posX>4)&&(posX<470)&&(posY>4)&&(posY<24))
        {
            isDragging = true;
            ClipCursor(rect);
            oldCursorX = posX;
            oldCursorY = posY;
        }
    }
    break;
case WM_LBUTTONUP: {
    isDragging = false;
    ClipCursor(NULL);
    }
    break;
case WM_MOUSEMOVE: {
        if(isDragging)  {
            SetWindowPos(hWnd, NULL, LOWORD(lParam)-oldCursorX, HIWORD(lParam)-oldCursorY, 500, 500, NULL);
        }
    }
    break;
4

2 に答える 2

5

一般に、WM_NCHITTESTに単純に共鳴するのが最も簡単です。そのメッセージの場合、LPARAMはマウスでX座標とY座標をヒットします(WM_LBUTTONDOWNと同じ)。ドラッグ可能な領域内にある場合は、HTCAPTIONを返します。その後、システムがすべてのドラッグロジックを自動的に処理します。

于 2012-11-20T18:44:55.047 に答える
0

WM_MOUSEMOVEに渡されるカーソル座標は、ウィンドウの位置を基準にしています。ただし、WM_MOUSEMOVEを受信するたびに、ウィンドウの位置を変更し続けます。

:: ClientToScreen()を使用して、座標を画面座標に変換します。

于 2012-11-20T07:31:05.650 に答える