PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Просмотрщик фотографий


Просмотрщик фотографий

Сообщений 31 страница 56 из 56

31

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

Попробуй так

Етишкин Шишкин! Я тут изобретаю формулу сломанной телеги, а оно вон как все просто. Не хочу оправдываться, но что подобное шевелилось в мозгу. В любом случае спасибо огромное, неизвестно сколько еще бы времени я потратил, пока пришел бы к этому.

0

32

А как отображать все время отталкиваясь от середины? Ведь imagegadget не меняет начальные размеры, то есть если изначально были ноль, то ноль и остается.  %-)

0

33

Ну определяй размер рисунка и окна, а затем, с помощью ResizeGadget перемещай ImageGadget.

0

34

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

Ну определяй размер рисунка и окна, а затем, с помощью ResizeGadget перемещай ImageGadget.

Спасибо Петр!   Че то я совсем уже запарился. Про ResizeGadget забыл совсем. Залез в справку, начал искать в ImageGadget как его перемещать. Ведь с  командой ResizeGadget я пятнашку делал.  :shine:

0

35

Петр! А ессть ли возможность как то ограничивать изображение только на ImageGadget.  То есть когда фото увеличиваем и оно становится больше чем гаджет оно залезает на другие гаджеты :(   Неужели только резать каждый раз?

0

36

Можно так сделать

Код:
UseJPEGImageDecoder()

If OpenWindow(1,100,100,800,600,"")
TrackBarGadget(2, 200, 500, 500, 35*1, 0, 200)
ScrollAreaGadget(3,2,2,790,480,200,200,10,#PB_ScrollArea_BorderLess)
  ImageGadget(1,0,0,500,500,0)
CloseGadgetList()
EndIf
LoadImage(4,"D:\PB_3D_perspective.jpg")  ;фото свое поставте
CreateImage(1,ImageWidth(4), ImageHeight(4))
CopyImage(4,1)
SetGadgetAttribute(3,#PB_ScrollArea_InnerWidth,ImageWidth(4))
SetGadgetAttribute(3,#PB_ScrollArea_InnerHeight,ImageHeight(4))
SetGadgetState(2,100)

Repeat
ev=WaitWindowEvent()
If ev=#PB_Event_Gadget
If EventGadget()=2
   aa=GetGadgetState(2)*4+1
   CopyImage(1,4)
   ResizeImage(4,aa,aa)
   SetGadgetAttribute(3,#PB_ScrollArea_InnerWidth,ImageWidth(4))
   SetGadgetAttribute(3,#PB_ScrollArea_InnerHeight,ImageHeight(4))
   SetGadgetState(1,ImageID(4))
EndIf
EndIf   
Until ev=#PB_Event_CloseWindow

0

37

Петр! Просто супер, мне это и нужно было. Скрол как раз в тему, да и вообще... Кстати попутные вопросы: какая функция отвечает за прозрачность фото. То есть когда буду обрезку делать, мне нужно что такое полупрозрачное. Да с мышью при передвижении наверно лучше API использовать или средствами пурика можно обойтись?

0

38

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

какая функция отвечает за прозрачность фото.

Не совсем понимаю что требуется.
Зачем фотку делать прозрачной?

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

Да с мышью при передвижении наверно лучше API использовать

Имеешь в виду рамку выделения для обрезки фотки?

0

39

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

Не совсем понимаю что требуется.Зачем фотку делать прозрачной? Имеешь в виду рамку выделения для обрезки фотки?

Имею в виду рамку выделения для обрезки фотки. Не прошу код, если тебе некогда, просто совет.

0

40

Вот посмотри на этот код.

Код:
Global gadget1, gadget2, gadget3, gadget4 


Procedure OnMouseSelection(hWnd,x,y,width,height) 
  Select hWnd 
    Case GadgetID(gadget1) : Gadget$ = "gadget 1" 
    Case GadgetID(gadget2) : Gadget$ = "gadget 2" 
    Case GadgetID(gadget3) : Gadget$ = "gadget 3" 
    Case GadgetID(gadget4) : Gadget$ = "gadget 4" 
    Default: Gadget$ = "unbekannt" 
  EndSelect 

  Debug "-----" 
  Debug "Selected:" 
  Debug "hWnd  : "+Gadget$ 
  Debug "X     : "+Str(x) 
  Debug "Y     : "+Str(y) 
  Debug "Width : "+Str(width) 
  Debug "Height: "+Str(height) 
EndProcedure 


Procedure DrawMouseSelector(hWnd) 
  Shared WindowProc_MouseSelectStartX, WindowProc_MouseSelectLastX 
  Shared WindowProc_MouseSelectStartY, WindowProc_MouseSelectLastY 
  Shared WindowProc_MouseSelectRect.RECT 

  If WindowProc_MouseSelectStartX > WindowProc_MouseSelectLastX 
    WindowProc_MouseSelectRect\left   = WindowProc_MouseSelectLastX 
    WindowProc_MouseSelectRect\right  = WindowProc_MouseSelectStartX 
  Else 
    WindowProc_MouseSelectRect\left   = WindowProc_MouseSelectStartX 
    WindowProc_MouseSelectRect\right  = WindowProc_MouseSelectLastX 
  EndIf 
  If WindowProc_MouseSelectStartY > WindowProc_MouseSelectLastY 
    WindowProc_MouseSelectRect\top    = WindowProc_MouseSelectLastY 
    WindowProc_MouseSelectRect\bottom = WindowProc_MouseSelectStartY 
  Else 
    WindowProc_MouseSelectRect\top    = WindowProc_MouseSelectStartY 
    WindowProc_MouseSelectRect\bottom = WindowProc_MouseSelectLastY 
  EndIf 

  hDC = GetDC_(hWnd) 
    ;InvertRect_(hDC,@WindowProc_MouseSelectRect) 
    DrawFocusRect_(hDC,@WindowProc_MouseSelectRect) 
  ReleaseDC_(hWnd,hDC) 
  ;UpdateWindow_(hWnd) ; Win9x fix? 
EndProcedure 


Procedure WindowProc(hWnd,Msg,wParam,lParam) 
  Shared WindowProc_MouseSelect 
  Shared WindowProc_MouseSelectStartX, WindowProc_MouseSelectLastX 
  Shared WindowProc_MouseSelectStartY, WindowProc_MouseSelectLastY 
  Shared WindowProc_MouseSelectRect.RECT 

  Select Msg 
    Case #WM_LBUTTONDOWN 
      WindowProc_MouseSelect  = 1 
      WindowProc_MouseSelectStartX = lParam&$FFFF 
      WindowProc_MouseSelectStartY = (lParam>>16)&$FFFF 
      GetClientRect_(hWnd,winrect.RECT) 
      MapWindowPoints_(hWnd,0,winrect,2) 
      ClipCursor_(winrect) 
      ProcedureReturn 0 
    Case #WM_LBUTTONUP 
      If WindowProc_MouseSelect > 1 
        DrawMouseSelector(hWnd) 
        If WindowProc_MouseSelectRect\left <> WindowProc_MouseSelectRect\right And WindowProc_MouseSelectRect\top <> WindowProc_MouseSelectRect\bottom 
          OnMouseSelection(hWnd,WindowProc_MouseSelectRect\left,WindowProc_MouseSelectRect\top,WindowProc_MouseSelectRect\right-WindowProc_MouseSelectRect\left,WindowProc_MouseSelectRect\bottom-WindowProc_MouseSelectRect\top) 
          SetCapture_(0) 
        EndIf 
      EndIf 
      ClipCursor_(0) 
      WindowProc_MouseSelect = 0 
      ProcedureReturn 0 
    Case #WM_MOUSEMOVE 
      If WindowProc_MouseSelect > 0 And wParam & #MK_LBUTTON 
        If WindowProc_MouseSelect > 1 
          DrawMouseSelector(hWnd) 
        Else 
          WindowProc_MouseSelect + 1 
        EndIf 
        WindowProc_MouseSelectLastX = lParam&$FFFF 
        WindowProc_MouseSelectLastY = (lParam>>16)&$FFFF 
        DrawMouseSelector(hWnd) 
        SetCapture_(hWnd) 
      EndIf 
      ProcedureReturn 0 
  EndSelect 
  old=GetWindowLong_(hWnd,#GWL_USERDATA) 
  If old 
    ProcedureReturn CallWindowProc_(old,hWnd,Msg,wParam,lParam) 
  Else 
    DefWindowProc_(hWnd,Msg,wParam,lParam) 
  EndIf 
EndProcedure 



Procedure SelectorImage(x,y,w,h,hImage) 
  img = ImageGadget(#PB_Any,x,y,w,h,hImage) 
  If img 
    old = SetWindowLong_(GadgetID(img),#GWL_WNDPROC,@WindowProc()) 
    SetWindowLong_(GadgetID(img),#GWL_USERDATA,old) 
  EndIf 
  ProcedureReturn img 
EndProcedure 

OpenWindow(0,0,0,630,630,"Mega Mouse Selector",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible) 
  If CreateImage(1,300,300)=0 
    MessageRequester("ERROR","Cant create image"):End 
  EndIf 

  If StartDrawing(ImageOutput(1)) 
    For y = 0 To 299 Step 2 
      For x = 0 To 299 Step 2 
        Plot(x,y,Random($FFFFFF)) 
      Next x 
    Next y 
    StopDrawing() 
  EndIf 

  CreateGadgetList(WindowID(0)) 
  gadget1 = SelectorImage( 10, 10,300,300,ImageID(1)) 
  gadget2 = SelectorImage(320, 10,300,300,ImageID(1)) 
  gadget3 = SelectorImage( 10,320,300,300,ImageID(1)) 
  gadget4 = SelectorImage(320,320,300,300,ImageID(1)) 
HideWindow(0,0) 

Repeat 
  Select WaitWindowEvent() 
    Case #PB_Event_CloseWindow 
      End 
  EndSelect 
ForEver

0

41

Благодарю, то что надо. Кстати я поискал в код архиве, но не нашел как сохранять GIF . Нашел как его просматривать, но как сохранять в  формате Gif нет. Может ты где натыкался на такой плагин?

0

42

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

Может ты где натыкался на такой плагин?

К сожалению не видел.

0

43

Петр! помоги пожалуйста если не трудно. Я переделал немного код(может неправильно). У меня вроде все нормально, но есть баги которые я не могу убрать никак. Все выделяется, исчезает как надо, но когда начинаешь лишние разы щелкать, появляются прошлые выделенные участки, которые нафиг не нужны. Я уже и переключатели ставил на отключение всех процедур, участвующих в этом рисовании после первого выделения, программа как будто идет другим потоком, мне не подконтрольным.

Код:
Procedure OnMouseSelection(fffffff,x,y,width,height) 

 Debug x
 Debug y
 Debug width
  Debug height
EndProcedure 

Procedure DrawMouseSelector(fffffff) 

  Shared WindowProc_MouseSelectStartX, WindowProc_MouseSelectLastX 
  Shared WindowProc_MouseSelectStartY, WindowProc_MouseSelectLastY 
  Shared WindowProc_MouseSelectRect.RECT 

  If WindowProc_MouseSelectStartX > WindowProc_MouseSelectLastX 
    WindowProc_MouseSelectRect\left   = WindowProc_MouseSelectLastX 
    WindowProc_MouseSelectRect\right  = WindowProc_MouseSelectStartX 
  Else 
    WindowProc_MouseSelectRect\left   = WindowProc_MouseSelectStartX 
    WindowProc_MouseSelectRect\right  = WindowProc_MouseSelectLastX 
  EndIf 
  If WindowProc_MouseSelectStartY > WindowProc_MouseSelectLastY 
    WindowProc_MouseSelectRect\top    = WindowProc_MouseSelectLastY 
    WindowProc_MouseSelectRect\bottom = WindowProc_MouseSelectStartY 
  Else 
    WindowProc_MouseSelectRect\top    = WindowProc_MouseSelectStartY 
    WindowProc_MouseSelectRect\bottom = WindowProc_MouseSelectLastY 
  EndIf 

  hDC = GetDC_(fffffff) 
  If FUN_REC=1
    InvertRect_(hDC,@WindowProc_MouseSelectRect)   ; изменяет пиксели( инвертирует)
  EndIf  
    DrawFocusRect_(hDC,@WindowProc_MouseSelectRect) ;Функция DrawFocusRect использует операцию XOR при рисовании - таким образом вывод прямоугольника дважды с одними и теми же координатами стирает прямоугольник, и прямоугольник всегда будет виден, на фоне какого бы цвета он не выводился.
    ReleaseDC_(fffffff,hDC) 

EndProcedure 


Procedure WindowProc(fffffff,Msg,wParam,lParam) 

 
  Shared WindowProc_MouseSelect 
  Shared WindowProc_MouseSelectStartX, WindowProc_MouseSelectLastX 
  Shared WindowProc_MouseSelectStartY, WindowProc_MouseSelectLastY 
  Shared WindowProc_MouseSelectRect.RECT 

  Select Msg 
  
    Case #WM_LBUTTONDOWN 
         DrawMouseSelector(fffffff)
         WindowProc_MouseSelect  = 1 
         WindowProc_MouseSelectStartX = lParam&$FFFF  ; определяют любое расстояние  по оси Х (без нее все время будет от нуля)
         WindowProc_MouseSelectStartY = (lParam>>16)&$FFFF  ; определяют любое расстояние  по оси Y (без нее все время будет от нуля)
 
         GetClientRect_(fffffff,winrect.RECT) 
         MapWindowPoints_(fffffff,0,winrect,2)  ;преобразует (отображает) ряд точек относительно координатного пространства одного окна  относительно координатного пространства другого окна.
         ClipCursor_(winrect)          ;ограничитель курсора в рамке окна
       ProcedureReturn 0 
    Case #WM_LBUTTONUP 
 
      If WindowProc_MouseSelect > 1 
        
         ;DrawMouseSelector(fffffff)  ; отлючив ее инвертация(изображение) остается
     
        If WindowProc_MouseSelectRect\left <> WindowProc_MouseSelectRect\right And WindowProc_MouseSelectRect\top <> WindowProc_MouseSelectRect\bottom 
         OnMouseSelection(fffffff,WindowProc_MouseSelectRect\left,WindowProc_MouseSelectRect\top,WindowProc_MouseSelectRect\right-WindowProc_MouseSelectRect\left,WindowProc_MouseSelectRect\bottom-WindowProc_MouseSelectRect\top) 
         SetCapture_(0) ;устанавливает захват мыши в заданном окне, принадлежащем текущему потоку.
        EndIf 
      EndIf 
      ClipCursor_(0) 
      WindowProc_MouseSelect = 0 
      ProcedureReturn 0 
 
    Case #WM_MOUSEMOVE   
      If WindowProc_MouseSelect > 0 And wParam & #MK_LBUTTON 
        If WindowProc_MouseSelect > 1 
          DrawMouseSelector(fffffff) 
        Else 
          WindowProc_MouseSelect + 1 
        EndIf 
          WindowProc_MouseSelectLastX = lParam&$FFFF
          WindowProc_MouseSelectLastY = (lParam>>16)&$FFFF 
        DrawMouseSelector(fffffff) 
        SetCapture_(fffffff) 
      EndIf 
      ProcedureReturn 0 
   
  EndSelect 
   
   old=GetWindowLong_(fffffff,#GWL_USERDATA) ;извлекает информацию об определяемом окне.
  If old 
    ProcedureReturn CallWindowProc_(old,fffffff,Msg,wParam,lParam) ;  передает информацию сообщения процедуре заданного окна.
  Else 
    DefWindowProc_(fffffff,Msg,wParam,lParam) ;Функция DefWindowProc вызывается оконной процедурой по умолчанию, чтобы обеспечить обработку по умолчанию любого сообщения окна, которые приложение не обрабатывает. Эта функция гарантирует то, что обрабатывается каждое сообщение. Функция DefWindowProc вызывается с теми же самыми параметрами, принятыми оконной процедурой.
  EndIf 


EndProcedure 

ProcedureDLL SelectorImage(a)

    old = SetWindowLong_(a,#GWL_WNDPROC,@WindowProc()) ; Устанавливает информацию для окна
    SetWindowLong_(a,#GWL_USERDATA,old) 
    
  ProcedureReturn ddd 
EndProcedure 

LoadImage(1,"1.bmp")

OpenWindow(0,0,0,630,630,"") 
ImageGadget(0,0,0,630,630,ImageID(1))
gad=GadgetID(0)
SelectorImage(gad)

Repeat
ev=WaitWindowEvent()

Until ev=#PB_Event_CloseWindow

0

44

И еще не могу из этого кода сделать добротную DLL. Вроде все работает пока выделяешь, но как только закрываешь окно, выскакивает ошибка. Я так понимаю стек переполняется.

Отредактировано haav (11.03.2010 09:04:11)

0

45

Наверно надо вообще отключить визуальное выделение, а прибегнуть к рисованию прямоугольников прямо по размерам из процедуры OnMouseSelection

0

46

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

И еще не могу из этого кода сделать добротную DLL. Вроде все работает пока выделяешь, но как только закрываешь окно, выскакивает ошибка.

Это наверное потому, что CallBack процедура рисунка, находится в DLLке и перед закрытием DLLки, нужно отключать эту процедуру.

Код:
ProcedureDLL SelectorImage(a)

    old = SetWindowLong_(a,#GWL_WNDPROC,@WindowProc()) ; Устанавливает информацию для окна
    SetWindowLong_(a,#GWL_USERDATA,old) 
    
  ProcedureReturn old 
EndProcedure 


ProcedureDLL SelectorFreeImage(a, old)
  SetWindowLong_(a,#GWL_WNDPROC,old) ; Устанавливает информацию для окна 
EndProcedure

0

47

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

Все выделяется, исчезает как надо, но когда начинаешь лишние разы щелкать, появляются прошлые выделенные участки, которые нафиг не нужны.

Попробуй так, вроде нормально

Код:
Procedure OnMouseSelection(fffffff,x,y,width,height) 

 Debug x
 Debug y
 Debug width
  Debug height
EndProcedure 

Procedure DrawMouseSelector(fffffff) 

  Shared WindowProc_MouseSelectStartX, WindowProc_MouseSelectLastX 
  Shared WindowProc_MouseSelectStartY, WindowProc_MouseSelectLastY 
  Shared WindowProc_MouseSelectRect.RECT 

  If WindowProc_MouseSelectStartX > WindowProc_MouseSelectLastX 
    WindowProc_MouseSelectRect\left   = WindowProc_MouseSelectLastX 
    WindowProc_MouseSelectRect\right  = WindowProc_MouseSelectStartX 
  Else 
    WindowProc_MouseSelectRect\left   = WindowProc_MouseSelectStartX 
    WindowProc_MouseSelectRect\right  = WindowProc_MouseSelectLastX 
  EndIf 
  If WindowProc_MouseSelectStartY > WindowProc_MouseSelectLastY 
    WindowProc_MouseSelectRect\top    = WindowProc_MouseSelectLastY 
    WindowProc_MouseSelectRect\bottom = WindowProc_MouseSelectStartY 
  Else 
    WindowProc_MouseSelectRect\top    = WindowProc_MouseSelectStartY 
    WindowProc_MouseSelectRect\bottom = WindowProc_MouseSelectLastY 
  EndIf 

  hDC = GetDC_(fffffff) 
  If FUN_REC=1
    InvertRect_(hDC,@WindowProc_MouseSelectRect)   ; изменяет пиксели( инвертирует)
  EndIf  
    DrawFocusRect_(hDC,@WindowProc_MouseSelectRect) ;Функция DrawFocusRect использует операцию XOR при рисовании - таким образом вывод прямоугольника дважды с одними и теми же координатами стирает прямоугольник, и прямоугольник всегда будет виден, на фоне какого бы цвета он не выводился.
    ReleaseDC_(fffffff,hDC) 

EndProcedure 


Procedure WindowProc(fffffff,Msg,wParam,lParam) 

 
  Shared WindowProc_MouseSelect 
  Shared WindowProc_MouseSelectStartX, WindowProc_MouseSelectLastX 
  Shared WindowProc_MouseSelectStartY, WindowProc_MouseSelectLastY 
  Shared WindowProc_MouseSelectRect.RECT 

  Select Msg 
  
    Case #WM_LBUTTONDOWN 
         DrawMouseSelector(fffffff)
         WindowProc_MouseSelect  = 1 
         WindowProc_MouseSelectStartX = lParam&$FFFF  ; определяют любое расстояние  по оси Х (без нее все время будет от нуля)
         WindowProc_MouseSelectStartY = (lParam>>16)&$FFFF  ; определяют любое расстояние  по оси Y (без нее все время будет от нуля)
         ;ZeroMemory_(@WindowProc_MouseSelectRect, SizeOf(RECT))
         GetClientRect_(fffffff,winrect.RECT) 
         MapWindowPoints_(fffffff,0,winrect,2)  ;преобразует (отображает) ряд точек относительно координатного пространства одного окна  относительно координатного пространства другого окна.
         ClipCursor_(winrect)          ;ограничитель курсора в рамке окна
       ProcedureReturn 0 
    Case #WM_LBUTTONUP 
      If WindowProc_MouseSelect > 1 
        
         ;DrawMouseSelector(fffffff)  ; отлючив ее инвертация(изображение) остается
     
        If WindowProc_MouseSelectRect\left <> WindowProc_MouseSelectRect\right And WindowProc_MouseSelectRect\top <> WindowProc_MouseSelectRect\bottom 
         OnMouseSelection(fffffff,WindowProc_MouseSelectRect\left,WindowProc_MouseSelectRect\top,WindowProc_MouseSelectRect\right-WindowProc_MouseSelectRect\left,WindowProc_MouseSelectRect\bottom-WindowProc_MouseSelectRect\top) 
         SetCapture_(0) ;устанавливает захват мыши в заданном окне, принадлежащем текущему потоку.
        EndIf 
      Else
        ZeroMemory_(@WindowProc_MouseSelectRect, SizeOf(RECT))
        WindowProc_MouseSelectStartX=0
        WindowProc_MouseSelectStartY=0
        WindowProc_MouseSelectLastX=0
        WindowProc_MouseSelectLastY=0
      EndIf 
      ClipCursor_(0) 
      WindowProc_MouseSelect = 0 
      ProcedureReturn 0 
 
    Case #WM_MOUSEMOVE   
      If WindowProc_MouseSelect > 0 And wParam & #MK_LBUTTON 
        If WindowProc_MouseSelect > 1 
          DrawMouseSelector(fffffff) 
        Else 
          WindowProc_MouseSelect + 1 
        EndIf 
          WindowProc_MouseSelectLastX = lParam&$FFFF
          WindowProc_MouseSelectLastY = (lParam>>16)&$FFFF 
        DrawMouseSelector(fffffff) 
        SetCapture_(fffffff) 
      EndIf 
      ProcedureReturn 0 
   
  EndSelect 
   
   old=GetWindowLong_(fffffff,#GWL_USERDATA) ;извлекает информацию об определяемом окне.
  If old 
    ProcedureReturn CallWindowProc_(old,fffffff,Msg,wParam,lParam) ;  передает информацию сообщения процедуре заданного окна.
  Else 
    DefWindowProc_(fffffff,Msg,wParam,lParam) ;Функция DefWindowProc вызывается оконной процедурой по умолчанию, чтобы обеспечить обработку по умолчанию любого сообщения окна, которые приложение не обрабатывает. Эта функция гарантирует то, что обрабатывается каждое сообщение. Функция DefWindowProc вызывается с теми же самыми параметрами, принятыми оконной процедурой.
  EndIf 


EndProcedure 

ProcedureDLL SelectorImage(a)

    old = SetWindowLong_(a,#GWL_WNDPROC,@WindowProc()) ; Устанавливает информацию для окна
    SetWindowLong_(a,#GWL_USERDATA,old) 
    
  ProcedureReturn ddd 
EndProcedure 

LoadImage(1,"1.bmp")

OpenWindow(0,0,0,630,630,"") 
ImageGadget(0,0,0,630,630,ImageID(1))
gad=GadgetID(0)
SelectorImage(gad)

Repeat
ev=WaitWindowEvent()

Until ev=#PB_Event_CloseWindow

0

48

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

Попробуй так, вроде нормально

Это конечно намного лучше моего, но все же остается этот баг, одно окошко лишнее, после того как делаешь неактивным(свертываешь к примеру) нужное окошко, а потом опять пытаешься выделить рисует два. Да ладно Петр, спасибо тебе большое, я уже делаю как написал в посте 45. А к посту 46 вернусь через некоторое время, когда доделаю редактор. Надо все таки библиотеку сделать на будующее, чтобы лишний раз не лазить в этот код.

0

49

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

Надо все таки библиотеку сделать на будующее, чтобы лишний раз не лазить в этот код

Так собираешься делать DLLку или библиотеку функций для пурика?

0

50

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

Так собираешься делать DLLку или библиотеку функций для пурика?

Да без разницы, что получится. У меня в прошлый раз библиотека вообще не скомпилировалась, а c dll вылезала ошибка при закрытии приложения. Библиотеку для себя, ну и для тех кто на пурике кодит, а dll можно для других языков скомпилить.

0

51

Это немного не в эту тему:

Где то видел простой способ на кнопки стандартные рисунки надевать(OPEN,SAVE  и т д)
Мне OPEN нужен для кнопки

0

52

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

Где то видел простой способ на кнопки стандартные рисунки надевать(OPEN,SAVE  и т д)

Может с тулбаром спутал?

Можно так сделать

Код:
Structure IconButton 
  oldWndProc.l 
  icon.l 
EndStructure 
#BS_LEFT         =    $00000100 
#BS_RIGHT        =    $00000200 
#BS_TOP          =    $00000400 
#BS_BOTTOM       =    $00000800 

#DI_NORMAL       =    $00000003 

#iconsize        =    16 

Procedure DrawIconOnButton(hWnd,*p.IconButton,clicked) 
  hDC = GetDC_(hWnd) 
  GetClientRect_(hWnd,rect.RECT) 
  style = GetWindowLong_(hWnd,#GWL_STYLE) 
  If style & #BS_LEFT 
    x = rect\right - 10 - #iconsize 
    y = rect\bottom/2 - #iconsize/2 
  ElseIf style & #BS_RIGHT 
    x = 10 
    y = rect\bottom/2 - #iconsize/2 
  ElseIf style & #BS_TOP 
    x = rect\right/2 - #iconsize/2 
    y = rect\bottom - 5 - #iconsize 
  ElseIf style & #BS_BOTTOM 
    x = rect\right/2 - #iconsize/2 
    y = 5 
  EndIf 
  If clicked 
    x+1 
    y+1 
  EndIf 
  If GetWindowLong_(hWnd,#GWL_STYLE) & #WS_DISABLED 
    DrawState_(hDC,GetStockObject_(#LTGRAY_BRUSH),0,*p\icon,0,x+1,y+1,#iconsize,#iconsize,#DST_ICON|#DSS_MONO) 
    DrawState_(hDC,GetStockObject_(#GRAY_BRUSH)  ,0,*p\icon,0,x  ,y  ,#iconsize,#iconsize,#DST_ICON|#DSS_MONO) 
  Else 
    DrawIconEx_(hDC,x,y,*p\icon,#iconsize,#iconsize,1,0,#DI_NORMAL) 
  EndIf 
  ReleaseDC_(hWnd,hDC) 
EndProcedure 


Procedure IconButtonProc(hWnd,Msg,wParam,lParam) 
  *p.IconButton = GetWindowLong_(hWnd,#GWL_USERDATA) 
  If *p 
    If *p\oldWndProc 
      retval = CallWindowProc_(*p\oldWndProc,hWnd,Msg,wParam,lParam) 
      If Msg = #WM_PAINT And *p\icon 
        state = SendMessage_(hWnd,#BM_GETSTATE,0,0) 
        If state = #BST_CHECKED Or state=#BST_PUSHED 
          clicked=1 
        EndIf 
        DrawIconOnButton(hWnd,*p,clicked) 
      ElseIf Msg = #WM_LBUTTONDOWN Or Msg = #WM_LBUTTONDBLCLK 
        DrawIconOnButton(hWnd,*p,1) 
      ElseIf Msg = #WM_LBUTTONUP 
        DrawIconOnButton(hWnd,*p,0) 
      ElseIf Msg = #WM_MOUSEMOVE And wParam = #MK_LBUTTON 
        GetWindowRect_(hWnd,rect.RECT) 
        GetCursorPos_(pt.POINT) 
        If PtInRect_(@rect,pt\x|(pt\y<<32)) 
          clicked = 1 
        EndIf 
        DrawIconOnButton(hWnd,*p,clicked) 
      EndIf 
      ProcedureReturn retval 
    EndIf 
  EndIf 
  ProcedureReturn DefWindowProc_(hWnd,Msg,wParam,lParam) 
EndProcedure 


Procedure IconButtonGadget(Gadget,x,y,w,h,text$,icon,flags) 
  btn = ButtonGadget(Gadget,x,y,w,h,text$,flags) 
  If btn 
    *p.IconButton = AllocateMemory(SizeOf(IconButton)) 
    If *p 
      SetWindowLong_(GadgetID(Gadget),#GWL_USERDATA,*p) 
      *p\icon       = icon 
      *p\oldWndProc = SetWindowLong_(GadgetID(Gadget),#GWL_WNDPROC,@IconButtonProc()) 
    Else 
      FreeGadget(Gadget) 
      btn=0 
    EndIf 
  EndIf 
  ProcedureReturn btn 
EndProcedure 

SystemPath.s=Space(255)
Result=GetSystemDirectory_(SystemPath.s,255)

OpenWindow(0,0,0,140,80,"",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
 IconButtonGadget(0,20,20,80,24,"Кнопка  ",ExtractIcon_(0,SystemPath+"\SetupAPI.dll",4),#BS_RIGHT) 
Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow

0

53

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

Может с тулбаром спутал?

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

Вот это мне надо было(из архива):

Код:
SystemPath.s=Space(255) 
Result=GetSystemDirectory_(SystemPath.s,255) 

OpenWindow(0,0,0,237,50,"Icon-Test",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) 

If CreateGadgetList(WindowID(0)) 
For a=0 To 5 
  ButtonImageGadget(a,10+a*36,10,36,36,ExtractIcon_(0,SystemPath+"\SetupAPI.dll",a)) 
Next 
EndIf 

Repeat : Until WindowEvent()=#PB_Event_CloseWindow 

End

Отредактировано haav (12.03.2010 19:38:05)

0

54

Подсажите как правильно вложить в ".ехе" файл формата ".gif ",  для отображения в вебгаджете.

Код:
OpenWindow(1,0,0,230,230,"",#PB_Window_ScreenCentered) 
CreateGadgetList(WindowID(1)) 
; WebGadget(0,0,0,350,350,"C:\2.gif") 
WebGadget(0,0,0,350,350, CatchImage(2, ?Kartinka_Okna_File))
Repeat 
Until WaitWindowEvent()=#PB_Event_CloseWindow 
DataSection 
Kartinka_Okna_File: 
IncludeBinary "C:\2.gif"  
Kartinka_Okna_FileEnd: 
EndDataSection

Если закоментировать 4-ю строчку и раскоментировать 3-ю, работает ,а мне нужно засунуть картинку в ".ехе"

0

55

Команда  CatchImage  не поддерживает формат GIF. Поэтому файл надо как то временно вытащить из EXE на диск, а потом уже запустить как обычно, а далее удалить этот файл.

0

56

Вот так получилось, спасибо haav

Код:
  If CreateFile(0, "C:\22.gif")           ; we create a new text file...
    WriteData(0, ?Kartinka_Okna_File, ?Kartinka_Okna_FileEnd-?Kartinka_Okna_File)          ; write the first 10 chars from the memory block into the file
    CloseFile(0)                         ; close the previously opened file and so store the written data 
  Else
    Debug "Can't create the file!"
  EndIf
OpenWindow(1,0,0,230,230,"",#PB_Window_ScreenCentered | #PB_Window_SystemMenu) 
CreateGadgetList(WindowID(1)) 
WebGadget(0,0,0,350,350,"C:\22.gif") 
; WebGadget(0,0,0,350,350, CatchImage(2, ?Kartinka_Okna_File))
Repeat 
Until WaitWindowEvent()=#PB_Event_CloseWindow 
DeleteFile("C:\22.gif")
DataSection 
Kartinka_Okna_File: 
IncludeBinary "C:\2.gif"  
Kartinka_Okna_FileEnd: 
EndDataSection

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Просмотрщик фотографий