C++ 在WM_LBUTTONDOWN和WM_LBUTTNUP之间是否总是有任何信息?
我正试图在屏幕上写一段文字 当我的鼠标的L按钮按下保持时,客户端区域将显示 L按钮 当我释放它时,屏幕应该显示 L按钮 这是我到目前为止所做的这是窗口程序 这是我在WinMain中的窗口类C++ 在WM_LBUTTONDOWN和WM_LBUTTNUP之间是否总是有任何信息?,c++,winapi,C++,Winapi,我正试图在屏幕上写一段文字 当我的鼠标的L按钮按下保持时,客户端区域将显示 L按钮 当我释放它时,屏幕应该显示 L按钮 这是我到目前为止所做的这是窗口程序 这是我在WinMain中的窗口类 wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclas
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按钮向上
这显然意味着在处理WM_LBUTTONUP之前,我需要重新绘制客户端区域
我该怎么做?以及
WM_LBUTTONDOWN和WM_LBUTTONUP之间是否有任何消息可用于使客户端区域无效?重新绘制文本时,您永远不会清除原始文本。您需要展开L按钮消息,使其具有相同的物理大小,或者测量较大的文本,并在绘制文本之前用背景色填充该矩形 但这并不能解决另一个问题,如果你最小化并恢复你的窗口,或者用另一个窗口覆盖并揭开你的窗口,你就会看到这个问题。也就是说,如果窗口得到一个WM_PAINT,您的消息将完全消失,我认为这不是期望的行为 最好的方法是更新WM_PAINT消息以绘制鼠标状态文本,然后适当地更新WM_MOUSEDOWN和WM_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)
为什么不在文本上画一个白色的矩形,或者其他什么呢?这是一种解决方法。。。。但是你看,我怎样才能得到正确的坐标呢?你使用的坐标与假设的中间鼠标消息中使用的坐标相同。如果您不知道其中的坐标,那么处理此假设消息将不是解决方案的一部分。请告诉我如何实现它?您可以使用GetTextExtentPoint32或DrawText来计算文本字符串的像素大小。
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)