Red de conocimiento informático - Conocimiento informático - Código fuente de la red de recursos Xiaohei

Código fuente de la red de recursos Xiaohei

Utilice Visual C++ para crear su propio navegador IE

El navegador IE es una herramienta de navegación incluida con el sistema Microsoft Windows y se utiliza para explorar varias páginas web. Actualmente ocupa la mitad del mercado de navegadores y se ha convertido en una herramienta indispensable para los usuarios de Windows. En primer lugar, su interfaz está bellamente diseñada, como botones planos (la imagen del botón es gris, cuando se coloca el mouse sobre el botón, el botón sobresale, lo que se llama manija, y la imagen de arriba se vuelve brillante y llamativa). ), el texto en el botón Descripción, la pequeña flecha desplegable negra en forma de triángulo al lado del botón (se muestra un menú desplegable al hacer clic), el campo de entrada de dirección en la barra de herramientas, etc. , todos ellos reflejan el estilo de Windows2000. En segundo lugar, su barra de favoritos puede recopilar las URL favoritas de los usuarios, sentando una base sólida para la popularidad de IE. En este punto, los lectores pueden sentir que debe ser difícil implementar IE. De hecho, IE también es un "tigre de papel", y la dificultad de implementación radica principalmente en el efecto de la interfaz y la visualización de favoritos. En este ejemplo, el autor describe la implementación de la interfaz IE, la visualización de páginas web favoritas, la navegación web y otras funciones. Después de leer este artículo detenidamente, creo que los lectores podrán crear su propio navegador. El efecto de interfaz del código del programa compilado en este ejemplo se muestra en la Figura 1:

Figura 1. Interfaz de operación del navegador

1. Método de implementación

1. Implementación de la interfaz del navegador

Primero inicie Visual C++6.0 para generar un único archivo llamado proyecto de documento. Tenga cuidado de no seleccionar las opciones de la barra de herramientas y la barra de estado durante este proceso, de modo que nos resulte más conveniente usar el código para implementar la barra de herramientas y la barra de estado del estilo Windwos2000 en trabajos posteriores. Agregue una barra de direcciones a la barra de herramientas; la clase base de la clase de vista del proyecto está configurada en ChtmlView. La función miembro Navigate2 () de esta clase se usa específicamente para implementar documentos en formato de hipertexto. Defina CStatusBar m_wndStatusBar (objeto de barra de estado), CToolBar m_wndToolBar (objeto de barra de herramientas), CReBar m_wndReBar(, CComboBoxEx m_wndAddress (objeto de cuadro combinado extendido, utilizado como barra de direcciones), CAnimateCtrl m_wndAnimate (control de animación, utilizado para mostrar animaciones en la barra de herramientas), imagen enumere el objeto CImageList img (icono de almacenamiento que se muestra en la barra de herramientas) y otros objetos Agregue recursos de mapa de bits (mapa de bits) al archivo de recursos AVI del proyecto actual, el indicador de ID es IDR_MFCAVI y los indicadores de ID son IDB_COLDTOOLBAR y IDB_HOTTOOLBAR respectivamente, de la siguiente manera. Figura:

Figura 2. Mapa de bits que contiene iconos de botones

1) Barra de herramientas de estilo IE

La interfaz de estilo IE se implementa principalmente en el cminframe de la clase de marco principal . :: Implementado en la función oncreate(). La idea principal es: el objeto CReBar sirve como contenedor para la barra de herramientas, la barra de direcciones y el control de animación. Luego, el objeto CImageList carga la imagen térmica del botón en la barra de herramientas y la imagen que se muestra en el estado normal, y adjunta el objeto. el objeto de la barra de herramientas para que esté asociado. Para mostrar una barra de herramientas plana, debe usar la función CreateEx() para crear un objeto CToolBar m_wndToolBar y usar la función ModifyStyle() para establecer el estilo de la barra de herramientas en un tipo plano. Tenga en cuenta que este nuevo estilo no se puede configurar mediante CToolBar::Create() o CToolBar::SetBarStyle(). La clase CToolBar no admite TBSTYLE_FLAT. Para resolver este problema, tenemos que omitir la clase CToolBar y usar CWnd::ModifyStyle(). Para configurar un botón de la barra de herramientas con un botón desplegable, puede llamar a SetButtonInfo() para establecer el estilo del botón en TBSTYLE_DROPDOWN. En cuanto a los botones con indicaciones en chino, puede usar fácilmente SetButtonText() en la barra de herramientas.

El siguiente es el código y los comentarios para implementar la interfaz de estilo IE:

int CMainFrame::OnCreate(LPCREATESTRUCT LPCREATESTRUCT)

{

CImageList img//Image listar objeto;

CString string; //Objeto de cadena;

if(CFrameWnd::OnCreate(lpCreateStruct)= =-1)

return-1;

If (!M_wndReBar.Create(this)) //Crea un objeto CReBar;

{ TRACE0("Error al crear la barra de refuerzo\n");

return-1; }

If (!M_wndToolBar.CreateEx(this)) //Utilice la función CreateEx() para crear un objeto de barra de herramientas;

{ TRACE0("Error crear barra de herramientas \n ");

return-1;}

//Establecer el tamaño máximo y mínimo de los botones en la barra de herramientas;

m_wndToolBar. ObtenerToolBarCtrl(). SetButtonWidth(50, 150);

//Establece el botón en la barra de herramientas para admitir el estilo de flecha desplegable;

m_wndToolBar. ObtenerToolBarCtrl(). SetExtendedStyle(TB style _ EX _ draw ddarrows);

//Carga recursos de imágenes activas en la lista de imágenes, donde IDB_HOTTOOLBAR es el recurso de imágenes activas Idimg.create (IDB _ hottoolbar, 22, 0, RGB ( 255, 0, 255));

m_wndToolBar. ObtenerToolBarCtrl(). SetHotImageList(& amp;img);

img. detach();

//La lista de imágenes carga recursos de imágenes ordinarios y IDB_COLDTOOLBAR es el ID del recurso de imagen.

img. Crear(IDB_COLDTOOLBAR, 22, 0, RGB (255, 0, 255));

m_wndToolBar. ObtenerToolBarCtrl(). establecer lista de imágenes(& amp;img);

img. detach();

//Establece la barra de herramientas en estilo plano.

m_wndToolBar. ModifyStyle(0, estilo TB _ FLAT | estilo TB _ TRANSPARENT);

//Establece el número de botones en la barra de herramientas en

m_wndToolBar. SetButtons(NULL, 9);

//Carga recursos de cadena, establece el texto en el botón y el número de identificación del botón;

m_wndToolBar. SetButtonInfo(0, ID_GO_BACK, TBSTYLE_BUTTON, 0

Str. LoadString(IDS_BACK);

m_wndToolBar. SetButtonText(0, str);

m_wndToolBar. SetButtonInfo(1, ID_GO_FORWARD, TBSTYLE_BUTTON, 1);

Str. LoadString(IDS_FORWARD);

m_wndToolBar. SetButtonText(1, str);

m_wndToolBar.

SetButtonInfo(2, ID_VIEW_STOP, TBSTYLE_BUTTON, 2

Str. LoadString(IDS_STOP);

m_wndToolBar. SetButtonText(2, str);

m_wndToolBar. SetButtonInfo(3, ID_VIEW_REFRESH, TBSTYLE_BUTTON, 3);

Str. LoadString(IDS_REFRESH);

m_wndToolBar. SetButtonText(3, str);

m_wndToolBar. SetButtonInfo(4, ID_GO_START_PAGE, TBSTYLE_BUTTON, 4);

Str. LoadString(IDS_HOME);

m_wndToolBar. SetButtonText(4, str);

m_wndToolBar. SetButtonInfo(5, ID_GO_SEARCH_THE_WEB, TBSTYLE_BUTTON, 5);

Str. LoadString(IDS_SEARCH);

m_wndToolBar. SetButtonText(5, str);

m_wndToolBar. SetButtonInfo(6, ID_FAVORITES_DROPDOWN, TB style_BUTTON | TB style_drop down, 6

Str. LoadString(IDS_FAVORITES);

m_wndToolBar. SetButtonText(6, str);

m_wndToolBar. SetButtonInfo(7, ID_FILE_PRINT, TBSTYLE_BUTTON, 7

Str. LoadString(IDS_PRINT);

m_wndToolBar. SetButtonText(7, str);

m_wndToolBar. SetButtonInfo(8, ID_FONT_DROPDOWN, TB style_BUTTON | TB style_drop down, 8

Str. LoadString(IDS_FONT);

m_wndToolBar. SetButtonText(8, str);

//Establece el tamaño del botón en la barra de herramientas y el tamaño del icono que se muestra en el botón;

CRect rectToolBar

m_wndToolBar. GetItemRect(0 & barra de herramientas rect);

m_wndToolBar. SetSizes(rectangular toolbar.Size(), CSize(30, 20));

//Crea un cuadro combinado para usarlo como barra de direcciones;

If (!m_wndAddress.Create ( CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), esto, AFX_IDW_TOOLBAR + 1))

{ TRACE0("Error al crear el cuadro combinado\n");

return -1;}

//Crea un objeto de control de animación y abre el recurso AVI IDR _ MFC AVI;

m_wndAnimate.

Crear(WS_CHILD | WS_VISIBLE, CRect(0, 0, 10, 10), esto, AFX_IDW_TOOLBAR+2);

m_wndAnimate. open(IDR _ MF cavi);

//Agregar barra de herramientas, barra de direcciones, control de animación, etc. Añadir al objeto CReBar;

m_wndReBar. AddBar(&m_wndToolBar);

m_wndReBar. AddBar(& m_wndAnimate, NULL, NULL, RBBS_fixed tamaño | RBBS_fixed BMP

str. LoadString(IDS_ADDRESS);

m_wndReBar. AddBar(& m_wndAddress, str, NULL, RBBS_fixed BMP | RBBS_BREAK);

//Restablece el estilo de la barra de herramientas para que tenga la función de sugerencia de la barra de herramientas;

m_wndToolBar. SetBarStyle(m_wndToolBar.getbar style()|CBRS_ToolTip|CBRS_flyover|CBRS_size_fixed);

//Establece la barra de estado;

if (!m_wndStatusBar. Create(this) ||! SetIndicators (indicadores, tamaño de (indicadores)/tamaño de (UINT))

{ TRACE0("Error al crear la barra de estado\n");

return-1;}

......//Parte del menú "Favoritos" introducido en la Parte 2;

Devuelve 0;

>}

2) Menú desplegable en la barra de herramientas

Cuando el usuario hace clic en la flecha desplegable del botón, aparecerá el menú correspondiente. Para implementar esta función, primero debe agregar una asignación de mensajes en la asignación de mensajes del archivo CMainFrame.cpp: on_notify (TBN_drop-down, AFX_IDW_toolbar, ondrop down agregue una función de asignación de mensajes en la declaración del archivo CmainFrame.h); : AFX _ msg void on drop down(nmhdr * pnotifystruct, lresult * Presult); Finalmente, agregue el siguiente código:

void CMainFrame::OnDropDown(NMHDR * pNotifyStruct, LRESULT * pResult)

{

nm toolbar * pNMToolBar =(nm toolbar *)pNotifyStruct;

CRect rect

//Obtener la posición de la flecha desplegable ;

m_wndToolBar. ObtenerToolBarCtrl(). GetRect(barra de herramientas pnm->proyecto&rect);

rect . top = rect . bottom;

* cliente a pantalla(barra de herramientas pnm->HDR . hwnd from & rectum.

top left());

if(pNMToolBar-& gt;iItem == ID_FONT_DROPDOWN)

//Determina si es una flecha desplegable para seleccionar la fuente;

{

Menú CMenú;

Menú CMenú * pMenú emergente

. cargar menú(IDR_FONT_POPUP);

pPopup = menú. get submenu(0);

ppop up-& gt; TrackPopupMenu(TPM_left align | TPM_left button, rect.left, rect.top + 1, AfxGetMainWnd());

}

else if(pNMToolBar-& gt; iItem == ID_FAVORITES_DROPDOWN)

{//Determina si se muestra la flecha desplegable de la página web favorita;

CMenu * pPopup

ppop up = obtener menú()->obtener submenú(3);

ppopup->trackppopupmenu(TPM_left align | TPM_ botón izquierdo, rect .left,

rect.top + 1, AfxGetMainWnd()

}

* pResult = TBDDRET _ DEFAULT

}

3) Implementación de animación en la barra de herramientas

Para embellecer la interfaz del programa, se coloca un control de animación en la barra de herramientas compuesta del programa para usarlo cuando sea apropiado. clips de animación para lograr efectos de animación. El siguiente código implementa la creación del objeto de control de animación y abre el recurso AVI IDR_MFCAVI:

m_wndAnimate. Crear(WS_CHILD | WS_VISIBLE, CRect(0, 0, 10, 10), esto, AFX_IDW_TOOLBAR+2);

m_wndAnimate. open(IDR _ MF cavi);

La clase CanimateCtrl proporciona funciones como Play(), Seek(), Stop() y Close() para reproducir archivos de vídeo. Son muy sencillos de usar y no entraré en detalles aquí.

4) Funcionamiento de la barra de direcciones

Cuando el usuario introduce la dirección de una página web en la barra de direcciones y pulsa la tecla Enter, el navegador mostrará el contenido de la web página y guarde la dirección. La dirección se registra en la barra de direcciones. Debido a que el ID del mensaje correspondiente después de presionar la tecla Intro es IDOK, debe agregar una asignación de mensaje on_command (idok, onnewaddrender) y una función de respuesta de mensaje AFX_msgvoid onnewaddrender() a la clase CmainFrame. El código de implementación de la función es el siguiente:

void CMainFrame::OnNewAddressEnter()

{

CString string;

//Get la barra de direcciones Cadena en;

m_wndAddress.

GetEditCtrl()->GetWindowText(str);

((CMfcieView *)GetActiveView())->Navigate2(str, 0, NULL); //Mostrar página web;

//Agrega la URL al cuadro combinado correspondiente a la barra de direcciones;

elemento COMBOBOXEXITEM;

item.mask = CBEIF _ TEXT

elemento. iitem =-1;

item psztext =(LPTSTR)(LPCTSTR)str;

m_wndAddress. insert item(& item);

}

Del mismo modo, la barra de direcciones (ID: AFX_IDW_Toolbar+1) en la clase CmainFrame también necesita agregar asignación de mensajes on_CBN_selen dok(AFX_IDW_Toolbar+1 ) y la función de respuesta de mensaje OnNewAddress para manejar la operación del usuario de seleccionar una URL en el cuadro combinado de la barra de direcciones.

void CMainFrame::OnNewAddress()

{

Cadena CString;

m_wndAddress. GetLBText(m_wndAddress.GetCurSel(), str);

((CMFCIEView *)GetActiveView())-> Navigate2(str, 0, NULL);

}

2. Implementar el menú de favoritos

En general, los usuarios de IE tienen la costumbre de guardar sus sitios web favoritos para iniciar sesión rápidamente en el futuro. Para permitir que nuestro navegador muestre los sitios web recopilados por IE, se configura un menú "Favoritos" en el programa. Opere la carpeta HKEY _Current_User\\Software\\Microsoft\\Windows\\Current Version\\Explorer\\User Shell en el registro de Windows a través de funciones como RegOpenKey() y RegQueryValueEx(), y muéstrela en el menú Sitio web favorito. Para ello, en el ejemplo se definen dos funciones y el código de implementación es el siguiente:

TCHAR GetDir() //Obtiene el directorio donde se almacenan los sitios web favoritos del usuario;

{

TCHAR SZ[MAX_PATH];

TCHAR SZ PATH[MAX_PATH];

HKEY hKey;

DWORD dwSize

CMenu * pMenu

//Obtener el menú "Favoritos" y eliminar elementos del submenú en blanco;

pMenu = obtener menú()-& gt;obtener submenú(3 );

while(pMenu->;DeleteMenu(0, MF_by position));

//Encuentra la ubicación de los favoritos en el registro.

if(RegOpenKey(usuario actual de HKEY, _T("Software\\Microsoft\\Windows\\Versión actual\\Explorer\ \

Carpeta de shell de usuario") y amphKey) ! = error_success)

{

TRACE0("No se puede encontrar el favorito\n ");

Devuelve 0;

}

dwSize = sizeof(SZ);

RegQueryValueEx(hKey, _T("Favoritos "), NULL, NULL, (LPBYTE)sz, & ampdwSize); ExpandEnvironmentStrings(sz, szPath, MAX_PATH);

RegCloseKey(hKey);

Regresar szPath

}

int CMainFrame::BuildFavoritesMenu (ruta LPCTSTR PSZ, int nStartPos, CMenu* pMenu)

{

CString strPath(ruta PSZ);

CString strPath2

CString cadena;

WIN32 _ FIND _ DATA wfd

Manejar h;

int nPos

int nEndPos

int nNewEndPos

int nLastDir

TCHAR buf[INTERNET _ MAX _ PATH _ LENGTH]

CStringArray astrFavorites

CStringArray astrDirs<; /p>

CMenu * pSubMenu

if(strPath[strPath.GetLength() - 1]!= _T('\\ '))

strPath+= _ T( ' \ \ ');

strPath2 = strPath

strPath += "*.*";

/ /Escanea el directorio actual, buscando * primero . Archivo URL, seguido de subdirectorios que pueden contener archivos *. Archivo URL;

h = FindFirstFile(strPath, & ampWFD);

if (h! = valor de identificador no válido)

{

nEndPos = nStartPos

Do

{

if((WFD . dwfile atributos & amp;

(directorio de atributos de archivo | archivo Ocultación de atributos|Sistema de atributos de archivos))==0)

{

str = wfd.cFileName

if (String. Right(4) == _T ("URL"))

{/*El formato del archivo URL es similar al archivo INI, por lo que podemos usar GetPrivateProfileString() para obtener la información que necesitamos. */

* GetPrivateProfileString(_ T(" acceso directo a Internet "), T("URL "),

_T(" "), buf, INTERNET_MAX_PATH_LENGTH,

strpath 2+str);

str = str. izquierda (cadena.

GetLength()-4);

//Determinar si se ha repetido;

for(nPos = nstart pos; nPos & lt. nEndPos++ NPO)

{

if (string.compare nocase(astrFavorites[nPos])<0)

break;

}

astrFavorites . InsertAt(nPos, str); //Agregar cadena;

m_astrFavoriteURLs. InsertAt(nPos, buf); //Reserva la dirección correspondiente.

++ pos final;

}

}

} while(FindNextFile(h, & ampWFD));

FindClose(h);

//Agrega el elemento encontrado al menú;

for(nPos = nstart pos; nPos & lt. nEndPos++ NPO)

{

pMenu->;AppendMenu(MF _ STRING | MF _ ENABLED, 0xe00 + nPos, astrFavorites[nPos]

}

< p); >//Subdirectorio de búsqueda

nLastDir = 0;

h = FindFirstFile(strPath, & ampWFD);

Assert (h! = valor de identificador no válido);

Hacer

{

if(WFD . dwfile atributos & amp; file_attributes_directory)

{// Buscar directorio;

if(lstrcmp(wfd.cFileName, _T(","))== 0 || lstrcmp(wfd.cFileName, _T(" .. ")) == 0)

Continuar ;

for(nPos = 0; nPos & lt. nLastDir++ NPO)

{

if(astrDirs[nPos].CompareNoCase (wfd.cFileName)> 0)

Pausa;

}

pSubMenu = nuevo CMenu

pSubMenu->CreatePopupMenu( );

//Llame a esta función de forma recursiva.

nNewEndPos = BuildFavoritesMenu(strpath 2+WFD . cfilename, nEndPos, pSubMenu

if (nNewEndPos!= nEndPos)

{

//Insertar submenú;

nEndPos = nNewEndPos

pMenu->; InsertMenu(nPos, MF _ por posición | MF _ POPUP | MF _ STRING, (UINT) pSubMenu - >m_hMenu, wfd.cfilename);

pSubMenu ->detach();

Astdir.

InsertAt(nPos, WFD . cfilename);

++ nLastDir

}

Eliminar pSubMenu

}

} while(FindNextFile(h, & ampWFD));

FindClose(h);

}

Devolver nEndPos

}

3. Mostrar hipertexto

La función Navigate2 de la clase Microsoft ChtmView puede mostrar archivos de hipertexto, y funciones como GoBack() y GoForward() pueden realizar el avance y retroceso de navegación web respectivamente. Tomando la respuesta al elemento del menú "Favoritos" como ejemplo, debe agregar la asignación de mensajes on_command_range (0xe00, 0xfff, OnFavorite) y la función de respuesta de mensajes onfavorite a la clase CmainFrame del programa para responder al procesamiento de clics en el menú con Identificadores 0xe00-0xfff. El código de implementación específico es el siguiente:

void CMainFrame::on favorito(UINT nID)

{

((CMFCIEView *)GetActiveView())- & gt; navegar 2(m_astrFavoriteURLs[nID-0xe 00], 0, NULL);

}

2. Pasos de programación

1. +6.0 Generar una aplicación con una estructura de vista de documento único y nombrar la aplicación "mfcie". Tenga cuidado de no seleccionar las opciones de la barra de herramientas y de la barra de estado durante el proceso de generación del proyecto. La clase base de la clase de vista del proyecto está configurada en ChtmlView

2. agregue los mensajes correspondientes a la función de respuesta del proyecto del programa;

3. Agregue recursos AVI y de mapa de bits al proyecto del programa

4.