Добавил простую панель поиска : Яндекс и 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)