¿Cómo agregar una imagen de fondo a un formulario en vc++?
VC es una poderosa herramienta de desarrollo visual, pero la interfaz estándar creada con VC es tan oscura y monótona como la de Windows. Por ejemplo, el fondo de la ventana del marco principal en una aplicación de ventana de múltiples documentos es así. . Entonces, ¿es posible cambiar el color del fondo de la ventana del marco principal o agregar una imagen hermosa como fondo de la ventana del marco principal? En realidad no es difícil. Sin embargo, a diferencia del método de cambiar el fondo de la ventana de marco en una aplicación de ventana de un solo documento, cambiar el fondo de la ventana de marco principal en una aplicación de ventana de múltiples documentos no se puede lograr simplemente sobrecargando la función OnEraseBkgnd (CDC* pDC) en Asistente de clase. Debido a que el área de fondo de la ventana del marco principal en una aplicación de ventana de múltiples documentos es una ventana de la clase MDIClient, cambiar el fondo está relacionado con la ventana de la clase MDIClient. El identificador de la ventana de la clase MDIClient es m_hWndMDIClient (en CMDIFrameWnd). Los siguientes son los pasos para implementarlo:
1. Utilice el asistente MFC AppWizard para crear una aplicación de ventana de múltiples documentos
1 Haga clic en [Nuevo] en el menú "Archivo". de VC. Aparece un cuadro de diálogo "Nuevo". Seleccione "MFC AppWizard [exe]" en la página "Proyectos", ingrese "DrawBackground" en el cuadro de edición "Nombre del proyecto" y presione el botón [Aceptar] para salir del cuadro de diálogo "Nuevo".
2. Seleccione las opciones predeterminadas en el cuadro de diálogo "MFC AppWizard paso 1" al cuadro de diálogo "MFC AppWizard paso 6" y presione el botón [Finalizar] para completar la personalización del documento múltiple. aplicación de ventana.
Nota: MFC (Microsoft Foundation Class) es la biblioteca de clases de MS-Visual C++.
2. Agregue mapa de bits a la aplicación
Haga clic en "Recurso incluido..." en el menú "Ver" de VC y seleccione "Mapa de bits" en el cuadro de diálogo emergente. Presione el botón [Importar] para cargar el archivo de mapa de bits desde el archivo. Haga clic en "Recurso" en "Espacio de trabajo" para ver el archivo de mapa de bits que acaba de cargar.
3. Utilice ClassWiard para generar una clase derivada CclientWnd de la clase CWnd
Sobrecarga OnEraseBkgnd(CDC*pDC), OnSize(UINT nType, int cx, int cy) en CclientWnd. función de clase y agregue manualmente la función virtual sobrecargada WNDPROC* CClientWnd::GetSuperWndProcAddr() para devolver el puntero de función.
El código del archivo de encabezado de la clase CclientWnd es el siguiente:
clase CClientWnd : public CWnd
{
// Construcción p>
público:
CClient();
// Atributos
público:
// Operaciones
public:
// Anulaciones
// Anulaciones de funciones virtuales generadas por ClassWizard
file://{{AFX_VIRTUAL(CClientWnd)
público:
virtual WNDPROC* GetSuperWndProcAddr();
file://}}AFX_VIRTUAL
// Implementación
público:
virtual ~CClientWnd();
// Funciones de mapa de mensajes generados
protegidos:
file://{ {AFX_MSG( CClientWnd)
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy
archivo); :// }}AFX_MSG
DECLARE_MESSAGE_MAP()
};
El código del archivo de implementación de la clase CclientWnd es el siguiente:
// Controladores de mensajes CClientWnd
BOOL CClientWnd::OnEraseBkgnd(CDC* pDC)
{
// TODO: Agregue su código de controlador de mensajes aquí y/o call default
CRect rectbk; // Tamaño del área del cliente
CDC dcMen; // Tabla de descripción del dispositivo de memoria
CBitmap bmbk // Objeto de mapa de bits
p>bmbk.LoadBitmap(IDB_BITMAP1); //Cargar mapa de bits del recurso
//Obtener el tamaño del mapa de bits
BITMAP stBitmap
bmbk.GetObject (tamaño de (BITMAP),&stBitmap);
CSize bmsize(stBitmap.bmWidth,stBitmap.bmHeight
////////
dcMen.CreateCompatibleDC(pDC); //Crea una tabla de contexto de dispositivo compatible
//Selecciona el nuevo objeto de mapa de bits y guarda el antiguo objeto de mapa de bits
CBitmap *pold= dcMen .SelectObject(&bmbk);
GetClientRect(&rectbk);
//Obtener el tamaño del área del cliente
//Copiar el objeto de mapa de bits de la memoria. a la pantalla
pDC->StretchBlt(rectbk.left,rectbk.top,
rectbk.Width(),
rectbk.Height(),&dcMen,0,0,bmsize.cx,bmsize.cy,SRCCOPY
dcMen.SelectObject(pold);
//Restaurar el antiguo objeto de mapa de bits dcMen.DeleteDC();// Liberar la tabla de descripción del dispositivo de memoria return true; }
WNDPROC* CClientWnd::GetSuperWndProcAddr()
{static WNDPROC NEAR pfnSuper = NULL; return &pfnSuper; // Devuelve puntero de función}
void CClientWnd::OnSize(UINT nType, int cx, int cy)
{CWnd::OnSize(nType, cx, cy);// TODO: agregue aquí el código del controlador de mensajes file://Redraw windowInvalidate() }
Modifique la clase CMainFrame
.Defina una variable miembro m_wndClient de la clase CMainFrame en la clase CMainFrame y una subclase m_wndClient en la ventana del cliente de la ventana del marco principal en la función CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct). El código es el siguiente:
Agregar a MainFrm.h:
#include "ClientWnd1.h"
clase CMainFrame: public CMDIFrameWnd
{private: CClientWnd m_wndClient;};
Agregue el siguiente código a MainFrm.cpp:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ if (CMDIFrameWnd ::OnCreate(lpCreateStruct) == -1)
return -1;
file://Subclass m_wndClient en la ventana del cliente de la ventana del marco principal
if(!m_wndClient.SubclassWindow(m_hWndMDIClient))
{TRACE("Error al subclasificar la ventana del cliente MDI\n");
return -1;}}
5. Tecnologías clave
1. Este programa no es complicado. La clave es saber que el área de fondo de la ventana del marco principal en una aplicación de ventana de múltiples documentos. ventana de la clase MDIClient.
2. Seleccione la función correctamente. Por ejemplo, en la función CClientWnd::OnEraseBkgnd(CDC* pDC), es mejor utilizar la función GetClientRect(&rectbk) para obtener el tamaño del área del cliente. para utilizar la función GetClipBox(&rectbk).
3. Sobrecargue la función OnSize(UINT nType, int cx, int cy) en la clase CclientWnd y agregue la función Invalidate() para volver a dibujar la ventana.