Cómo implementar el código fuente vc de forma especial
Utilice VC para realizar ventanas con formas especiales
Utilice VC para realizar ventanas con formas especiales Dalian Railway University (116028) Li Wenhui Como Microsoft ha logrado grandes logros en el sistema operativo. Windows, la interfaz de usuario de Windows también se está convirtiendo cada vez más en un estándar de la industria. La interfaz unificada brinda gran comodidad a la mayoría de los usuarios a la hora de aprender y utilizar el software de aplicación. Pero enfrentar la misma cara todos los días inevitablemente conducirá al aburrimiento con el tiempo. Desarrollar algunas "desviaciones" y cambiar la interfaz "estándar" de las aplicaciones de Windows definitivamente le dará una sensación refrescante. Las ventanas de las aplicaciones estándar de Windows generalmente tienen una apariencia rectangular de color gris claro con una barra de título, por lo que los cuadros de diálogo/ventanas con "formas especiales" alteran principalmente el color y la apariencia. Cambiar el color de fondo
Cambiar el color de fondo del cuadro de diálogo (ventana) es el método más sencillo para cambiar la apariencia de una aplicación de Windows. Según el mecanismo de creación y administración de Windows, generalmente existen dos métodos. Una es manejar el mensaje WM_CTLCOLOR, primero crear un pincel del color de fondo seleccionado y luego llamar a SetBkColor() o SetDialogBkColor() para dibujar el fondo de la ventana o cuadro de diálogo con el pincel creado. Cuando es necesario volver a pintar una ventana o un cuadro de diálogo (o un subcontrol de un cuadro de diálogo), Windows envía un mensaje WM_CTLCOLOR al cuadro de diálogo y la aplicación procesa el mensaje WM_CTLCOLOR y devuelve un controlador de pincel utilizado para pintar el fondo del cuadro de diálogo. La otra es responder al mensaje WM_ERASEBKGND de Windows. Windows envía un mensaje WM_ERASEBKGND a la ventana para notificar a la ventana que borre el fondo. Puede usar ClassWizard de VC para sobrecargar el controlador predeterminado del mensaje para borrar el fondo (en realidad, pintar con). un pincel) y devuelve VERDADERO para evitar que Windows borre la ventana. 2. Cambiar la forma de la ventana Al utilizar la nueva función del SDK SetWindowRgn(), puede limitar los mensajes de pintura y mouse a un área específica de la ventana, haciendo así que la ventana tenga una forma irregular específica (forma de región). La "región" es un mecanismo poderoso en Windows GDI. Una región es un espacio en el dispositivo, que puede tener cualquier forma. Las regiones complejas pueden estar compuestas por regiones pequeñas. Las funciones de creación de áreas incluidas en Windows incluyen CreateRectRgn(), CreatePolyRgn(), CreatePolygonRgn(), CreateRoundRectRgn() y CreateEllipticRgn(). Al combinar las áreas a través de CombineRgn(), puede obtener un área de forma compleja y un área de forma compleja. forma de ventana. Aunque puede obtener una ventana con una "forma especial" mediante el método anterior, el color se siente monótono y la apariencia no es lo suficientemente "cool" ¿Puede obtener un cuadro de diálogo/ventana con una "forma especial" más genial? La respuesta es sí. A continuación se presenta el método de utilizar mapas de bits y máscaras para crear cuadros de diálogo/ventanas con "formas especiales". 3. Uso de mapas de bits para crear ventanas de diálogo con formas especiales El principio de usar mapas de bits para crear cuadros de diálogo con formas especiales es realizar un procesamiento de "captación de imágenes" basado en el color de los píxeles y realizar una combinación de áreas en todas las áreas de píxeles de colores no especificados. Con esta tecnología, en realidad se trata de implementar el fondo de mapa de bits del cuadro de diálogo/ventana y hacer transparente el área de color especificada. A continuación se toma como ejemplo un cuadro de diálogo con un mapa de bits transparente como fondo: Primero, use un software de dibujo como PhotoShop para dibujar y editar una imagen que se utilizará como fondo del cuadro de diálogo y guárdela en formato BMP, asumiendo que se guarda como Back.Bmp. Cabe señalar que aunque el editor de recursos del entorno de desarrollo integrado de Visual C solo puede editar mapas de bits con no más de 16 colores, podemos almacenarlos en color verdadero sin prestar atención a las advertencias de Visual C. El siguiente paso es crear una aplicación basada en diálogos utilizando el AppWizard de Visual C, suponiendo que se llame Trans.
Utilice el editor de recursos para importar la imagen de fondo Back.Bmp. Si es de color intenso, ignore el mensaje de advertencia que aparece y haga clic en Aceptar para confirmar. Para mayor claridad, modifique la identificación de ID de recurso predeterminada IDB_BITMAP1 a IDB_BACKBMP. Luego modifique el Estilo del cuadro de diálogo a Emergente y el Borde a Ninguno, como se muestra en la Figura 1
. La Figura 1 agrega el módulo de función de procesamiento de región void CTransDlg a la clase CTransDlg::SetupRegion(CDC *pDC /*Ventana de diálogo DC*/, UINT BackBitmapID /*ID de recurso de mapa de bits de fondo*/, UINT MaskBitmapID /*ID de recurso de mapa de bits de procesamiento de región * /, COLORREF TransColor = 0x00000000 /*Valor de color transparente, el valor predeterminado es negro*/). Hasta ahora, hemos considerado tentativamente que MaskBitmapID es equivalente a BackBitmapID. Su trabajo principal es realizar una combinación de áreas de acuerdo con el color de píxel del mapa de bits indicado por MaskBitmapID. El código completo es el siguiente: void CTransDlg::SetupRegion(CDC *pDC /*Ventana de diálogo DC*/, UINT BackBitmapID /*ID de recurso de mapa de bits de fondo*/, UINT MaskBitmapID /*ID de recurso de mapa de bits de procesamiento de región*/, COLORREF TransColor / *Valor de color transparente*/){CDC memDC; CBitmap cBitmap* pOldMemBmp = NULL; COLORREF cl; CRect UINT x, y; /Recurso de mapa de bits de fondo IDm_BackBitmapID = BackBitmapID//Cargar mapa de bits cBitmap.LoadBitmap(MaskBitmapID); memDC.CreateCompatibleDC(pDC); pOldMemBmp = memDC.SelectObject(amp; cBitmap); //Primero cree el área completa predeterminada para la ventana completa Area wndRgn); .CreateRectRgn(0, 0, cRect.Width(), cRect.Height()); // Los dos bucles siguientes verifican el color del píxel del mapa de bits de fondo y realizan el procesamiento del área transparente // Cuando el color del píxel es Cuando el valor de transparencia es; especificado, el punto se recorta del área. // Las diversas variables miembro utilizadas entre ellas son m_MaskLeftOff, m_MaskTopOff, //m_MaskRightOff, m_MaskBottomOff, m_FrameWidth// y m_CaptionHeight. Sus funciones se explicarán más adelante. En este momento, todas se pueden tratar como 0. for(x= m_FrameWidth m_MaskLeftOff; xlt; =cRect.Width() - m_FrameWidth-m_MaskRightOff;