es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Haz que un CStatic no sea desplazable en MFC.

Tengo una clase de diálogo MFC que hereda de otra que ya tiene implementada una función de desplazamiento.

En esta clase estoy mostrando varias CStatics y me gustaría saber si sería posible “congelar” una de ellas o hacer que no sea desplazable.

Ya he intentado hacer una ventana secundaria de la primera para crear una CStatic en ella sin desplazamiento, pero no es realmente lo que estoy buscando, necesito hacerlo en el mismo diálogo.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible hacer que un CStatic no se pueda desplazar dentro de una clase de diálogo MFC que herede de otra con una implementación de desplazamiento. Se puede lograr esto sobrescribiendo los mensajes WM_VSCROLL y WM_HSCROLL del control CStatic y ignorándolos. Para hacer esto, se crea una nueva clase que herede de CStatic y se sobrescribe la función PreTranslateMessage para ignorar los mensajes de desplazamiento. Luego, se utiliza esta nueva clase en lugar de CStatic para el control estático que se desea hacer no desplazable.

    Aquí hay un ejemplo de implementación de la nueva clase CStatic:

    class CUnscrollableStatic : public CStatic
    {
    public:
        virtual BOOL PreTranslateMessage(MSG* pMsg)
        {
            if (pMsg->message == WM_VSCROLL || pMsg->message == WM_HSCROLL)
            {
                // Ignorar los mensajes de desplazamiento
                return TRUE;
            }
    
            return CStatic::PreTranslateMessage(pMsg);
        }
    };
    

    En la clase de diálogo, se crea una instancia de CUnscrollableStatic en lugar de CStatic para el control que se desea que no se pueda desplazar:

    CUnscrollableStatic m_staticNoDesplazable;
    

    Luego, en la función OnInitDialog de la clase de diálogo, se utiliza la función SubclassDlgItem para subclasificar el control estático existente con la nueva clase CUnscrollableStatic:

    BOOL CMyDialog::OnInitDialog()
    {
        // ...
    
        // Subclasificar el control estático existente con el nuevo que no se puede desplazar
        m_staticNoDesplazable.SubclassDlgItem(IDC_MI_STATIC, this);
    
        // ...
    }
    

    Reemplace IDC_MI_STATIC con el ID del control CStatic existente que desea que no se pueda desplazar.

    Con esta implementación, el control estático ya no responderá a los mensajes de desplazamiento y aparecerá como no desplazable.

Comments are closed.