2016-05-31 26 views
-3

我试图写在屏幕上
文本按我的鼠标的左按钮时(HOLD),客户端区域应显示
L-BUTTON-DOWN
,当我放开,屏幕应该显示
L-Button-UPWM_LBUTTONDOWN和WM_LBUTTNUP之间是否存在任何消息?

这是我迄今所做的(这是窗口过程

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) ; 
} 

,这是我的窗口CLA SS在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!!!") ; 

我得到的问题是,
当我在客户区L-单击,消息显示细腻,
L-BUTTON-DOWN

但是当我释放,第二个文本重叠...
L-BUTTON-UPWN

这很明显意味着我需要重新绘制客户区,然后才能处理WM_LBUTTONUP

我该怎么做?和

WM_LBUTTONDOWNWM_LBUTTONUP之间是否有任何消息可用于使客户区域无效?

+0

为什么不只是在文本上画一个白色的矩形,或什么? – immibis

+0

这是一个出路....但你看,我将如何得到正确的坐标? –

+0

您可以使用您在假想的鼠标间消息消息中使用的坐标。如果你不知道那里的坐标,处理这些假想的消息将不是解决方案的一部分。 – IInspectable

回答

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) 
相关问题