Código fuente de la biblioteca de aspectos Vc
Sabemos que la clase correspondiente al control del botón es CButton, por lo que tenemos que derivar una clase a partir de esta clase.
La forma de derivar la clase CButton es ingresar a la pestaña ClassView, hacer clic derecho en Primeras clases y seleccionar Nueva clase... Luego aparecerá un cuadro de diálogo de nueva clase. El elemento Nombre es el nombre de la nueva clase. El nombre de la clase aquí es CNewButton. Seleccione CButton como clase base y haga clic en Aceptar. En este momento, hay una clase CNewButton adicional en Primeras clases, que es una clase derivada de la clase Botón (CButton).
Luego agregue la función virtual DrawItem en CNewButton. El método para agregar la función virtual se explicó al agregar la función virtual PreTranslateMessage.
La definición de esta función es la siguiente:
void CNewButton::DrawItem(LPDRAWITEMSTRUCT LPDRAWITEMSTRUCT)
LpDrawItemStruct es un puntero a la estructura DrawItemStruct, en " Colección en línea (reimpresa))". El código en las letras de DrawItem es el siguiente: //todo: Agrega tu código para dibujar el elemento especificado.
CDC dc
Washington. adjuntar(lpDrawItemStruct-gt; hDC); //La función ATTACH en la clase CDC se utiliza para convertir HDC a CDC.
UINT state = lpDrawItemStruct- gt; itemState
CRect ButtonRect
GetClientRect(amp;ButtonRect); //Llame a la función GetWindowRect en la clase del botón para obtener. el tamaño del área del botón.
MemDC CDC
memDC. CreateCompatibleDC(amp; DC); //Crea un DC compatible
CBitmap bmp
if (estado ampODS_SELECTED) //Si se presiona el botón,
{
bmp. load bitmap(IDB _ SELECT); //Carga la imagen presionada
}
Otros
{
bmp. cargar mapa de bits(IDB _ NORMAL);
}
Bitmap bmpInfo
bmp. Obtener mapa de bits (información ampBMP); //Obtener información de mapa de bits
memDC. seleccionar objeto(ampBMP); //Seleccionar imagen.
Washington.
StretchBlt(0, 0, ButtonRect.right, ButtonRect.bottom, ampmemDC,
0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, copia src //Mostrar imagen
); CString string;
GetWindowText(str); //Obtener texto del botón
Washington. SetBkMode(transparent); //Establece el fondo del texto en transparente
Washington. DrawText(string ampButtonRect, DT_CENTER | DT_VCENTER | DT_single line); //Texto del botón de salida memDC. EliminarDC();
bmp. eliminar objeto(); Luego, agregamos un botón al cuadro de diálogo y lo convertimos en una variable asociada. En el cuadro de diálogo Agregar variable miembro, seleccione CNewButton en la columna Tipo de variable, establezca el estilo del control del botón en "Descripción del propietario" y luego incluya NewButton.h (el archivo de encabezado de clase de botón derivado) en la clase de diálogo: #include" new button. h" Luego compilamos y ejecutamos, el efecto es el siguiente:
Porque solo procesamos los dos estados del botón, el estado presionado y el estado normal, cuando el botón recibe el foco o está activado. en otros estados no existe ninguna acción correspondiente.