我想在屏幕上写一个文字
当我按下鼠标的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) ;
}
这是我在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-BUTTON-DOWN
但是当我发布它时,第二个文本重叠....
L-BUTTON-UPWN
这显然意味着我需要在处理WM_LBUTTONUP
之前重新绘制客户区域。
我该怎么做?而且,
WM_LBUTTONDOWN
和WM_LBUTTONUP
之间是否有任何消息可用于使客户区无效?
答案 0 :(得分:5)
重新绘制文本时,您永远不会清除原始文本。您需要展开{{1}}消息,使其具有相同的物理大小(丑陋的黑客)或测量较大的文本,并在绘制文本之前用背景颜色填充该矩形。
但这不能解决另一个问题,如果你最小化和恢复你的窗户,或者用另一个窗口覆盖和揭开你的窗户,你会看到它。也就是说,如果窗口获得L-BUTTON-UP
,您的消息将完全消失,我认为这不是理想的行为。
您最好的选择是更新WM_PAINT
消息以绘制鼠标状态文本,然后相应地更新WM_PAINT
和WM_MOUSEDOWN
消息处理程序。在伪代码中:
WM_MOUSEUP