none
Añadir funcionalidad al aspa de Cerrar, de la esquina superior derecha del form. RRS feed

  • Pregunta

  • Hola,

    estoy utilizando Windows forms C++ y quiero añadirle una determinada funcionalidad para cuando el usuario pinche en el aspa de la esquina superior derecha.

    He probado a utilizar el evento Form::FormClosed, pero ejecuta la funcionalidad siempre que se cierra el formulario (a través de un botón Cancelar que contiene, por ejemplo), y yo sólo quiero que se ejecute al pinchar en el aspa de la esquina superior derecha.

    ¿Se puede hacer a través de algún evento del form?




    • Editado maria_dp lunes, 6 de enero de 2014 13:45
    domingo, 5 de enero de 2014 21:35

Respuestas

  • private: 
    	bool m_aspa;
    
    	void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) 
    	{
    		if (m_aspa) MessageBox::Show("ASPA");
    	}
    
    
    protected:
    	virtual void WndProc(Message% m) override
    	{
    		/* si quieres usar las macros debes incluir <windows.h>*/
    		if (m.Msg == /*WM_NCLBUTTONDOWN*/ 0x00A1)
    		{
    			m_aspa = (int)m.WParam == /*HTCLOSE*/ 20;
    		}
    
    		Form::WndProc(m);
    	}

    BUG: si arrastras el ratón y lo sueltas fuera del aspa, la variable permanece en true. Si haces alt+f4, el formclosing te va a indicar que saliste con el aspa.

    Lamentablemente el WM_NCLBUTTONUP, que sería el evento justo, no da la impresión de producirse, salvo que la ventana esté maximizada..


    [W]


    • Editado [Walter] domingo, 5 de enero de 2014 23:58
    • Marcado como respuesta maria_dp lunes, 6 de enero de 2014 1:17
    domingo, 5 de enero de 2014 23:15
  • private: 
    
    void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) 
    {
    	Message ht;
    
    	ht.HWnd = this->Handle;
    	ht.Msg = /*WM_NCHITTEST*/ 0x0084;
    	ht.WParam = IntPtr::Zero;
    	
    	Point ^ pt = Cursor->Position;
    
    	ht.LParam = (IntPtr)(pt->X | pt->Y<<16);
    	DefWndProc(ht);
    
    	if ((int)ht.Result == /*HTCLOSE*/ 20)
    	{
    		MessageBox::Show("ASPA");
    	}
    }
    
    Acá se hace el hittest dentro del closing y listo. Habría que probar si funciona en una arquitectura de 64bits (mañana pruebo). Digo, la forma en la que construyo el LParam me parece un tanto rústica.

    [W]

    • Marcado como respuesta maria_dp lunes, 6 de enero de 2014 13:27
    lunes, 6 de enero de 2014 1:34

Todas las respuestas

  • private: 
    	bool m_aspa;
    
    	void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) 
    	{
    		if (m_aspa) MessageBox::Show("ASPA");
    	}
    
    
    protected:
    	virtual void WndProc(Message% m) override
    	{
    		/* si quieres usar las macros debes incluir <windows.h>*/
    		if (m.Msg == /*WM_NCLBUTTONDOWN*/ 0x00A1)
    		{
    			m_aspa = (int)m.WParam == /*HTCLOSE*/ 20;
    		}
    
    		Form::WndProc(m);
    	}

    BUG: si arrastras el ratón y lo sueltas fuera del aspa, la variable permanece en true. Si haces alt+f4, el formclosing te va a indicar que saliste con el aspa.

    Lamentablemente el WM_NCLBUTTONUP, que sería el evento justo, no da la impresión de producirse, salvo que la ventana esté maximizada..


    [W]


    • Editado [Walter] domingo, 5 de enero de 2014 23:58
    • Marcado como respuesta maria_dp lunes, 6 de enero de 2014 1:17
    domingo, 5 de enero de 2014 23:15
  • private: 
    
    void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) 
    {
    	Message ht;
    
    	ht.HWnd = this->Handle;
    	ht.Msg = /*WM_NCHITTEST*/ 0x0084;
    	ht.WParam = IntPtr::Zero;
    	
    	Point ^ pt = Cursor->Position;
    
    	ht.LParam = (IntPtr)(pt->X | pt->Y<<16);
    	DefWndProc(ht);
    
    	if ((int)ht.Result == /*HTCLOSE*/ 20)
    	{
    		MessageBox::Show("ASPA");
    	}
    }
    
    Acá se hace el hittest dentro del closing y listo. Habría que probar si funciona en una arquitectura de 64bits (mañana pruebo). Digo, la forma en la que construyo el LParam me parece un tanto rústica.

    [W]

    • Marcado como respuesta maria_dp lunes, 6 de enero de 2014 13:27
    lunes, 6 de enero de 2014 1:34
  • Muchísimas gracias, me ha sido de gran ayuda!
    lunes, 6 de enero de 2014 13:28