PureBasic - форум

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

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


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


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

Сообщений 841 страница 870 из 1000

841

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

Код:
Procedure SimulateGadgetEvent(Gadget, EventType) 
   Protected wp=Gadget+EventType<<(SizeOf(Word)*8) 
   Protected lp=GadgetID(Gadget) 
   ;get parent window 
   Protected win=GetParent_(GadgetID(Gadget)) 
   While GetParent_(win) : win=GetParent_(win) : Wend 
   ;send message to window 
   PostMessage_(win, #WM_COMMAND, wp, lp) 
EndProcedure

В аргументе Gadget указываем идентификатор интерисующего гаджета, а в EventType тип события.
События могут быть следующими:

Код:
  #PB_EventType_LeftClick        ; Клик левой кнопкой мыши
  #PB_EventType_RightClick       ; Клик правой кнопкой мыши
  #PB_EventType_LeftDoubleClick  ; Двойной клик левой кнопкой мыши
  #PB_EventType_RightDoubleClick ; Двойной клик правой кнопкой мыши

Но правильнее, все же вызывать процедуры.

0

842

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

Лучше конечно вызывать процедуры в место симуляции кликов по кнопкам или другим гаджетам,

Я так и думал, в задачах вроде все решается процедурами, но просто из  алгоритма сложился стереотип,  что такая  функция нужна… :о)
А есть ли возможность использовать в гаджетах анимированный  Gif.
Из справки видно, что  в качестве изображений могут быть:
UseJPEGImageDecoder ; UsePNGImageDecoder ; UseTGAImageDecoder ; UseTIFFImageDecoder
Про Gif (и тем более про анимированный) не сказано. Можно ли их применять, хотя бы с помощью  Доп. Библиотек?

Отредактировано Lucagin (08.12.2010 17:36:44)

0

843

Анимация GIF рисунка.

Код:
If InitMovie()=0
  MessageRequester("Ошибка!", "Не удалось активировать библиотеку InitMovie", #MB_OK|#MB_ICONERROR)
  End
EndIf

If LoadMovie(0,"computer16.gif")=0
  MessageRequester("Ошибка!", "Не удалось загрузить рисунок computer16.gif", #MB_OK|#MB_ICONERROR)
  End
EndIf

OpenWindow(0,0,0,150,150,"",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ContainerGadget(0,20,20,116,116) : CloseGadgetList()
PlayMovie(0,GadgetID(0))

Repeat
  Event=WaitWindowEvent()
Until Event=#PB_Event_CloseWindow

Файлы http://depositfiles.com/files/99pc30k8y

0

844

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

OpenWindow(0,0,0,150,150,"",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ContainerGadget(0,20,20,116,116) : CloseGadgetList()
PlayMovie(0,GadgetID(0))

А создание контейнера здесь использовано, чтобы была возможность менять в окне координаты   элемента PlayMovie()? Или чем-то еще?
А в гаджетах gif использовать нельзя? Например в ImageGadget()?
Просто  в алгоритме, в гаджеты (кнопка и изображение), в свойство (внешняя картинка), можно загружать анимированный gif и получается анимированная кнопка.

Отредактировано Lucagin (08.12.2010 19:27:19)

0

845

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

создание контейнера здесь использовано, чтобы была возможность менять в окне координаты   элемента PlayMovie

Да, именно для этого.

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

А в гаджетах gif использовать нельзя? Например в ImageGadget()?

Можно, но без анимации.

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

ожно загружать анимированный gif и получается анимированная кнопка.

Там анимация выполняется средствами .NET Framework.
PureBasic же базируется на API.

Но все же если очень нужно, можно загрузить в кнопку анимированный рисунок.

Код:
Interface IShellImageDatasFactory Extends IUnknown 
  CreateIShellImageDatas(a.l) 
  CreateImageFromFile(a.p - unicode, b.l) 
  CreateImageFromStream(a.l, b.l)     
  GetDatasFormatFromPath(a.l, b.l)    
EndInterface 

Interface IShellImageDatas Extends IUnknown 
  Decode(a.l, b.l, c.l) 
  Draw(a.l, b.l, c.l)
  NextFrame() 
  NextPage() 
  PrevPage() 
  IsTransparent() 
  IsAnimated() 
  IsVector() 
  IsMultipage() 
  IsEditable() 
  IsPrintable() 
  IsDecoded() 
  GetCurrentPage(a.l) 
  GetPageCount(a.l) 
  SelectPage(a.l) 
  GetSize(a.l) 
  GetRawDatasFormat(a.l) 
  GetPixelFormat(a.l) 
  GetDelay(a.l) 
  GetProperties(a.l, b.l) 
  Rotate(a.l) 
  Scale(a.l, b.l, c.l) 
  DiscardEdit() 
  SetEncoderParams(a.l) 
  DisplayName(a.l, b.l) 
  GetResolution(a.l, b.l) 
  GetEncoderParams(a.l, b.l) 
  RegisterAbort(a.l, b.l) 
  CloneFrame(a.l) 
  ReplaceFrame(a.l) 
EndInterface 

#CLSCTX_INPROC_SERVER = 1 
#SHIMGDEC_DEFAULT = 0 


If OpenWindow(0, 0, 0, 700, 500, "Press ESC to quit", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_TitleBar) 
  AddWindowTimer(0, 1, 1) 
  ButtonGadget(0,20,20,20,20,"")
  ButtonGadget(1,0,0,200,20,"открыть") 
EndIf 

CoInitialize_(0) 
wszPath.s = OpenFileRequester("Please select", "", "GIF files (*.gif)|*.gif", 1) ;Space(#MAX_PATH) 

If CoCreateInstance_(?CLSID_ShellImageDatasFactory, #Null, #CLSCTX_INPROC_SERVER, ?IID_IShellImageDatasFactory, @*factory.IShellImageDatasFactory) = 0 
  
  *Datas.IShellImageDatas 
  If *factory\CreateImageFromFile(wszPath, @*Datas) = 0 
    
    *Datas\Decode(#SHIMGDEC_DEFAULT, 0, 0); 
    rc.RECT 
    rc\left = 0; 
    rc\top = 0; 
    *Datas\GetSize(@rc\right); 
    dc.l = GetDC_(GadgetID(0)); 
    *Datas\Draw(dc, @rc, @rc); 
    ResizeGadget(0,#PB_Ignore,#PB_Ignore,rc\right+2,rc\bottom+2) 
    
    If *Datas\IsAnimated() = 0 
      While GetAsyncKeyState_(#VK_ESCAPE) = 0 
        Event  = WaitWindowEvent() 
        gEvent = EventGadget()
        
        If  Event = #PB_Event_CloseWindow
          Break
        EndIf
       
        If  Event = #PB_Event_Gadget 
          Select gEvent 
            Case 1 
              wszPath.s = OpenFileRequester("Please select", "", "GIF files (*.gif)|*.gif", 1) 
              *factory\CreateImageFromFile(wszPath, @*Datas) 
              *Datas\Decode(#SHIMGDEC_DEFAULT, 0, 0); 
              rc.RECT 
              rc\left = 0; 
              rc\top = 0; 
              *Datas\GetSize(@rc\right); 
              dc.l = GetDC_(GadgetID(0)); 
              *Datas\Draw(dc, @rc, @rc); 
              ResizeGadget(0,#PB_Ignore,#PB_Ignore,rc\right+2,rc\bottom+2) 
          EndSelect 
        EndIf 
        
        
        *Datas\GetDelay(@time); 
        
        ;                   Sleep_(time); 
        If Event = #PB_Event_Timer And EventTimer() = 1 
          If t>time 
            t=0 
            InvalidateRect_(GadgetID(0),@rc, #True) 
            If *Datas\NextFrame() 
              *Datas\SelectPage(0); 
            EndIf 
            
          Else 
            t=t+20 
          EndIf 
        Else 
          *Datas\Draw(dc, @rc, @rc); 
        EndIf                     
      Wend 
    EndIf 
    ReleaseDC_(0, dc); 
    ;/ / remove image from desktop 
    rc\bottom = rc\bottom + 20; 
    InvalidateRect_(0, @rc, #True); 
    *Datas\Release(); 
  EndIf 
  *factory\Release(); 
EndIf 
;   EndIf 
CoUninitialize_(); 

Macro DefineGUID(IID, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11) 
  DataSection 
    IID : 
    Data.l Data1 
    Data.w Data2, Data3 
    Data.b Data4, Data5, Data6, Data7, Data8, Data9, Data10, Data11 
  EndDataSection 
EndMacro 

DefineGUID(CLSID_ShellImageDatasFactory, $66e4e4fb, $f385, $4dd0, $8d, $74, $a2, $ef, $d1, $bc, $61, $78) 
DefineGUID(IID_IShellImageDatasFactory, $9be8ed5c, $edab, $4d75, $90, $f3, $bd, $5b, $db, $b2, $1c, $82)

Код обсуждался здесь http://purebasic.info/phpBB2/viewtopic.php?t=1148

0

846

Есть ли возможность в PB, после того как проект из визуального конструктора переведен в код (пунктом меню  PureBasic editor),после правки кода, перейти назад в режим визуального конструктора с  измененным кодом этого проекта(для удобства например перераспределения гаджетов на окне). Или после перевода проекта в код, обратный переход в режим ВК не предусмотрен?

Еще в примерах кода PB сложность вызывают места, где используются API-функции.  Где можно почитать по поводу применения Api-функций в PB(по возможности развернуто). Для PB есть специфика их применения или любой материал по поводу API-функций будет полезен для их применения в PB?

0

847

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

Есть ли возможность в PB, после того как проект из визуального конструктора переведен в код (пунктом меню  PureBasic editor),после правки кода, перейти назад в режим визуального конструктора с  измененным кодом этого проекта(для удобства например перераспределения гаджетов на окне). Или после перевода проекта в код, обратный переход в режим ВК не предусмотрен?

Нужно сохранять проект окна.
Когда нужно что-то изменить, загружаем проект окна в визуальный конструктор, изменяем что нужно и заменяем в программе процедуру создания окна.

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

Еще в примерах кода PB сложность вызывают места, где используются API-функции.  Где можно почитать по поводу применения Api-функций в PB(по возможности развернуто). Для PB есть специфика их применения или любой материал по поводу API-функций будет полезен для их применения в PB?

Прочитать про API можно на сайте microsoft.
Почти все что там написано, справедливо при работе с API в PureBasic.
Вот небольшие справочники по API, но там рассмотрены далеко не все WinAPI функции.
http://pure-basic.narod.ru/miscfiles/API.rar
http://pure-basic.narod.ru/miscfiles/API_Help.rar

Все же лучше всего, искать описание на microsoft.com
Для более удобного поиска, можно использовать эту программу http://purebasic.info/phpBB2/viewtopic.php?t=1354

0

848

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

Код обсуждался здесь http://purebasic.info/phpBB2/viewtopic.php?t=1148

На первый взгляд довольно сложный код, а разве нельзя с помощью 5-ти прозрачных и легких PNG  и банального таймера создать прекрасный гиф прямо в программе. Зациклить по таймеру последовательную смену 5-ти картинок в гаджете. Я думаю скорость PB позволит  это сделать без тормозов. Вот и получим gif, только из PNG… Я подобное делал в Алгоритме, правда из статических Gif, которые брал из папки. В PB их можно встроить в исполняемый файл… Или я что-то не учитываю? PB ведь может корректно отображать прозрачные PNG?

Большое Спасибо за ссылки, буду изучать. Давно мечтаю во всем этом  разобраться... :о))

0

849

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

разве нельзя с помощью 5-ти прозрачных и легких PNG  и банального таймера создать прекрасный гиф прямо в программе

Конечно можно, но ведь вопрос был не про статические PNG, а про анимированый GIF.

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

PB ведь может корректно отображать прозрачные PNG?

Да может.

0

850

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

Конечно можно, но ведь вопрос был не про статические PNG, а про анимированый GIF.

Чем пользоваться чужими gif, будем создавать свои и прямо в программе. :о)
Большущее спасибо Петр за разъяснения и помощь! :flag:  Буду переваривать что узнал…  :writing:

0

851

Вот нашел пример анимации PNG рисунков http://purebasic.info/phpBB2/viewtopic.php?t=1153
В том примере (первый пост темы), нужно заменить 50 строку на это gif(st)\file_name="ani_smiles\"+Str(st)+".png"

0

852

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

Вот нашел пример анимации PNG рисунков -- том примере (первый пост темы), нужно заменить 50 строку на это gif(st)\file_name="ani_smiles\"+Str(st)+".png"

Очень интересно, буду разбираться. Я планировал использовать для анимации картинки отдельно, а здесь выходит можно объединять картинки в одну  “панорамную” PNG :о)  Надеюсь ресурсов справки будет достаточно чтобы разобраться :о))

0

853

Да кстати, совсем забыл спросить,  а можно ли в исполняемый код PB встраивать кусочки видео, как это делается с картинками функцией CatchImage() или это уже не рационально???

0

854

Библиотека Movie не поддерживает воспроизведение видео из памяти, только с диска.
Скорее всего, в этом случае придется использовать стороннюю библиотеку.

0

855

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

Библиотека Movie не поддерживает воспроизведение видео из памяти, только с диска.Скорее всего, в этом случае придется использовать стороннюю библиотеку.

Ясно, Спасибо!!!

0

856

Делал, когда-то, анимированную кнопку...

Использовал ico фармат, так как эти изображения были и для трея...
Но можно и PNG формат для кнопки, добавляешь только декодер.

http://www.mirashic.narod.ru/anim_but.rar

0

857

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

Но можно и PNG формат для кнопки, добавляешь только декодер.

Спасибо! Интересный пример, попробую выбрать разумный компромисс :о) Что  проще в исполнении и быстрее работает… :о)

0

858

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

Пробовал в WinXP и Win7 - мерцаний нет.

Пётр, проверил файл на всех доступных мне компах, на 2-х мониторах (CRT и ЖК), на Win-ХP и Win-vista, посылал файл  другу (он смотрел на 2-х компьютерах), везде присутствует мерцание картинок при наведении (отведение) мышки.  Записал мерцание на камеру, отрывок видео и скомпилированных файл с картинками прилагаю. Просто такой интересный проект был задуман, но мерцание все портит.  :dontknow:
Как-то можно сделать, чтобы кнопка не реагировала на наведение на нее курсора мышки, а лишь реагировала на клик по кнопке???
Все кто может, прошу проверить  есть ли  мерцание и предложить методы его устранения… http://ifolder.ru/20710706  (Ссылка на видео и файл)

  :question:

Отредактировано Lucagin (09.12.2010 17:16:43)

0

859

XP у меня мерцания нет. У меня меняется только фокус.
Надо тебе воложить и конечный код... архив...

Отредактировано mirashic (09.12.2010 17:27:34)

0

860

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

Надо тебе воложить и конечный код... архив...
XP у меня мерцания нет. У меня меняется только фокус.

У меня тоже меняется только фокус, но частая смена фокуса дает неприятное подергивание картинки. Как можно отключить смену фокуса, но чтобы при этом клик по кнопке был возможен? . Здесь код с картинками… http://ifolder.ru/20711790

Отредактировано Lucagin (09.12.2010 17:44:10)

0

861

У меня не мерцает.
Мерцает только при изменении размера.

0

862

Попробовал код из архива - мерцаний нет. :dontknow:
Странно все это! :huh:

0

863

Я не могу сказать, что у меня именно мерцание идет, происходит что-то похожее на мгновенную перерисовку картинки. Когда мышка на картинке находится изображение стабильно, но если ее увести с картинки , то происходит такой одноразовый "рывок" изображения…

Вообще смену фокуса безболезненно можно отключить?

Отредактировано Lucagin (09.12.2010 20:17:12)

0

864

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

Я не могу сказать, что у меня именно мерцание идет, происходит что-то похожее на мгновенную перерисовку картинки. Когда мышка на картинке находится изображение стабильно, но если ее увести с картинки , то происходит такой одноразовый "рывок" изображения…

У меня ничего подобного нет.
Видео http://depositfiles.com/files/ltvq6ga2u

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

Вообще смену фокуса безболезненно можно отключить?

Можно.
Для этого нужно вклинится в системный обработчик событий кнопки и фильтровать все сообщения, блокируя сообщения #WM_SETFOCUS и #WM_KILLFOCUS.

0

865

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

Можно.Для этого нужно вклинится в системный обработчик событий кнопки и фильтровать все сообщения, блокируя сообщения #WM_SETFOCUS и #WM_KILLFOCUS.

Виват! Наконец всё понятно, у меня стоит классическая тема Windows, а у тебя тема “Windows  XP”. Переключись на классическую тему и получишь мое мерцание! Проверено. На теме Windows XP, у меня тоже нет мерцания и картинка как у тебя.

А вклиниться в системный обработчик событий  можно встроенными средствами или для этого нажно Api-функции использовать? И можно ли при этом будет безболезненно нажимать на кнопку, без доп. отслеживания координат курсора?

Отредактировано Lucagin (09.12.2010 20:30:38)

0

866

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

вклиниться в системный обработчик событий  можно встроенными средствами или для этого нажны Api-функции использовать

С помощью API.
Вот пример http://purebasic.info/phpBB2/viewtopic.php?t=797
Правда, там StringGadget, но принцип тот-же самый.

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

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

Да.
Если правильно сделать фильтр сообщений, то он не будет мешать нормальной работе кнопки, она просто не будет получать сообщения что на неё наведена мышка, а клики будут беспрепяственно проходить.

0

867

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

С помощью API.
Вот пример http://purebasic.info/phpBB2/viewtopic.php?t=797
Правда, там StringGadget, но принцип тот-же самый.

Большущая благодарность, Пётр!!!
Буду разбираться… :writing:

Отредактировано Lucagin (09.12.2010 20:42:23)

0

868

Ребята, подскажите, почему не работает такая схема? Хочу, чтобы при нажатии на кнопку на 3-ри секунды загоралась надпись, потом гасла. Если изначально надпись сделать видимой, то код один раз сработает, потом почему-то не делает надпись вновь видимой. Может использование  Delay() в этой схеме не корректно?
И еще, можно ли внутри одной процедуры запускать другую??

Код:
;
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Text_0
  #Button_0
  #Button_1
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 36)
Global FontID2
FontID2 = LoadFont(2, "Arial", 28)

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 381, 168, 730, 400, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      TextGadget(#Text_0, 160, 100, 420, 60, "ОБРАЗЕЦ!!!", #PB_Text_Center)
      SetGadgetFont(#Text_0, FontID1)
      ButtonGadget(#Button_0, 40, 290, 230, 60, "Верно")
      SetGadgetFont(#Button_0, FontID2)
      ButtonGadget(#Button_1, 460, 290, 230, 60, "Не верно")
      SetGadgetFont(#Button_1, FontID2)
      
    EndIf
  EndIf
  
  HideGadget(#Text_0, 1)
EndProcedure


Open_Window_0()

Repeat
  Event=WaitWindowEvent()
  Gadget=EventGadget()
  
  If Event=#PB_Event_Gadget
    
    If gadget=#Button_0
    
        SetGadgetColor(#Text_0, #PB_Gadget_FrontColor, RGB(98, 200, 103))
        SetGadgetText(#Text_0, "Верно")
        HideGadget(#Text_0, 0)
        Delay(3000)
        HideGadget(#Text_0, 1)
      Else
        SetGadgetColor(#Text_0, #PB_Gadget_FrontColor, RGB(255, 0, 0))
        SetGadgetText(#Text_0, " Не Верно")
        HideGadget(#Text_0, 0)
        Delay(3000)
        HideGadget(#Text_0, 1)
      
   EndIf
      
EndIf
    
             
      
     
   
  
 Until Event=#PB_Event_CloseWindow
 
 End

0

869

Delay тут не корректно.
Dнутри одной процедуры запускать другую можно и нужно
Пример:

Код:
;
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)


;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Text_0
  #Button_0
  #Button_1
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 36)
Global FontID2
FontID2 = LoadFont(2, "Arial", 28)
Procedure Wait(ms) 
	ms+ElapsedMilliseconds() 
	 Repeat 
	WaitWindowEvent(5) 
	Until ElapsedMilliseconds()>ms 
	EndProcedure 

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 381, 168, 730, 400, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      TextGadget(#Text_0, 160, 100, 420, 60, "ОБРАЗЕЦ!!!", #PB_Text_Center)
      SetGadgetFont(#Text_0, FontID1)
      ButtonGadget(#Button_0, 40, 290, 230, 60, "Верно")
      SetGadgetFont(#Button_0, FontID2)
      ButtonGadget(#Button_1, 460, 290, 230, 60, "Не верно")
      SetGadgetFont(#Button_1, FontID2)
      
    EndIf
  EndIf
  
  HideGadget(#Text_0, 1)
EndProcedure
Open_Window_0()

Repeat
  Event=WaitWindowEvent()
  Gadget=EventGadget()
  
  If Event=#PB_Event_Gadget
    
    If gadget=#Button_0
    
        SetGadgetColor(#Text_0, #PB_Gadget_FrontColor, RGB(98, 200, 103))
        SetGadgetText(#Text_0, "Верно")
        HideGadget(#Text_0, 0)
        Wait(300)
        HideGadget(#Text_0, 1)
      Else
        SetGadgetColor(#Text_0, #PB_Gadget_FrontColor, RGB(255, 0, 0))
        SetGadgetText(#Text_0, " Не Верно")
        HideGadget(#Text_0, 0)
        Wait(300)
        HideGadget(#Text_0, 1)
      
   EndIf
      
EndIf

 Until Event=#PB_Event_CloseWindow
 
 End

0

870

ВиниПур написал(а):

Delay тут не корректно.Dнутри одной процедуры запускать другую можно и нужно

Спасибо, интересное решение. Как я сам не догадался использовать  ElapsedMilliseconds(), пробовал создавать таймер, но схема длинной получается…

0


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