Es necesario volver a compilar Visual C++ al escribir un programa en otra computadora
El identificador de instancia de la aplicación se almacena en CWinAppIm_hInstance y puede llamar a
AfxGetInstancdHandle para obtener el identificador.
Ejemplo: HANDLE hInstance=AfxGetInstanceHandle();
2. ¿Cómo obtener el puntero de la ventana principal de la aplicación a través del código?
El puntero de la ventana principal se almacena en CWinThread::m_pMainWnd, lo que se puede lograr llamando a AfxGetMainWnd.
AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED); //Maximiza el programa.
3. ¿Cómo obtener los íconos de otros programas en el programa?
Dos métodos:
(1) la función SDK SHGetFileInfo o use ExtractIcon para obtener el identificador del recurso de icono
(2) la función SDK que SHGetFileInfo puede obtener; el identificador del archivo Mucha información, como el tamaño del icono, los atributos, el tipo, etc.
Ejemplo (1): sizeof(stFileInfo),SHGFI_ICON))
{
pDC ->DrawIcon(10,10,stFileInfo.hIcon); /p>
}
}
Ejemplo(2): La misma función, usando la función ExtractIcon
void CSampleView::OnDraw(CDC * pDC)
{
HICON hIcon=::ExtractIcon(AfxGetInstanceHandle(),_T
("NotePad.exe"),0);
if (hIcon &&hIcon!=(HICON)-1)
pDC->DrawIcon(10,10,hIcon);
}
Descripción: Para obtener la ruta de notepad.exe, debe obtenerla a través de la función oficial GetWindowsDirectory. Si está llamando al pincel en win95, debe usar el método de acceso al registro para obtener su ruta. programa más sofisticado, debes considerar todo de manera integral.
4. ¿Cómo finalizar la aplicación mediante programación? ¿Cómo programo un reinicio de Windows?
Este es un problema muy simple pero que se encuentra a menudo en la programación.
La primera pregunta es enviar el mensaje WM_CLOSE a la ventana y llamar a la función miembro CWnd::OnClose. Permitir preguntar al usuario
si desea guardar los datos modificados.
Ejemplo: AfxGetMainWindow()->SendMessage(WM_CLOSE);
También puede crear una función personalizada Terminar ventana
void Terminar ventana (LPCSTR pCaption)
{
CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption);
if (pWnd)
pWnd -> EnviarMensaje (WM_CLOSE);
}
Nota: No se recomienda utilizar la función FindWindow porque no puede manejar cambios automáticos en la barra de título. Por ejemplo, queremos detectar si el Bloc de notas. Ya se está ejecutando, y si no conoce la barra de título del Bloc de notas de antemano, FindWindow no puede hacer nada. Se puede lograr enumerando la lista de tareas de la ventana. Hay una introducción más detallada en el libro "Guía para desarrolladores de API de Windows 95" publicado por Machinery Industry Press, por lo que no entraré en detalles aquí.
La segunda pregunta es utilizar la función ExitWindowsEx para controlar si el sistema se reinicia o Windows.
5. ¿Cómo agregar otras aplicaciones?
Recuerdo que esta parecía ser una pregunta muy común.
Puedes utilizar tres funciones del SDK: winexec, shellexecute y createprocess.
WinExec es el más simple, con dos parámetros, el primero especifica la ruta y el segundo especifica el modo de visualización. Vale la pena mencionar que este último parámetro, si usa SW_SHOWMAXMIZED para agregar un programa sin un botón de maximizar, como Neterm, calc, etc., no aparecerá en la forma normal, pero siempre se agregará a la lista de tareas. ShellExecute WinExex es más flexible. Puede especificar el directorio de trabajo. El siguiente ejemplo abre directamente c:\temp\1.txt sin tener que insertar el archivo txt asociado con la aplicación. Muchos programas de instalación abrirán una ventana una vez completado el programa. . para mostrar el archivo Léame o las preguntas frecuentes, supongo que así es como funciona.
ShellExecute(NULL,NULL,_T("1.txt"),NULL,_T("c:\temp"),SW_SHOWMAXMIZED);
CreateProcess es el más complejo. Un **** tiene diez parámetros, pero la mayoría de ellos pueden ser reemplazados por NULL, que puede especificar los atributos de seguridad, información de herencia, prioridad de clase, etc. del proceso. Tomemos un ejemplo muy simple:
STARTUPINFO stinfo; //información de la ventana de inicio
PROCESSINFO procinfo; //información del proceso
CreateProcess(NULL,_T(" notepad .exe"), NULL,_T("notepad.exe"), _T("notepad.exe"), NULL, NULL.NULL,NULL.FALSE,NORMAL_PRIORITY_
CLASS,NULL,NULL, &stinfo ,&procinfo);
6. Determine la ruta de la aplicación
Alguien parecía haber hecho esta pregunta hace unos días.
Utilice GetModuleFileName para obtener la ruta a la aplicación y luego elimine el nombre del archivo ejecutable.
Ejemplo:
TCHAR exeFullPath[MAX_PATH]; // MAX_PATH está definido en la API, cierto, parece ser 128
GetModuleFileName(NULL,exeFullPath ,MAX_PATH)
7. Obtenga diversa información del directorio
Directorio de Windows: use "GetWindowsDirectory"
Directorio del sistema en Windows: use "GetSystemDirectory" p>
Directorio temporal. Utilice "GetTempPath"
Directorio actual: utilice "GetCurrentDirectory"
Tenga en cuenta que el primer parámetro de las dos primeras funciones es el nombre de la variable del directorio y el último es el buffer; Dos son lo opuesto.
8. Cómo personalizar el mensaje
Algunas personas también lo han preguntado, pero en realidad no es difícil.
(1) Para definir manualmente el mensaje, puede escribir #define WM_MY_MESSAGE(WM_USER+100),
MS recomienda escribir al menos WM_USER+100; >(2) Escriba una función de procesamiento de mensajes y use WPARAM y LPARAM para devolver LRESULT.
Cómo personalizar el mensaje
8.p>LRESULT CMainFrame::OnMyMessage(WPARAM wparam,LPARAM lParam)
{
// Agrega tu función de procesamiento
}
(3)Declarala en el AFX_MSG de la clase, que es el "mapeo de macros"
(3)
(3)
Declarado en AFX_MSG de la clase. /p>