2009-10-01 15 views

Respuesta

15

MFC mantiene una cantidad de mapas de control, desde HWND a CWnd, HDC a CDC, etc., que se almacenan en el estado del hilo. Cada mapa de asa contiene un mapa permanente y un mapa temporal: las entradas permanentes se agregan cuando se llama a un método como CWnd :: Create o CDC :: Attach, mientras que las entradas temporales se crean cuando se llama FromHandle en un identificador que no tiene un entrada permanente.

Las entradas temporales se limpian durante el procesamiento inactivo (en CWinApp :: OnIdle), por lo que solo se pueden usar de forma segura mientras se procesa el mensaje actual. Tan pronto como regrese al ciclo de mensajes, o ingrese otro ciclo modal (por ejemplo, al llamar a DoModal), es posible que se eliminen.

+0

¿Esto significa que podría obtener el HWND del CWnd (posiblemente temporal) y almacenarlo en su lugar? Luego, más adelante cuando sea necesario, puede llamar a FromHandle utilizando el HWND almacenado para obtener un CWnd. – Steg

+2

Sí, eso estaría bien, el HWND será válido durante el tiempo de vida de la ventana. –

+0

Excelente, aplaude Phil – Steg

0

Basado en la misma descripción de MSDN, supongo que esto significa que si no se adjunta CWnd al hWnd provisto como un objeto, creará un CWnd temporal que probablemente se destruirá cuando algo salga del alcance, o un se llama a destructor en cualquier otro lugar, o se crea explícitamente un CWnd para el hWnd en cuestión. Entonces, si ya tiene un CWnd creado, debería estar bien, de lo contrario, probablemente tenga que tener mucho cuidado al guardar el puntero que recibe.

0

Por lo general, solo quieren que utilice este controlador en el ámbito de su función. Y no para almacenarlo como un campo de clase donde lo referencia a lo largo de la vida de su objeto.

+0

No es que gran parte del ámbito de la función como al procesar el mismo mensaje supongo. – EFraim

1

FromHandle se utiliza básicamente para obtener una referencia transitoria a un objeto de ventana ya existente. MFC almacena estas referencias en una estructura interna denominada mapa de identificador temporal (un mapa de identificador es un mapa de HWND de Windows a objetos MFC CWnd utilizados por MFC para hacer que las llamadas Win32 manipulen la ventana real de Windows a la que corresponde el objeto MFC). Para evitar que el número de objetos en esta estructura crezca más allá de todos los límites, los elementos se eliminan del mapa de asas durante el procesamiento de ciclo inactivo de MFC.

Como ya habrás adivinado, también hay un mapa de control permanente que no tendrá este comportamiento de limpieza automática. Si necesita obtener un objeto CWnd que no ponga su referencia HWND en el mapa temporal del controlador, puede llamar a FromHandlePermanent().

-Ron

Cuestiones relacionadas