PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка


Вопросы новичка

Сообщений 361 страница 390 из 1000

361

Как поменять изображение у картинки, каким действием

Отредактировано daiomik (25.04.2010 21:08:53)

0

362

daiomik написал(а):

Как поменять изображение у картинки, каким действием

SetGadgetState(gadget, ImageID(#Cre_Image2))

0

363

Почему с помощью данного примера не получается, точней, первый раз рисунок меняется, а затем сбивается и неразбериха получается (приведено только действие объекта). В списке у меня всего две записи. Нужно: если пользователь выбирает одно-загружается один рисунок, другую-друго

Код:
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

0

364

помести эти команды LoadImage() выше основного цикла

0

365

как это выше если мне их нужно открывать и загружать по мере надобности

0

366

Кроме того, идентификаторы сделай для каждого изображения свои.  LoadImage(0,"sceleton.jpg")    LoadImage(1,"body.jpg")

0

367

как это выше если мне их нужно открывать и загружать по мере надобности

Загружай их в начале программы. А потом только используй их идентификаторы

0

368

Все равно так же как в прошлый раз. В независимости от того какой пункт я выбрал загружается вторая картинка и при последующем выборе ничего не происходит. Наверно как то условия/действие выбора из списка написано не правильно.

0

369

366 пост читай внимательней. У каждого фото свой идентификатор, как у человека свои имя с фамилией. И в условиях так же надо учитывать это

0

370

Код:
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

0

371

Попробуй вот так

Код:
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

0

372

Пётр, так получается. Спасибо. haav, даже не представляю почему у нас не получилось. Делал я так же как ты показал. Ну теперь буду знать

0

373

А если когда у меня увеличится колличество записей списка, мне нужно будет достаточно только дописывать Case . Тогда для чего тут If EventType()=1

0

374

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 строчках для любого кол-ва файлов. А насколько я помню в проекте будет не одна сотня.

0

375

daiomik написал(а):

Тогда для чего тут 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

0

376

Спасибо. Теперь понял

0

377

haav написал(а):

Зато загрузить получится циклом. То есть если фото будет 1.bmp 2.bmp 3.bmp  загружать их будет проще некуда, и уместится загрузка в 3 строчках для любого кол-ва файлов.

А стоит ли?
Допустим, будет 50 фоток, каждая по 100 КБ, это уже 5 МБ, а памяти потребуется примерно в несколько раз больше, учитывая что JPG будет перекодироватся в точечный рисунок, формата BMP.
Итого получается, что потребуется 100 МБ оперативки, а может даже больше!
Так что если рисунков много, их нужно загружать по мере надобности и выгружать когда не нужны, что собтсвенно daiomik и делает.

0

378

Пётр написал(а):

А стоит ли?Допустим, будет 50 фоток, каждая по 100 КБ, это уже 5 МБ, а памяти потребуется примерно в несколько раз больше, учитывая что JPG будет перекодироватся в точечный рисунок, формата BMP.Итого получается, что потребуется 100 МБ оперативки, а может даже больше!Так что если рисунков много, их нужно загружать по мере надобности и выгружать когда не нужны, что собтсвенно daiomik и делает.

Если даже и так, хотя я загрузил BMP несколько? памяти заняло немногим больше, C JPG не пробовал, поверю тебе. Все равно считаю такое написание нерациональным. Можно загружать одно фото, если уж так. Cчитывая номер вкладки и загружая по номеру имя фото. А так прибавится 200 строчек кода. Я лентяй, чтобы такое писать   :D Да будут некоторые трудности с определением фото для вкладок вначале, но существенное облегчение кода как цикла так и загрузки. Это мое мнение, в любом случае daiomik делает как ему понятнее.

0

379

haav написал(а):

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

0

380

А разве это не тот же принцип? :D   Кроме того для первой вкладки можно определять первый индекс массива описания. В итоге все будет принципиально просто, структура прозрачна, и не громоздко!

0

381

haav написал(а):

А разве это не тот же принцип?

В одно и тоже время, будет загружет только один рисунок.

0

382

Я именно это и имел ввиду выше:

Можно загружать одно фото, если уж так. Cчитывая номер вкладки и загружая по номеру имя фото. А так прибавится 200 строчек кода

0

383

Возник вопрос, касающийся дизайна и функциональности. Вот скрин:
http://s45.radikal.ru/i109/1004/35/f570ae0987e0.jpg
На этом скрине структура программы, которая у меня есть, но мне требуется добавить такую фичу, которая обозначена цифрой 1. То есть при нажатии на выступающую кнопку сбоку левой панели должно выезжать либо окно, либо еще одна панель, в которой должен располагаться список listicon. При повторном нажатии на эту кнопку данная панель должна убираться. И при этом все это дело должно загораживать область рисунка, то есть располагаться на переднем плане. Хотелось бы что бы данная фича плавно выезжала и плавно сворачивалась.
Подскажите, что в данной ситуации можно придумать и как создать такое движение?

0

384

Можно сделать так 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

0

385

Спасибо, Петр, то что нужно  :cool:

0

386

А как нарисовать вертикальную линию вдоль всего окна? Типа разделителя области

0

387

Код:
; ///////////////////////Гаджет линия/////////////////////////////////
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

0

388

Спасибо, mirashic. Забыл уже, что подобный вопрос спрашивал давно уже тут

0

389

Как заставить крутится картинку в окне ?
В какую сторону копать ?
http://www.mirashic.narod.ru/9.png

Отредактировано mirashic (29.04.2010 20:14:29)

0

390

Посмотри пример в кодархиве (КодАрхив\Graphics\Image\RotateImage_Interpolation.pb)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка