Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在WM_LBUTTONDOWN和WM_LBUTTNUP之间是否总是有任何信息?_C++_Winapi - Fatal编程技术网

C++ 在WM_LBUTTONDOWN和WM_LBUTTNUP之间是否总是有任何信息?

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

我正试图在屏幕上写一段文字 当我的鼠标的L按钮按下保持时,客户端区域将显示 L按钮 当我释放它时,屏幕应该显示 L按钮

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

这是我在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按钮向上

这显然意味着在处理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)