PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » OpenFileRequester() для выбора картинок


OpenFileRequester() для выбора картинок

Сообщений 1 страница 9 из 9

1

как показывать картинку выбранного файла в этом окне?

http://forumuploads.ru/uploads/0009/ae/28/416/t531563.png

0

2

http://www.purearea.net/pb/CodeArchiv/R … Preview.pb

Код:
UseTIFFImageDecoder() 
UseJPEGImageDecoder() 
UseTGAImageDecoder() 
UsePNGImageDecoder() 

#OpenFileButtonGadget = 10 
#QuitButtonGadget = 20

#CDN_FIRST = (-601) 
#CDN_SELCHANGE = (#CDN_FIRST - 1)   

Procedure OFHookProc(hdlg,uiMsg,wParam,lParam) 
  ;hier wird der Dialog manipuliert 
  Shared newwidth.l,newheight.l,Image.l 
  Result = #False 
  Select uiMsg 
    Case #WM_NOTIFY 
      *of.OFNOTIFY = lParam 
      If *of\hdr\code = #CDN_SELCHANGE;neue Auswahl 
        Buffer$ = Space(260) 
        SendMessage_(GetParent_(hdlg),#CDM_GETFILEPATH,260,Buffer$);Filename und Pfad auslesen 
        SetCursor_(LoadCursor_(0,#IDC_WAIT)) 
        Image = LoadImage(0,Buffer$);Bild laden und Grцsse fьr Vorschau berechnen 
        If Image <> 0 
          width = ImageWidth(0) 
          height = ImageHeight(0) 
          If width > 200 Or height > 200 
            f.f = width / height 
            If width > 200 
              newwidth = 200 
              newheight = newwidth/f 
            EndIf 
            If newheight > 200 
              newheight = 200 
              newwidth  = newheight*f 
            EndIf 
          Else 
            newwidth = width 
            newheight = height 
          EndIf 
          ImageX = 520 - newwidth/2 
          ImageY = 130 - newheight/2 
          ResizeImage(0, newwidth,newheight);Bild neu dimensionieren 
          StartDrawing(ImageOutput(1))
          Box(0,0,200,200,0)
          DrawImage(ImageID(0),(200-newwidth)/2 ,(200-newheight)/2) 
          StopDrawing()
          SetGadgetState(2,ImageID(1))
          SetGadgetText(1,Str(width)+" X "+Str(height)+" Pixel") 
          RedrawWindow_(GadgetID(2),0,0,#RDW_INVALIDATE) 
          SetCursor_(LoadCursor_(0,#IDC_ARROW)) 
        Else
          StartDrawing(ImageOutput(1)) 
          FrontColor(RGB(0,0,0)) 
          FillArea(1,1,1) 
          LineXY(0,0,200,200,RGB(255,0,0)) 
          LineXY(0,200,200,0,RGB(255,0,0)) 
          FrontColor(RGB(255,255,255)) 
          BackColor(RGB(0,0,0)) 
          DrawText(50,90,"keine Vorschau") 
          StopDrawing() 
          ImageX = 520 -100 
          ImageY = 130 -100 
          SetGadgetState(2,ImageID(1))
          SetGadgetText(1,"") 
          RedrawWindow_(GadgetID(2),0,0,#RDW_INVALIDATE) 
        EndIf 
      EndIf  
      Result = #True 
    Case #WM_INITDIALOG 
      ;Dialog erweitern 
      GetWindowRect_(GetParent_(hdlg),wr.RECT) 
      GetWindowRect_(GetDesktopWindow_(),wr1.RECT) 
      MoveWindow_(GetParent_(hdlg),wr1\right/2-(wr\right+210)/2,wr1\bottom/2-(wr\bottom)/2,wr\right+210,wr\bottom,#True) 
      ;CreateGadgetList(GetParent_(hdlg)) 
      UseGadgetList(GetParent_(hdlg))
      TextGadget(0,417,6,206,20," Vorschau :",#PB_Text_Border) 
      TextGadget(1,417,234,206,20,"",#PB_Text_Border|#PB_Text_Center) 
      FrameGadget(3, 417,27,206,205,"",#PB_Frame_Double)
      ImageGadget(2, 420, 30, 200,200,0) 
      CreateImage(1,200,200)
      Result = #True 
  EndSelect 
  ProcedureReturn Result 
EndProcedure 

Procedure.s PB_OpenFile() 
  ;OPENFILENAME-Struktur fьllen 
  *FileBuffer = AllocateMemory(#MAX_PATH) 
  Result.s = "" 
  Part1.s = "all supported Files" 
  Part2.s = "*.bmp;*jpg;*tif;*tga;*png" 
  *Pattern = AllocateMemory(StringByteLength(Part1+Part2)+4) 
  PokeS(*Pattern,Part1) 
  PokeS(*Pattern+(StringByteLength(Part1)+2),Part2) 
  of.OPENFILENAME 
  of\lStructSize = SizeOf(OPENFILENAME) 
  of\flags = #OFN_EXPLORER|#OFN_ENABLEHOOK 
  of\lpstrFilter = *Pattern 
  of\nMaxFile = #MAX_PATH 
  of\lpstrFile = *FileBuffer 
  of\lpfnHook = @OFHookProc() 
  If GetOpenFileName_(of);Dialog aufrufen 
    Result = PeekS(*FileBuffer);wenn OK dann Filenamen auslesen 
  EndIf  
  FreeMemory(*Pattern) 
  FreeMemory(*FileBuffer) 
  ProcedureReturn Result 
EndProcedure 

If OpenWindow(0,0,0,270,220,"Preview-Sample",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  ButtonGadget(#OpenFileButtonGadget, 10, 10,80,20,"OpenFile") 
  ButtonGadget(#QuitButtonGadget, 10, 40,80,20,"Quit") 
  Repeat 
    EventID.l = WaitWindowEvent() 
    If EventID = #PB_Event_Gadget 
      Select EventGadget() 
        Case #OpenFileButtonGadget 
          opf.s = PB_OpenFile() 
          If opf 
            MessageRequester("File :",opf,0) 
          EndIf 
        Case #QuitButtonGadget 
          SendMessage_(WindowID(0),#WM_CLOSE,0,0) 
      EndSelect  
    EndIf    
  Until EventID = #PB_Event_CloseWindow 
EndIf 

+1

3

Пётр, спасибо
незнал что оно в примерах есть

0

4

здесь +6, а не +4, лезет мусор, а в описании сказано, что всё должно завершаться парой стоп байт

Код:
 *Pattern = AllocateMemory(StringByteLength(Part1+Part2)+4) 

0

5

если дать маленький буфер под имена файлов, то просто валится, а не возвращает ошибку
здесь вылет с переполнением памяти
n=GetOpenFileName_(@of)
а должно возвращать #FNERR_BUFFERTOOSMALL
если хватило, то в буфере всё лежит как написано

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

0

6

А какой смысл в таком диалоге, если и так видно картинку при простой настройке в 1 клик?
http://s01.geekpic.net/di-QOP5SM.png

0

7

а с чего ты решил что у всех этот режим включен?
ты бы не напомнил, я бы и не вспомнил о его существованиии

лучше на вопрос ответь, как считать

0

8

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

а с чего ты решил что у всех этот режим включен?

Я же написал, что включается в пару кликов, проще уже некуда, тем более, что в 10-ке у меня сразу работает именно так.

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

лучше на вопрос ответь, как считать

Не знаю. Я запустил, сам видишь, работает криво, если включено увеличение 1.25. А на современных больших мониторах с разрешением от FullHD и лучше, у многих  включен режим увеличения.
При включении поддержки DPI картинка перестаёт влазить в диалог. Нужны танцы с бубном для нормального отображения во всех режимах монитора, а смысла не вижу - код писался ещё для WinXP, там да, нормально было. А сейчас win 10, по дефолту, или  всего пару кликов мышкой :)

0

9

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

Я же написал, что включается в пару кликов, проще уже некуда

речь не об паре кликов, а о нежелании людей использовать этот режим
мой скрин из прошлогоднего редактора, как видишь сегодня это делают, Aha-soft делает линейку графических программ
этот фокус не только для картинок, очень много чего можно впихнуть, и не только справа, но и снизу, и размеры в разумных пределах свои
так что это про возможность вывести некую дополнительную инфу

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

Не знаю. Я запустил, сам видишь, работает криво, если включено увеличение 1.25

ну так исходник в лоб написан, потому и криво
я всё это дело уже переписал, в семёрке вроде нормально, морда совершенно другая, а старше семёрки у меня нет
надо будет с DPI попробовать

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » OpenFileRequester() для выбора картинок