WM_LBUTTONDOWN和WM_LBUTTNUP之间是否有任何消息总是存在?

Muk*_*mar -3 c++ winapi


当我按下鼠标的L按钮(保持)时,我试图在屏幕上写一个文本,客户区将显示
L-BUTTON-DOWN
,当我释放它时,屏幕应显示
L-Button-UP

这是我到目前为止所做的(这是窗口程序)

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 HDC         hdc ;
 PAINTSTRUCT ps ;
 RECT        rect ;

 switch (message)
 {
 case WM_SYSCOMMAND:
     PlaySound(TEXT("syscom.wav"), NULL, SND_FILENAME | SND_SYNC);
     return 0;

 case WM_CREATE:
     PlaySound (TEXT ("create.wav"), NULL, SND_FILENAME | SND_SYNC) ;
     return 0 ;

 case WM_PAINT:

     hdc = BeginPaint(hwnd, &ps);
     GetClientRect(hwnd, &rect);
     DrawText(hdc, TEXT("Hello, Windows 32 API!"), -1, &rect, DT_SINGLELINE | DT_TOP | DT_RIGHT);
     DrawText(hdc, TEXT("Hello, Windows 32 API!"), -1, &rect, DT_SINGLELINE);  //TOP |    LEFT
     EndPaint(hwnd, &ps);

     PlaySound(TEXT("paint.wav"), NULL, SND_FILENAME | SND_SYNC);

     return 0 ;

 case WM_LBUTTONDOWN:

     hdc=GetDC(hwnd);
     TextOut(hdc,50,50,TEXT("L-BUTTON-DOWN"),13);
     ReleaseDC(hwnd,hdc);

     PlaySound(TEXT("lbdown.wav"), NULL, SND_FILENAME | SND_ASYNC);

     //GetClientRect(hwnd, &rect);
     //InvalidateRect(hwnd, &rect, TRUE);

     return 0;

 case WM_LBUTTONUP:

     hdc = GetDC(hwnd);
     TextOut(hdc, 50, 50, TEXT("L-BUTTON-UP"), 11);
     ReleaseDC(hwnd, hdc);

     PlaySound(TEXT("lbup.wav"), NULL, SND_FILENAME | SND_SYNC);

     GetClientRect(hwnd, &rect);
     InvalidateRect(hwnd, &rect, TRUE);

     return 0;

 case WM_DESTROY:
     PlaySound(TEXT("close.wav"), NULL, SND_FILENAME | SND_SYNC);
     PostQuitMessage (0) ;

     return 0 ;
 }

 return DefWindowProc (hwnd, message, wParam, lParam) ;
}  
Run Code Online (Sandbox Code Playgroud)

这是我在WinMain中的窗口类

 wndclass.style         = CS_HREDRAW | CS_VREDRAW;
 wndclass.lpfnWndProc   = WndProc ;
 wndclass.cbClsExtra    = 0 ;
 wndclass.cbWndExtra    = 0 ;
 wndclass.hInstance     = hInstance ; //from WinMain arg
 wndclass.hIcon         = LoadIcon (NULL, IDI_ASTERISK) ;
 wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
 wndclass.hbrBackground = (HBRUSH) GetStockObject (DKGRAY_BRUSH) ;
 wndclass.lpszMenuName  = NULL ;
 wndclass.lpszClassName = TEXT("HelloWin!!!") ;
Run Code Online (Sandbox Code Playgroud)

我得到的问题是,
当我点击客户区时,消息显示正常,
L-BUTTON-DOWN

但是当我发布它时,第二个文本重叠......
L-BUTTON-UPWN

这显然意味着我需要在处理之前重新绘制客户区域WM_LBUTTONUP.

我怎样才能做到这一点 ?和,

没有任何消息之间WM_LBUTTONDOWNWM_LBUTTONUP,我可以使用,使客户区无效?

the*_*heB 5

重新绘制文本时,您永远不会清除原始文本.您需要扩展L-BUTTON-UP消息,使其具有相同的物理大小(丑陋的黑客)或测量较大的文本,并在绘制文本之前用背景颜色填充该矩形.

但这并不能解决另一个问题,如果您最小化并恢复窗口,或者用另一个窗口覆盖和揭开窗口,您将会看到这个问题.也就是说,如果窗口获得了WM_PAINT您的消息将完全消失,我认为这不是理想的行为.

您最好的选择是更新您的WM_PAINT消息以绘制鼠标状态文本,然后适当地更新WM_MOUSEDOWNWM_MOUSEUP消息处理程序.在伪代码中:

WM_PAINT:
    Draw "Hello, Windows 32 API!"
    Draw Mouse_State
WM_MOUSEDOWN:
    Mouse_State = "L-BUTTON-DOWN"
    InvalidateRect(client_area)
WM_MOUSEUP:
    Mouse_State = "L-BUTTON-UP"
    InvalidateRect(client_area)
Run Code Online (Sandbox Code Playgroud)