2016-05-31 27 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) 
相關問題