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 попробовать