Как поменять изображение у картинки, каким действием
Отредактировано daiomik (25.04.2010 21:08:53)
PureBasic - форум |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка
Как поменять изображение у картинки, каким действием
Отредактировано daiomik (25.04.2010 21:08:53)
Как поменять изображение у картинки, каким действием
SetGadgetState(gadget, ImageID(#Cre_Image2))
Почему с помощью данного примера не получается, точней, первый раз рисунок меняется, а затем сбивается и неразбериха получается (приведено только действие объекта). В списке у меня всего две записи. Нужно: если пользователь выбирает одно-загружается один рисунок, другую-друго
Case #Combo_1 If EventType()=1 LoadImage(0,"sceleton.jpg") SetGadgetState(#Image_16, ImageID(0)) ElseIf EventType()=0 LoadImage(0,"body.jpg") SetGadgetState(#Image_16, ImageID(0)) EndIf EndSelect
помести эти команды LoadImage() выше основного цикла
как это выше если мне их нужно открывать и загружать по мере надобности
Кроме того, идентификаторы сделай для каждого изображения свои. LoadImage(0,"sceleton.jpg") LoadImage(1,"body.jpg")
как это выше если мне их нужно открывать и загружать по мере надобности
Загружай их в начале программы. А потом только используй их идентификаторы
Все равно так же как в прошлый раз. В независимости от того какой пункт я выбрал загружается вторая картинка и при последующем выборе ничего не происходит. Наверно как то условия/действие выбора из списка написано не правильно.
366 пост читай внимательней. У каждого фото свой идентификатор, как у человека свои имя с фамилией. И в условиях так же надо учитывать это
LoadImage(0,"sceleton.jpg") LoadImage(1,"body.jpg") Case #Combo_1 If EventType()=0 SetGadgetState(#Image_16, ImageID(0)) ElseIf EventType()=1 SetGadgetState(#Image_16, ImageID(1)) EndIf EndSelect
Попробуй вот так
Case #Combo_1 If EventType()=1 Select GetGadgetState(#Combo_1) Case 0 LoadImage(0,"sceleton.jpg") SetGadgetState(#Image_16, ImageID(0)) Case 1 LoadImage(0,"body.jpg") SetGadgetState(#Image_16, ImageID(0)) EndSelect EndIf EndSelect
Пётр, так получается. Спасибо. haav, даже не представляю почему у нас не получилось. Делал я так же как ты показал. Ну теперь буду знать
А если когда у меня увеличится колличество записей списка, мне нужно будет достаточно только дописывать Case . Тогда для чего тут If EventType()=1
Case #Combo_1
If EventType()=1
Select GetGadgetState(#Combo_1)
Case 0
LoadImage(0,"sceleton.jpg")
SetGadgetState(#Image_16, ImageID(0))
Case 1
LoadImage(0,"body.jpg")
SetGadgetState(#Image_16, ImageID(0))
EndSelect
EndIf
EndSelect
честно говоря я бы не стал использовать такую технику в основном цикле. Кроме того, загрузку фото выгодно сделать вначале по причине существенного сокращения кода, но для этого надо переименовать большое кол-во фото, я бы так и сделал. Зато загрузить получится циклом. То есть если фото будет 1.bmp 2.bmp 3.bmp загружать их будет проще некуда, и уместится загрузка в 3 строчках для любого кол-ва файлов. А насколько я помню в проекте будет не одна сотня.
Тогда для чего тут If EventType()=1
Для того, чтобы выполнить этот код только в том случае, если был выбран пункт в списке и список закрылся.
Запусти этот код и пощёлкай по списку.
Думаю поймёшь всё сам.
If OpenWindow(0, 0, 0, 270, 140, "ComboBoxGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ComboBoxGadget(1, 10, 40, 250, 21) For a = 1 To 5 AddGadgetItem(1, -1,"ComboBox item " + Str(a)) Next SetGadgetState(1, 0) ; set (beginning with 0) the third item as active one Repeat Event=WaitWindowEvent() If Event=#PB_Event_Gadget And EventGadget()=1 Debug EventType() EndIf Until Event = #PB_Event_CloseWindow EndIf
Спасибо. Теперь понял
Зато загрузить получится циклом. То есть если фото будет 1.bmp 2.bmp 3.bmp загружать их будет проще некуда, и уместится загрузка в 3 строчках для любого кол-ва файлов.
А стоит ли?
Допустим, будет 50 фоток, каждая по 100 КБ, это уже 5 МБ, а памяти потребуется примерно в несколько раз больше, учитывая что JPG будет перекодироватся в точечный рисунок, формата BMP.
Итого получается, что потребуется 100 МБ оперативки, а может даже больше!
Так что если рисунков много, их нужно загружать по мере надобности и выгружать когда не нужны, что собтсвенно daiomik и делает.
А стоит ли?Допустим, будет 50 фоток, каждая по 100 КБ, это уже 5 МБ, а памяти потребуется примерно в несколько раз больше, учитывая что JPG будет перекодироватся в точечный рисунок, формата BMP.Итого получается, что потребуется 100 МБ оперативки, а может даже больше!Так что если рисунков много, их нужно загружать по мере надобности и выгружать когда не нужны, что собтсвенно daiomik и делает.
Если даже и так, хотя я загрузил BMP несколько? памяти заняло немногим больше, C JPG не пробовал, поверю тебе. Все равно считаю такое написание нерациональным. Можно загружать одно фото, если уж так. Cчитывая номер вкладки и загружая по номеру имя фото. А так прибавится 200 строчек кода. Я лентяй, чтобы такое писать Да будут некоторые трудности с определением фото для вкладок вначале, но существенное облегчение кода как цикла так и загрузки. Это мое мнение, в любом случае daiomik делает как ему понятнее.
Cчитывая номер вкладки и загружая по номеру имя фото. А так прибавится 200 строчек кода
Не обязательно.
Если назвать рисунки примерно так
foto0.jpg foto1.jpg foto2.jpg ........... foto100.jpg
То тогда можно вот так загружать.
Case #Combo_1 If EventType()=1 State=GetGadgetState(#Combo_1) LoadImage(0,"foto"+Str(State)+".jpg") SetGadgetState(#Image_16, ImageID(0)) EndIf EndSelect
А разве это не тот же принцип? Кроме того для первой вкладки можно определять первый индекс массива описания. В итоге все будет принципиально просто, структура прозрачна, и не громоздко!
А разве это не тот же принцип?
В одно и тоже время, будет загружет только один рисунок.
Я именно это и имел ввиду выше:
Можно загружать одно фото, если уж так. Cчитывая номер вкладки и загружая по номеру имя фото. А так прибавится 200 строчек кода
Возник вопрос, касающийся дизайна и функциональности. Вот скрин:
На этом скрине структура программы, которая у меня есть, но мне требуется добавить такую фичу, которая обозначена цифрой 1. То есть при нажатии на выступающую кнопку сбоку левой панели должно выезжать либо окно, либо еще одна панель, в которой должен располагаться список listicon. При повторном нажатии на эту кнопку данная панель должна убираться. И при этом все это дело должно загораживать область рисунка, то есть располагаться на переднем плане. Хотелось бы что бы данная фича плавно выезжала и плавно сворачивалась.
Подскажите, что в данной ситуации можно придумать и как создать такое движение?
Можно сделать так http://depositfiles.com/files/mj1sx5mqz
Procedure Animate(State) If State=1 HideGadget(3, #False) For i=0 To 200 Step 4 ResizeGadget(3,#PB_Ignore,#PB_Ignore,i ,#PB_Ignore ) For x=1 To 20 WindowEvent() Next x Delay(8) Next i Else For i=200 To 0 Step -4 ResizeGadget(3,#PB_Ignore,#PB_Ignore,i ,#PB_Ignore ) For x=1 To 20 WindowEvent() Next x Delay(8) Next i HideGadget(3, #True) EndIf SetGadgetState(2,State) EndProcedure UseJPEGImageDecoder() OpenWindow(1,0,0,390,500,"",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible) CatchImage(1,?M1, ?M2-?M1) ; Загружаем рисунок из памяти ImageGadget(1,20,0,32,32, ImageID(1) ) ; Отображаем его DisableGadget(1, #True) ButtonGadget(2, 2,8,16,100,"",#PB_Button_Toggle) ContainerGadget(3,18,8,0,200) : HideGadget(3, #True) ListIconGadget(4,0,0,200,200,"Тут текст",100,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect) CloseGadgetList() HideWindow(1,0) Repeat ; Начало главного цикла Repeat-Until Event=WaitWindowEvent() ; Получаем текущий идентификатор события If event=#PB_Event_Gadget If EventGadget()=2 Animate(GetGadgetState(2)) EndIf EndIf Until Event=#PB_Event_CloseWindow ; Прерываем цикл при попытке закрыть окно (щелчёк по крестику в заголовке окна) End ; Завершаем работу программы DataSection M1: IncludeBinary "PB4-Developer.jpg" M2: EndDataSection
Спасибо, Петр, то что нужно
А как нарисовать вертикальную линию вдоль всего окна? Типа разделителя области
; ///////////////////////Гаджет линия///////////////////////////////// Procedure LineGadgetHeight(Gadget, x, y, Height, color) Im=CreateImage(#PB_Any, 1, Height) If Im If StartDrawing(ImageOutput(Im)) Line(0,0, 0,Height ,color) ; для PB4.40 Line(0,0, 1,Height ,color) StopDrawing() ImageGadget(Gadget,x, y, 1,Height,ImageID(Im)) EndIf EndIf EndProcedure Procedure LineGadgetWidth(Gadget, x, y, Width, color) Im=CreateImage(#PB_Any, Width, 1) If Im If StartDrawing(ImageOutput(Im)) Line(0,0, Width,0 ,color) ; для PB4.40 Line(0,0, Width,1 ,color) StopDrawing() ImageGadget(Gadget,x, y, Width,1,ImageID(Im)) EndIf EndIf EndProcedure ; ////////////////////////////////////////////////////////////////////// OpenWindow(0, 100, 100, 450, 280, "Заголовок", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) SetWindowColor(0, $ffffff) LineGadgetWidth (1, 20, 40, 300, $6C6C6C) LineGadgetWidth (2, 20, 50, 300, $6C6C6C) ;-------------------------------------- LineGadgetHeight(3, 40, 20, 200, $0501FA) LineGadgetHeight(4, 50, 20, 200, $0501FA) Repeat Event=WaitWindowEvent() If Event=#PB_Event_CloseWindow Break EndIf ForEver
Спасибо, mirashic. Забыл уже, что подобный вопрос спрашивал давно уже тут
Как заставить крутится картинку в окне ?
В какую сторону копать ?
Отредактировано mirashic (29.04.2010 20:14:29)
Посмотри пример в кодархиве (КодАрхив\Graphics\Image\RotateImage_Interpolation.pb)
Вопросы новичка (продолжение…) | Вопросы по PureBasic | 29.06.2024 |
Скорее, это теоретический вопрос о правах в директории. | OffTop | 16.09.2022 |
Вопрос по отладке | Вопросы по PureBasic | 26.01.2017 |
Три вопроса по созданию браузера. | Вопросы по PureBasic | 01.11.2010 |
вопрос о точности типов данных | Вопросы по PureBasic | 20.05.2021 |
Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка