Esta nota describe la MFC rutinas que soportan Windows de asignación de objetos identificadores de objetos de C++.
El problema
Objetos de Windows normalmente están representados por manejars. Las clases MFC envuelven identificadores de objeto de Windows con objetos de C++. Las funciones de envoltura de identificador de la biblioteca de clases MFC proporcionan una manera de encontrar el objeto de C++ que es envolver el objeto de Windows con un controlador especial. Hay veces que cuando un objeto de Windows no tiene un objeto de contenedor de C++, sin embargo y en estos momentos que se crea un objeto temporal para actuar como el contenedor de C++.
Son los objetos de Windows que utilizan mapas de mango:
Dado un identificador a cualquiera de estos objetos, puede encontrar el objeto MFC que envuelve el identificador llamando a la función miembro estática FromHandle. Por ejemplo, dado un HWND hWnd de llamada:
CWnd::FromHandle(hWnd)
devolverá un puntero a la CWnd que envuelve el hWnd. Si ese hWnd no tiene un objeto contenedor específico, se crea un temporal CWnd para envolver el hWnd. Esto hace posible obtener un objeto de C++ válido de cualquier control.
Una vez que tenga un objeto contenedor, se puede llegar a su control a través de una variable miembro público. En el caso de un CWnd, antes contiene el HWND para ese objeto.
Asociar controladores a objetos MFC
Dado un objeto recién creado asa-wrapper y un controlador a un objeto de Windows, puede asociar los dos llamando a adjuntar. Por ejemplo:
CWnd myWnd;
myWnd.Attach(hWnd)
Esto hace una entrada en el mapa permanente asociar myWnd y hWnd. Llamar a CWnd::FromHandle(hWnd) ahora devolverá un puntero a myWnd. Cuando se eliminan los myWnd , el destructor destruye automáticamente el hWnd llamando a la función de Windows DestroyWindow . Si esto no es deseada, el hWnd se debe separa de myWnd antes de que se destruye el objeto myWnd (normalmente cuando se definió la dejando el ámbito en que myWnd ). La función de miembro de separar hace esto.
myWnd.Detach()
Más información acerca de objetos temporales
Objetos temporales se crean siempre FromHandle se da un identificador que ya no tienen un objeto contenedor. Estos objetos temporales se separa su manejador y eliminar las funciones DeleteTempMap . El procesamiento de OnIdle predeterminado en CWinThread llama automáticamente DeleteTempMap para cada clase que admite mapas de control temporal. Esto significa que no puede asumir que un puntero a un objeto temporal será válido del punto de salida de la función donde se obtuvo el puntero, ya que se eliminará el objeto temporal durante el tiempo de inactividad de bucle de mensajes de Windows.
Objetos de contenedor y varios subprocesos
Objetos temporales y permanentes se mantienen en una base de cada subproceso. Es decir, un subproceso no puede acceder a otro subprocesos objetos contenedor de C++, independientemente de si es temporal o permanente. Como se indicó anteriormente, los objetos temporales se eliminan cuando el subproceso que pertenece ese objeto temporal entra OnIdle.
Pasar estos objetos desde un subproceso a otro, siempre enviar como su nativo manejar escriba. Pasar un objeto de contenedor de C++ de un subproceso a otro a menudo dará lugar a resultados inesperados.
&Notas técnicas por número |nbsp; Notas técnicas por categoría