OpenFileRequester() для выбора картинок
Сообщений 1 страница 9 из 9
Поделиться229.12.2020 21:19:15
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 Поделиться331.12.2020 10:29:46
Пётр, спасибо
незнал что оно в примерах есть
Поделиться431.12.2020 15:30:21
здесь +6, а не +4, лезет мусор, а в описании сказано, что всё должно завершаться парой стоп байт
*Pattern = AllocateMemory(StringByteLength(Part1+Part2)+4)
Поделиться502.01.2021 15:26:35
если дать маленький буфер под имена файлов, то просто валится, а не возвращает ошибку
здесь вылет с переполнением памяти
n=GetOpenFileName_(@of)
а должно возвращать #FNERR_BUFFERTOOSMALL
если хватило, то в буфере всё лежит как написано
ну и как правильно определить размер буфера при выборе энного количества файлов?
Поделиться602.01.2021 21:09:06
А какой смысл в таком диалоге, если и так видно картинку при простой настройке в 1 клик?
Поделиться703.01.2021 06:15:36
а с чего ты решил что у всех этот режим включен?
ты бы не напомнил, я бы и не вспомнил о его существованиии
лучше на вопрос ответь, как считать
Поделиться803.01.2021 11:08:51
а с чего ты решил что у всех этот режим включен?
Я же написал, что включается в пару кликов, проще уже некуда, тем более, что в 10-ке у меня сразу работает именно так.
лучше на вопрос ответь, как считать
Не знаю. Я запустил, сам видишь, работает криво, если включено увеличение 1.25. А на современных больших мониторах с разрешением от FullHD и лучше, у многих включен режим увеличения.
При включении поддержки DPI картинка перестаёт влазить в диалог. Нужны танцы с бубном для нормального отображения во всех режимах монитора, а смысла не вижу - код писался ещё для WinXP, там да, нормально было. А сейчас win 10, по дефолту, или всего пару кликов мышкой 
Поделиться905.01.2021 05:55:28
Я же написал, что включается в пару кликов, проще уже некуда
речь не об паре кликов, а о нежелании людей использовать этот режим
мой скрин из прошлогоднего редактора, как видишь сегодня это делают, Aha-soft делает линейку графических программ
этот фокус не только для картинок, очень много чего можно впихнуть, и не только справа, но и снизу, и размеры в разумных пределах свои
так что это про возможность вывести некую дополнительную инфу
Не знаю. Я запустил, сам видишь, работает криво, если включено увеличение 1.25
ну так исходник в лоб написан, потому и криво
я всё это дело уже переписал, в семёрке вроде нормально, морда совершенно другая, а старше семёрки у меня нет
надо будет с DPI попробовать
