Problema de respuesta al mensaje OnMouseMove (botón no presionado)

Causas:

  Originalmente quería usar MFC para hacer un botón que no se puede presionar (el mouse se mueve sobre el botón, el botón se alejará), use el mensaje WM_MOUSEMOVE para buscar

  El mensaje WM_MOUSEMOVE no se envía a la ventana principal cuando el mouse está sobre el botón

Solución:

  Use la función SetCapture () para capturar mensajes del mouse

  setCapture captura los siguientes eventos del mouse: onmousedown, onmouseup, onclick, ondblclick, onmouseover y onmouseout

  Existe exactamente el mensaje que necesitamos capturar, pero esta función es un poco abrumadora y no se pueden realizar otros eventos durante la captura, por lo que debe liberarse a tiempo

  Suelte usando la función ReleaseCapture ()

Nota:

  La función SetCapture () parece requerir que el programa tenga derechos de administrador

void CBiaoBai1Dlg :: OnMouseMove (UINT nFlags, CPoint point) 
{ 
	// TODO: agrega el código del controlador de mensajes y / o llama al valor predeterminado 
	CDialogEx :: OnMouseMove (nFlags, point); 

	// Establece la captura del mouse 
	SetCapture (); 

	/ / obtener la posición del botón desacuerdo (con respecto a la esquina superior izquierda de la pantalla) 
	CRect rect_disagree; 
	m_Disagree_Button.GetWindowRect (y rect_disagree); 
	// obtener el consentimiento del botón 
	rect_agree CRect; 
	m_agree.GetWindowRect (y rect_agree); 
	// obtiene considerando el botón 
	rect_think CRect; 
	m_think.GetWindowRect (& rect_think); 

	// Obtenga el ancho y la 
	altura del botón de desacuerdo int height = rect_disagree.Height (); 
	int width = rect_disagree.Width (); 

	// Convierta las coordenadas del cliente en coordenadas de pantalla 
	ClientToScreen (& point); 

	/ / Determine si el mouse está en los botones de consentimiento y consideración 
	// Si está en ellos, suelte la captura del mouse
	if (rect_agree.PtInRect (point) || rect_think.PtInRect (point)) 
	{ 
		// Liberar captura del mouse 
		ReleaseCapture (); 
	} 

	rect_disagree.NormalizeRect (); 
	BOOL ret = PtInRect (rect_disagree, point); 
	if (ret) 
	{ 
		/ / Obtener el tamaño del cliente 
		CRect rect; 
		GetClientRect (& rect); 
		// Determinar el rango de movimiento aleatorio en el cliente 
		// Si cae en los botones de consentimiento y consideración, volverá a ser aleatorio 
		int re_x; 
		int re_y; 
		CPoint point_youxia; 
		CPoint point_youshang; 
		CPoint point_zuoxia; 
		do 
		{ 
			re_x = rand ()% (rect.right-width); 
			re_y = rand ()% (rect.bottom-height); 
			point.SetPoint (re_x, re_y); 
			// Convierte las coordenadas del cliente en la pantalla Coordenadas
			ClientToScreen (y punto); 
			point_youxia.SetPoint (punto.x + ancho, punto.y + altura); 
			point_youshang.SetPoint (punto.x + ancho, punto.y); 
			point_zuoxia.SetPoint (point.x, point.y + height); 

		} While (rect_agree.PtInRect (punto) || rect_think.PtInRect (punto) 
			|| rect_agree.PtInRect (point_youxia) || rect_think.PtInRect (point_youxia) 
			|| rect_agree.PtInRect (point_youshang) || rect_think.PtInRect (point_youshang) 
			| | rect_agree.PtInRect (point_zuoxia) || rect_think.PtInRect (point_zuoxia)); 
		rect.SetRect (re_x, re_y, re_x + ancho, re_y + altura); 
		m_Disagree_Button.MoveWindow (& rect, TRUE);	
	} 
}

  

 

Supongo que te gusta

Origin www.cnblogs.com/ndyxb/p/12727938.html
Recomendado
Clasificación