visual restaurar net minimizado maximizar mas hacer grande formulario form como ajustar c++ winapi mfc

c++ - restaurar - El curioso problema del mensaje WM_NCLBUTTONUP que falta cuando una ventana no está maximizada



maximizar form en c# (4)

Una conjetura salvaje: algún código captura el mouse, probablemente para facilitar el movimiento de la ventana cuando agarras el título. Eso explicaría también por qué la interrupción del depurador provocaría la aparición del mensaje: la interacción del depurador borra la captura del mouse.

Yo sugeriría que ejecutaras Spy ++ en esa ventana y sus hijos y trataran de averiguar quién recibe el mensaje de botón.

En cuanto a cómo solucionarlo, no puedo ayudarte sin mirar el código real. Tendrás que descubrir quién es el culpable y mirar su código.

Tengo una ventana que maneja los mensajes WM_NCLBUTTONUP, para manejar los clics en botones personalizados en la barra de título. Esto funciona muy bien cuando la ventana está maximizada, pero cuando no lo es, ¡el mensaje WM_NCLBUTTONUP nunca llega! Sin embargo, recibo un mensaje WM_NCLBUTTONDOWN. Extrañamente WM_NCLBUTTONUP llega si hago clic a la derecha de la barra de menú, pero en cualquier lugar a lo largo de la barra de título / marco de ventana, el mensaje nunca llega.

Después de un tiempo de depuración descubrí que si establecía un punto de interrupción en CMainFrame :: OnNcLButtonDown (), hice clic en la barra de título, pero mantuve presionado el botón del mouse, dejé que el depurador interrumpa la función, presioné F5 para continuar depurando, luego lancé el botón del mouse - ¡mágicamente se envía WM_NCLBUTTONUP!

Mi pregunta es doble, (1) ¿qué demonios está pasando? (2) ¿cómo puedo solucionar este "problema"?

También observo que hay varias otras personas en Internet que tienen el mismo problema (un Google rápido revela muchas otras personas con el mismo problema, pero no hay solución).

Editar
Gracias por las dos primeras respuestas, intenté llamar a ReleaseCapture en NCLButtonDown, pero no tiene ningún efecto (de hecho, devuelve NULL, lo que indica que la captura no está en su lugar). Solo puedo suponer que la funcionalidad de la clase base (def window proc) puede establecer una captura. Investigaré el lunes ...


He tenido el mismo problema El problema es que, al hacer clic con el botón izquierdo en el título de la ventana, se inicia un arrastre y, por lo tanto, se captura el mouse, lo que impide que llegue WM_NCLBUTTONUP.

La solución es anular WM_NCHITTEST:

LRESULT CALLBACK WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { switch (nMsg) { ... case WM_NCHITTEST: Point p(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam); ScreenToClient(p); if (myButtonRect.Contains(p)) { return HTBORDER; } break; } return DefWindowProc(hWnd, nMsg, wParam, lParam); }

Entonces, básicamente, le informa a Windows que el área ocupada por su botón no es parte del título de la ventana, sino una parte no específica del área no cliente (HTBORDER).

Nota al pie: Si ha llamado a SetCapture () y aún no se llama ReleaseCapture () cuando espera que entre el mensaje WM_NCLBUTTONDOWN, no llegará incluso con el cambio anterior. Esto puede ser irritante ya que es normal capturar el mouse durante la interacción con dichos botones personalizados para que pueda cancelar el clic / resaltar si el mouse sale de la ventana. Sin embargo, como alternativa al uso de la captura, puede considerar SetTimer () / KillTimer () con un intervalo corto (por ejemplo, 100 ms), que no hará que los mensajes WM_NCLBUTTONUP desaparezcan.


incluir ReleaseCapture () en WM_NCLBUTTONDOWN {code block}


Para agregar a la respuesta de Franci Penov , un clic en la barra de título se interpreta como el inicio de un arrastre para cambiar la posición de la ventana. La ventana está capturando el mouse para que pueda realizar el arrastre. Como no se puede arrastrar una ventana maximizada, la captura se salta y el mensaje se enruta normalmente.