Добавил простую панель поиска : Яндекс и Google по ним пока вопросов нет.
Пробую добавить иконку возле надписи в ComboBoxGadget() , есть рабочие примеры в
CodeArchiv с использованием API функций. Примеры писались давно, когда не было поддержки
прозрачных каналов PNG, наверно можно решить проще.
Для меня самый простой вариант (может не самый правильный), программно, через константу убрать обводку
гаджета и нарисовать её на фоне.
По StringGadget примеров с изображениями не нашел.
С StringGadget, чтоб поместить изображение внутрь обводки, нарисовал на фоне обводку, но при таком варианте, эти
элементы - жестко привязаны к своему месторасположению. Надо перерисовывать фон, или использовать
гаджет-линия предложенные Петром. Но пока для простоты кода - рисую на фоне.
;------------------------------------------------------ ; Браузер ; ; 2010 год ; ; PureBasic 4.40 ; ;------------------------------------------------------- UsePNGImageDecoder() ; инициализация PNG декодера Enumeration #Window_0 #Strin_1 #Strin_2 #poisk #web #But #But_1 #But_2 #But_3 #Imag #Imag_1 #GO_Search #pos #But_4 #But_5 #fav #Image EndEnumeration ;{--Эта процедура определяет находится ли курсор мышки над заданым окном или гаджетом------- Procedure IsMouseOver(wnd) GetWindowRect_(wnd,re.RECT) GetCursorPos_(pt.POINT) Result.l = PtInRect_(@re, pt\x | (pt\y<<32) ) ProcedureReturn Result EndProcedure ;}------------------------------------------------------------------------------------------ ;{----------- курсор рука над изоброжением-------------------------------------------------- Procedure Search(Event) Static Button, Buton_DOWN If Event=#WM_MOUSEMOVE ; Переместилась мышка If IsMouseOver(GadgetID(#Imag)) myCursor=LoadCursor_(0,#IDC_HAND) ; курсор рука SetCursor_(myCursor) ; курсор рука EndIf EndIf EndProcedure ;}------------------------------------------------------------------------------------------ ;{-------загрузаем в #Strin_1 полученый адрес новой ссылки при переходе--------------------- Procedure NavigationCallback(Gadget, Url$) SetGadgetText(#Strin_1, Url$) ProcedureReturn #True EndProcedure ;}------------------------------------------------------------------------------------------ ;{----------------Процедура поиск----------------------------------------------------------- Procedure Poisk() pos = GetGadgetState(77)+80 ; вычисляем идентификатор #web text.s = GetGadgetText(#poisk) ; какой выбран поиск (yandex или google) zapros.s = GetGadgetText(#Strin_2) If text = "Яндекс" SetGadgetState(#Imag,ImageID(4)) ; изменяем текущее состояние изображенния SetGadgetText(pos, "http://yandex.ua/yandsearch?text=" + zapros) ElseIf text = "Google" SetGadgetState(#Imag,ImageID(5)) ; изменяем текущее состояние изображенния SetGadgetText(pos, "http://www.google.com/search?hl=ru&q=" + zapros) EndIf EndProcedure ;}----------------------------------------------------------------------------------------- ;{--------Дуйствие, если курсор над поиском по кнопке "Enter"------------------------------ Procedure Strin_2(hwnd, msg, wParam, lParam) *PointOldEditFunc=GetWindowLong_(hWnd,#GWL_USERDATA) If msg=258 If wParam=13 msg=0 Poisk() EndIf EndIf ProcedureReturn CallWindowProc_(*PointOldEditFunc,hwnd, msg, wParam, lParam) EndProcedure ;}----------------------------------------------------------------------------------------- ;{------Процедура скачивания favicon------------------------------------------------------- Procedure IEGetFile(file.s,page.s) If URLDownloadToFile_(#Null,@page,@file,#Null,#Null) = #S_OK ProcedureReturn #True Else ProcedureReturn #False EndIf EndProcedure Procedure.s URLHostPart(u.s) ; определение хоста If FindString(u,"://",1) ProcedureReturn StringField(u,3,"/") Else ProcedureReturn StringField(u,1,"/") EndIf EndProcedure ;}----------------------------------------------------------------------------------------- Procedure UpdateSpectrum(*xx) ; Функция для создания индикатора Repeat pos = GetGadgetState(77)+80 ; вычисляем идентификатор #web SetGadgetAttribute(pos, #PB_Web_NavigationCallback, @NavigationCallback()) ; узнаём URL url.s = GetGadgetText(#Strin_1) ; получаем адрес rezu.s =URLHostPart(url.s) ; выделяем хост из адреса IEGetFile("img/"+rezu.s+".ico", "http://"+rezu.s+"/favicon.ico") a= SetGadgetState(#fav,LoadImage(#Image, "img/"+rezu.s+".ico")) If a= 0 SetGadgetState(#fav,LoadImage(#Image, "img/purebasic.mybb.ru.ico")) EndIf Delay(350) ForEver EndProcedure ;}--------------------------------------------------------------------------- CatchImage(0, ?Im0, ?Im0End -?Im0 ) CatchImage(1, ?Im1, ?Im1End -?Im1 ) CatchImage(2, ?Im2, ?Im2End -?Im2 ) CatchImage(3, ?Im3, ?Im3End -?Im3 ) CatchImage(4, ?Im4, ?Im4End -?Im4 ) CatchImage(5, ?Im5, ?Im5End -?Im5 ) CatchImage(6, ?Im6, ?Im6End -?Im6 ) CatchImage(7, ?Im7, ?Im7End -?Im7 ) ; создать ссылку CatchImage(8, ?Im8, ?Im8End -?Im8 ) CatchImage(9, ?Im9, ?Im9End -?Im9 ) CatchImage(10, ?Im10, ?Im10End -?Im10) CatchImage(11, ?Im11, ?Im11End -?Im11) CatchImage(12, ?Im12, ?Im12End -?Im12) CatchImage(13, ?Im13, ?Im13End -?Im13) ; удалит ссылку OpenWindow (#Window_0, 0, 0, 1000, 800, "Браузер на PureBasic", #PB_Window_MinimizeGadget |#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered |#PB_Window_SizeGadget) SetWinBackgroundImage(WindowID(0), ImageID(3) ) SmartWindowRefresh(#Window_0 ,1) ; для уменьшения мигания окна при изменении размера StringGadget(#Strin_1, 150, 6, 550, 16, "http://purebasic.info/",#PB_String_BorderLess) ButtonImageGadget(#But_1,10,2,22,22,ImageID(1)) ; браузер <<< ButtonImageGadget(#But, 35,2,32,22,ImageID(0)) ; обновить браузер ButtonImageGadget(#But_3,70,2,22,22,ImageID(6)) ; закрыть вкладку ButtonImageGadget(#But_2,95,2,22,22,ImageID(2)) ; браузер >>> ;GadgetToolTip( #But_1, "Вернуться") ;GadgetToolTip( #But_3, "закрыть вкладку") ;GadgetToolTip( #But_2, "Вперёд") StringGadget(#Strin_2, 722, 6, 175, 16, "Поиск",#PB_String_BorderLess) ImageGadget(#Imag, 900, 5, 16, 16,ImageID(4)) ; лого поиска ComboBoxGadget(#poisk, 925, 3, 65, 20) AddGadgetItem (#poisk, -1, "Яндекс") AddGadgetItem (#poisk, -1, "Google") SetGadgetState(#poisk, 0) ; начальное положение ImageGadget(#fav, 128, 5, 16, 16,LoadImage(#Image, "img/purebasic.info.ico")) ;----------------нажатие 'Enter' в поиске------------------------------ *Old_PointOldEditFunc=GetWindowLong_(GadgetID(#Strin_2), #GWL_WNDPROC) SetWindowLong_(GadgetID(#Strin_2),#GWL_USERDATA, *Old_PointOldEditFunc) SetWindowLong_(GadgetID(#Strin_2), #GWL_WNDPROC, @Strin_2()) ;---------------------------------------------------------------------- PanelGadget(77, 0, 25, 1000, 750) ; панель AddGadgetItem(77, -1, "Главная") WebGadget(80, 0,0,1000,750, "") SetGadgetAttribute(80, #PB_Web_NavigationCallback, @NavigationCallback()) ; для получения нового URL SetGadgetText(80, GetGadgetText(#Strin_1)) ; загружаем при старте браузер a=101 ;------------------Меню-------------------- If CreateImageMenu(1, WindowID(#Window_0)) MenuTitle("Файл") MenuItem(1,"Открыть", ImageID(8)) MenuItem(2,"Сохранить", ImageID(9)) MenuBar() MenuItem(3,"Выход", ImageID(10)) MenuTitle("Избранное") MenuItem(0,"Создать ссылку",ImageID(7)) MenuItem(00,"" ) MenuItem(333,"Удалить ссылку",ImageID(13)) MenuItem(00,"" ) MenuBar() MenuItem(100,"" ) If OpenPreferences("url.pcs") PreferenceGroup("адрес") If ExaminePreferenceKeys() While NextPreferenceKey()>0 ; пока в группе "адрес" есть записи keyValue$ = PreferenceKeyValue() keyValue$ = ReplaceString(keyValue$, "~", "=") ; заменяем "~" на "=" MenuItem(a, keyValue$ ) ; создаём меню с 101 позиции и записываем адреса по порядку a=a+1 Wend EndIf ClosePreferences() EndIf MenuTitle("Информация") MenuItem(4, "Помощь", ImageID(11)) MenuItem(5, "О программе", ImageID(12)) EndIf ;------------------------------------------ CreateThread(@UpdateSpectrum(),0) Repeat Event = WaitWindowEvent() Window = EventWindow() Gadget = EventGadget() If Event=#PB_Event_SizeWindow ; Изменяем размер браузера при изменении размеров окна ResizeGadget(77,#PB_Ignore,#PB_Ignore, WindowWidth(#Window_0)-0, WindowHeight(#Window_0)-0) ;Debug CountGadgetItems(77)+79 For a=0 To CountGadgetItems(77)-1 ; вычисляем идентификатор #web ResizeGadget(80+a,#PB_Ignore,#PB_Ignore, WindowWidth(#Window_0)-10, WindowHeight(#Window_0)-60) Next EndIf Select Event Case #PB_Event_Gadget Select EventGadget() ;----------------------------------Поиск--------------------------------------- Case #Imag ; при нажатии на изображение Poisk() ;------------------------------------------------------------------------------- Case #poisk ; выбор поиска If EventType()=1 text.s = GetGadgetText(#poisk) zapros.s = GetGadgetText(#Strin_2) If text = "Яндекс" SetGadgetState(#Imag,ImageID(4)) ; изменяем текущее состояние изображенния ElseIf text = "Google" SetGadgetState(#Imag,ImageID(5)) ; изменяем текущее состояние изображенния EndIf EndIf ;------------------------------------------------------------------------------- Case #But_1 pos =GetGadgetState(77)+80 ; вычисляем идентификатор #web SetGadgetState(pos, #PB_Web_Back) ; вернуться на шаг назад в браузере Case #But pos =GetGadgetState(77)+80 ; вычисляем идентификатор #web SetGadgetText(pos, GetGadgetText(#Strin_1)) ; обновить браузер Case #But_2 pos =GetGadgetState(77)+80 ; вычисляем идентификатор #web SetGadgetState(pos, #PB_Web_Forward); вернуться на шаг вперёд в браузере Case #But_3 pos =GetGadgetState(77) If pos>0 RemoveGadgetItem(77, pos) ; удаляем панель EndIf EndSelect EndSelect Menu=EventMenu() ; Узнаём идентификатор пункта меню If Event= #PB_Event_Menu ; Обрабатываем события от меню. Select Menu Case 0 ; создание новой ссылки url.s = GetGadgetText(#Strin_1) ; получаем адрес rezu.s =URLHostPart(url.s) ; выделяем хост из адреса IEGetFile("img/"+rezu.s+".ico", "http://"+rezu.s+"/favicon.ico") ; функция сохранения и скачивания favicon.ico url.s = ReplaceString(url.s, "=", "~") ; заменяем перед записью "=" на "~" If url.s > "" ; если строка не пустая OpenPreferences("url.pcs") ; открыть файл с настройками PreferenceGroup("адрес") ; раздел адрес WritePreferenceString(url.s, url.s) ; запись нового адреса ClosePreferences() a =a+1 ; увеличиваем номер пустой закладки EndIf InsertMenu_(MenuID(1), 100, #MF_BYCOMMAND , a, url.s) ; api функция добавляет новый пункт меню, перед 101 пунктом DrawMenuBar_(WindowID(#Window_0)) ; перирисовка ;-----------16 заготовок под закладки------------ Case 101 To 116 AddGadgetItem(77, -1, "Закладка") ; создаём новую панель pos = CountGadgetItems(77)+79 ; вычисляем идентификатор #web Text.s = GetMenuItemText(1, EventMenu()) WebGadget(pos, 0,0,1000,750,Text) ; загружаем адрес закладки в браузер SetGadgetText( #Strin_1, Text) ; загружаем адрес закладки в #Strin_1 SetGadgetAttribute(pos, #PB_Web_NavigationCallback, @NavigationCallback()) ; узнаём URL ResizeGadget(pos,#PB_Ignore,#PB_Ignore, WindowWidth(#Window_0)-7, WindowHeight(#Window_0)-40) url.s = GetGadgetText(#Strin_1) ; получаем адрес rezu.s =URLHostPart(url.s) ; выделяем хост из адреса SetGadgetState(#fav,LoadImage(#Image, "img/"+rezu.s+".ico")) ;----------------------------------------------- Case 3 ; выход из программы End Case 333 del.s = GetGadgetText(#Strin_1) del.s = ReplaceString(del.s, "=", "~") ; заменяем перед удалением "=" на "~" If OpenPreferences("url.pcs") PreferenceGroup("адрес") RemovePreferenceKey(del.s) ; удаляем пункт, который загружен в #Strin_1 ClosePreferences() EndIf MessageRequester("Ссылка удалена !", " Внимание ! "+Chr(10)+"Возможно востановить ссылку, пока она"+Chr(10)+" загруженна в браузер", #MB_OK|#MB_ICONQUESTION) EndSelect EndIf Search(Event) ; курсор рука над лого: поиск If Event = #PB_Event_CloseWindow Break EndIf ForEver DataSection Im0: IncludeBinary "refresh.png" Im0End: Im1: IncludeBinary "left.png" Im1End: Im2: IncludeBinary "right.png" Im2End: Im3: IncludeBinary "fon3.png" Im3End: Im4: IncludeBinary "yandex.png" Im4End: Im5: IncludeBinary "google_1.png" Im5End: Im6: IncludeBinary "close.png" Im6End: Im7: IncludeBinary "create.png" Im7End: Im8: IncludeBinary "open_PB.png" Im8End: Im9: IncludeBinary "save_PB.png" Im9End: Im10: IncludeBinary "close.png" Im10End: Im11: IncludeBinary "information.png" Im11End: Im12: IncludeBinary "house.png" Im12End: Im13: IncludeBinary "delete.png" Im13End: EndDataSection
Скачать архив браузер
Отредактировано mirashic (08.02.2010 21:31:06)