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); } }