Pregunta

Este es mi código:

internal enum WindowsMessagesFlags {
    WM_EXITSIZEMOVE      = 0x00000232,
    WM_DISPLAYCHANGE     = 0x0000007e,
    WM_MOVING            = 0x00000216,
}

protected override void WndProc(ref Message m) {
    switch(m.Msg) {
        case (int)WindowsMessagesFlags.WM_DISPLAYCHANGE:
            FixWindowSnapping();
            break;
        case (int)WindowsMessagesFlags.WM_EXITSIZEMOVE:
            SaveWindowProperties();
            break;
        case (int)WindowsMessagesFlags.WM_MOVING:
            KeepProperLocation(ref m);
            break;
    }
}

¿Hay alguna forma de evitar el lanzamiento?

¿Fue útil?

Solución

Más o menos - emite m.Msg en su lugar:

protected override void WndProc(ref Message m) {
    switch((WindowsMessagesFlags) m.Msg) {
        case WindowsMessagesFlags.WM_DISPLAYCHANGE:
                FixWindowSnapping();
                break;
        case WindowsMessagesFlags.WM_EXITSIZEMOVE:
                SaveWindowProperties();
                break;
        case WindowsMessagesFlags.WM_MOVING:
                KeepProperLocation(ref m);
                break;
    }
}

La razón por la que necesita la conversión es porque en C # las enumeraciones no son solo números, son números asociados con el tipo. Esto le impide hacer (sin lanzar):

HttpStatusCode status = someWindowsMessageFlag;

Esto es claramente algo bueno :) Cuando lo necesite, sin embargo, siempre puede ir "a través de" el tipo subyacente (int en este caso).

Otros consejos

¿Cómo se define Message.Msg?

Apuesto a que es Int32.

También apuesto a que WindowsMessagesFlags es su tipo, pero Message es del marco.

Lo que significa que está utilizando su propia enumeración con un objeto creado por el marco y, por supuesto, tendrán algunas incompatibilidades con respecto a los tipos.

Una enumeración es un tipo fuerte, no solo un número , es un número con un nombre en un contexto . Este nombre, contexto, número, parte no es directamente compatible con solo números, y es por eso que necesita emitir.

Una razón es porque C # actualmente (4.0) no le permite escribir una sobrecarga de operador implícita (una conversión) dentro de un método de extensión ( pregunta relacionada ) para cualquier tipo, incluida una enumeración. Sería bueno convertir limpiamente a / desde Int16 cuando se integra con una base de datos de tipo débil, por ejemplo, o un formato de serialización de tipo débil (escritor binario).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top