-- NFO Window Class NFOWindowClass = { windowCaption = 'NFOWindow by mgr.inz.Player', fontSize = 12, scrollLines = 9, nfoTEXT = nil, lineWidth, lineHeight, totalHeight, scrollDistance, CW, CH, Form, Button, PaintBox, Bitmap, DestY, currentY, objects = {} } function NFOWindowClass.Destroy() --destroy hotkeys and timers for i,v in pairs(NFOWindowClass.objects) do object_destroy(v) NFOWindowClass.objects[i] = nil end object_destroy(NFOWindowClass.Bitmap) if NFOWindowClass.Form~=nil then NFOWindowClass.Form.hide() object_destroy(NFOWindowClass.Form) NFOWindowClass.Form = nil end end function NFOWindowClass.Init(arg) if arg.nfo==nil then arg.nfo = NFOWindowClass.authorNFO end -- set variables NFOWindowClass.windowCaption = arg.windowCaption or NFOWindowClass.windowCaption NFOWindowClass.fontSize = arg.fontSize or NFOWindowClass.fontSize NFOWindowClass.scrollLines = arg.scrollLines or NFOWindowClass.scrollLines -- PREPARE nfoTEXT table NFOWindowClass.nfoTEXT = {} table.insert(NFOWindowClass.nfoTEXT,ansiToUtf8(' ')) local longestLine = '' for w in string.gfind (arg.nfo,"[^\n]+") do table.insert(NFOWindowClass.nfoTEXT,ansiToUtf8(w)) if #longestLine < #w then longestLine = w end end table.insert(NFOWindowClass.nfoTEXT,ansiToUtf8(' ')) table.insert(NFOWindowClass.nfoTEXT,ansiToUtf8(' ')) -- DETERMINE line width, line height, total height local tmpImage = createImage(nil) tmpImage.Canvas.Font.Name = 'Terminal' tmpImage.Canvas.Font.Size = NFOWindowClass.fontSize setProperty(tmpImage.Canvas.Font,'CharSet','OEM_CHARSET') NFOWindowClass.lineWidth = tmpImage.Canvas.getTextWidth (longestLine..' ') NFOWindowClass.lineHeight = tmpImage.Canvas.getTextHeight(longestLine..' ') NFOWindowClass.totalHeight = NFOWindowClass.lineHeight * (#NFOWindowClass.nfoTEXT) NFOWindowClass.scrollDistance = NFOWindowClass.lineHeight * NFOWindowClass.scrollLines object_destroy(tmpImage);tmpImage=nil -- DETERMINE window size local windowMaximumHeight = arg.windowMaximumHeight or 600 NFOWindowClass.CW = NFOWindowClass.lineWidth + 10 NFOWindowClass.CH = (NFOWindowClass.totalHeight > windowMaximumHeight) and windowMaximumHeight or NFOWindowClass.totalHeight if NFOWindowClass.CW < 200 then NFOWindowClass.CW=200 end --assign event to given button if arg.Button then arg.Button.Enabled = true arg.Button.OnClick = NFOWindowClass.ShowWindow NFOWindowClass.Button = arg.Button end end function NFOWindowClass.ButtonSetEnabled(enabled) if NFOWindowClass.Button~=nil then NFOWindowClass.Button.Enabled = enabled end end function NFOWindowClass.ShowWindow(senderButton) NFOWindowClass.ButtonSetEnabled(false) NFOWindowClass.Destroy() -- destroy if any left -- MAIN WINDOW ATTRIBUTES, CAPTION and EVENTS local NFOFORM = createForm(false) NFOFORM.setSize(NFOWindowClass.CW, NFOWindowClass.CH) NFOFORM.Caption = NFOWindowClass.windowCaption NFOFORM.Borderstyle = 'bsToolWindow' NFOFORM.Position = 'poScreenCenter' NFOFORM.DoubleBuffered = true NFOFORM.OnClose = function (sender) NFOWindowClass.ButtonSetEnabled(true) -- enable button NFOWindowClass.Destroy() end -- ESC key to exit setMethodProperty(NFOFORM,'OnKeyPress', function (sender, key) if string.byte(key) == 27 then NFOWindowClass.ButtonSetEnabled(true) -- enable button NFOWindowClass.Destroy() end end) local rainbowColors = { 0x00000000,0x00000000,0x00000006,0x0000000E,0x00000016,0x00000020,0x0000002A,0x00000035, 0x00000040,0x0000004D,0x0000005B,0x00000068,0x00000076,0x00000083,0x00000091,0x0000009D, 0x000000AB,0x000000B7,0x000000C3,0x000000CF,0x000000DA,0x000000E5,0x000000ED,0x000000F5, 0x000000FC,0x000002FF,0x000006FF,0x00000CFF,0x000012FF,0x000019FF,0x000020FF,0x000028FF, 0x000030FF,0x000038FF,0x000042FF,0x00004AFF,0x000054FF,0x00005DFF,0x000068FF,0x000071FF, 0x00007CFF,0x000086FF,0x00008FFF,0x00009AFF,0x0000A3FF,0x0000ADFF,0x0000B6FF,0x0000C0FF, 0x0000C8FF,0x0000D1FF,0x0000D8FF,0x0000E0FF,0x0000E7FF,0x0000EDFF,0x0000F3FF,0x0000F8FF, 0x0000FCFF,0x0001FFFA,0x0003FFF5,0x0004FFF0,0x0005FFEA,0x0007FFE3,0x0008FFDC,0x000BFFD5, 0x000CFFCD,0x000EFFC5,0x0010FFBD,0x0012FFB4,0x0014FFAB,0x0016FFA2,0x0018FF98,0x001BFF8E, 0x001CFF85,0x001FFF7C,0x0022FF72,0x0024FF68,0x0026FF5F,0x0029FF57,0x002CFF4D,0x002FFF44, 0x0033FF3C,0x0035FF34,0x0038FF2C,0x003BFF24,0x003FFF1D,0x0042FF17,0x0046FF10,0x0049FF0B, 0x004DFF06,0x0050FF02,0x0054FE00,0x0058FE00,0x005DFF00,0x0061FE00,0x0065FE00,0x006AFE00, 0x006FFE00,0x0075FD00,0x007AFD00,0x007FFE00,0x0085FD00,0x008BFD00,0x0091FD00,0x0097FC00, 0x009CFD00,0x00A2FD00,0x00A9FD00,0x00AFFC00,0x00B7FB00,0x00BFFB00,0x00C8FA00,0x00D1F900, 0x00D9F800,0x00E0F600,0x00E6F500,0x00ECF200,0x00F3F000,0x00F8EE00,0x00FCEC00,0x00FFE901, 0x00FFE507,0x00FFE10D,0x00FFDD14,0x00FFD71C,0x00FFD224,0x00FFCD2C,0x00FFC737,0x00FFC240, 0x00FFBC4A,0x00FFB754,0x00FFB359,0x00FFB05F,0x00FFAC65,0x00FFA86A,0x00FFA66F,0x00FFA275, 0x00FF9F7B,0x00FF9B80,0x00FF9785,0x00FF948B,0x00FF918F,0x00FF8E94,0x00FF8A99,0x00FF879D, 0x00FF83A1,0x00FF80A6,0x00FF7DAA,0x00FF7AAD,0x00FF77B0,0x00FE73B5,0x00FD6FBA,0x00FC6ABE, 0x00FC67C3,0x00FA62C7,0x00FA5ECC,0x00F85AD0,0x00F755D4,0x00F751D9,0x00F64CDD,0x00F448E2, 0x00F443E7,0x00F23EEB,0x00F13AEE,0x00EF35F1,0x00ED30F7,0x00EA29FB,0x00E823FF,0x00E41DFF, 0x00E117FF,0x00DD12FF,0x00D80DFF,0x00D309FF,0x00CF05FF,0x00C902FF,0x00C300FD,0x00BD00F7, 0x00B600F0,0x00AE00E8,0x00A600DF,0x009C00D5,0x009400C9,0x008A00BD,0x008000B0,0x007700A4, 0x006C0096,0x00620088,0x0057007A,0x004D006C,0x0044005E,0x00390050,0x00310043,0x00280037, 0x001F002B,0x00180020,0x00100017,0x000B000D,0x00050006,0x00000000,0x00000000,0x00000000} local customColors = { 0x00000000,0x00060600,0x000E0C00,0x00171300,0x00221C00,0x002D2500,0x003A2F00,0x00473900, 0x00554500,0x00634F00,0x00725C00,0x00816800,0x00907400,0x009E7F00,0x00AC8C00,0x00B99700, 0x00C6A400,0x00D2AE00,0x00DDB900,0x00E7C400,0x00EFCD00,0x00F5D600,0x00FADD00,0x00FEE400, 0x00FFEA00,0x00FFEE04,0x00FCF109,0x00FAF410,0x00F6F717,0x00F1FA1E,0x00EBFC27,0x00E3FC30, 0x00DCFC39,0x00D3FC43,0x00CBFC4E,0x00C1FC58,0x00B8FC63,0x00ADFC6E,0x00A2FC79,0x0097FC84, 0x008CFC8F,0x0081FC9A,0x0076FCA4,0x006AFCAF,0x005FFCB9,0x0054FCC3,0x004AFCCC,0x003FFCD5, 0x0036FCDD,0x002CFCE5,0x0024FCEB,0x001CFCF1,0x0015FCF6,0x000EFCFA,0x0008FCFC,0x0004FCFF, 0x0000FCFF,0x0000FCFE,0x0000F9FD,0x0000F8FB,0x0000F7F7,0x0000F5F3,0x0000F3EE,0x0000F1E8, 0x0000EEE0,0x0000ECDA,0x0000E9D1,0x0000E7C9,0x0000E5C0,0x0000E1B7,0x0000DEAE,0x0000DBA4, 0x0000D99A,0x0000D690,0x0003D386,0x0005D07B,0x0008CD71,0x000BCA66,0x000EC85C,0x0012C552, 0x0014C349,0x0019C03E,0x001BBE36,0x0020BC2D,0x0023BB25,0x0026B91E,0x002BB716,0x002FB60F, 0x0032B50A,0x0036B405,0x003AB401,0x003EB400,0x0041B400,0x0046B500,0x004BB500,0x0050B600, 0x0055B800,0x005AB900,0x005FBA00,0x0066BC00,0x006CBE00,0x0072C000,0x0079C200,0x007FC400, 0x0086C600,0x008BC900,0x0092CB00,0x0099CD00,0x00A0D000,0x00A9D300,0x00B4D700,0x00BDDA00, 0x00C7DD00,0x00D0E100,0x00D8E300,0x00E0E500,0x00E8E700,0x00EFE900,0x00F5EA00,0x00FAEA00, 0x00FFEA00,0x00FFE900,0x00FFE700,0x00FFE500,0x00FFE200,0x00FFDE00,0x00FFDA00,0x00FFD500, 0x00FFD000,0x00FFCB00,0x00FFC700,0x00FFC200,0x00FFC000,0x00FFBD00,0x00FFBA00,0x00FFB700, 0x00FFB400,0x00FFB100,0x00FFAE00,0x00FFAC00,0x00FFA900,0x00FFA700,0x00FFA400,0x00FFA200, 0x00FFA000,0x00FF9E00,0x00FF9C00,0x00FF9A00,0x00FF9800,0x00FF9800,0x00FF9600,0x00FE9405, 0x00FE940A,0x00FF9311,0x00FE9318,0x00FF9220,0x00FF9229,0x00FF9232,0x00FF923C,0x00FF9346, 0x00FF9351,0x00FF945C,0x00FF9567,0x00FF9572,0x00FF967D,0x00FF9689,0x00FF9697,0x00FF96A7, 0x00FF96B7,0x00FE96C5,0x00FD96D4,0x00FC96DF,0x00F896EB,0x00F596F3,0x00F196F9,0x00EC95FD, 0x00E691FF,0x00E18DFE,0x00DA8AFB,0x00D285F6,0x00CA7FEF,0x00C07AE6,0x00B673DD,0x00AB6CD2, 0x00A066C6,0x00945EB9,0x008957AC,0x007D4F9E,0x00714890,0x00654080,0x005A3972,0x004F3263, 0x00442B55,0x00382447,0x002E1E3A,0x0024172D,0x001B1122,0x00130C16,0x000C080E,0x00000000} -- CREATE NICE RAINBOW local rainbowImage = createImage(NFOFORM) rainbowImage.setSize(1,200) rainbowImage.align = 'alClient' rainbowImage.Stretch = true for i=1,200 do rainbowImage.Canvas.setPixel(0,i-1,rainbowColors[i]) end -- CREATE PAINTBOX FOR NFO TEXT local PaintBox = createPaintBox(NFOFORM) PaintBox.align = 'alClient' -- create bitmap local txtBmp = createBitmap(NFOWindowClass.CW, NFOWindowClass.totalHeight) txtBmp.TransparentColor = 0x800080 txtBmp.Transparent = true -- set canvas Font txtBmp.Canvas.Font.Name = 'Terminal' txtBmp.Canvas.Font.Size = NFOWindowClass.fontSize txtBmp.Canvas.Font.Color = 0x800080 setProperty(txtBmp.Canvas.Font,'CharSet','OEM_CHARSET') -- set canvas Brush color txtBmp.Canvas.Brush.Color = 0x000000 -- draw text for i=1,#NFOWindowClass.nfoTEXT do local Y = NFOWindowClass.lineHeight*(i-1) txtBmp.Canvas.textOut(5,Y,NFOWindowClass.nfoTEXT[i]) end PaintBox.OnPaint = NFOWindowClass.paintstate PaintBox.repaint() setMethodProperty(PaintBox,'OnMouseDown', function () form_dragNow(NFOFORM) end) -- drag form NFOFORM.show() local scrollTimer = createTimer(NFOFORM,false) scrollTimer.OnTimer = NFOWindowClass.scrollOnTimer scrollTimer.Interval = 10 -- hotkeys local hk1 = createHotkey(NFOWindowClass.scrollUp , VK_PRIOR ) local hk2 = createHotkey(NFOWindowClass.scrollDown, VK_NEXT ) setMethodProperty(PaintBox,'OnMouseWheelDown',NFOWindowClass.scrollDown) setMethodProperty(PaintBox,'OnMouseWheelUp',NFOWindowClass.scrollUp) NFOWindowClass.Form = NFOFORM NFOWindowClass.PaintBox = PaintBox NFOWindowClass.Bitmap = txtBmp NFOWindowClass.DestY = 0 NFOWindowClass.currentY = 0 NFOWindowClass.objects['hotkey1'] = hk1 NFOWindowClass.objects['hotkey2'] = hk2 NFOWindowClass.objects['timer'] = scrollTimer end function NFOWindowClass.paintstate(sender) --sender.Canvas.draw(0,NFOWindowClass.currentY,NFOWindowClass.Bitmap) local r=sender.Canvas.getClipRect() -- sender.Canvas.copyRect(r.Left, r.Top, -- dest -- r.Right, r.Bottom, -- dest -- NFOWindowClass.Bitmap.Canvas, -- source -- r.Left, r.Top - NFOWindowClass.currentY, -- source -- r.Right, r.Bottom - NFOWindowClass.currentY) -- source sender.Canvas.drawWithMask(r.Left, r.Top, -- dest r.Right, r.Bottom, -- dest NFOWindowClass.Bitmap, -- source r.Left, r.Top - NFOWindowClass.currentY, -- source r.Right, r.Bottom - NFOWindowClass.currentY) -- source -- CAUTION: Canvas.drawWithMask is from custom CE6.2+ Build only if NFOWindowClass.CW==NFOWindowClass.CH then return else -- draw bar local cw = NFOWindowClass.CW local ch = NFOWindowClass.CH local th = NFOWindowClass.totalHeight local y = NFOWindowClass.currentY local height = ch*ch/th local top = (ch-height)*(y/(ch-th)) -- set canvas Pen color sender.Canvas.Pen.Color = 0xAAAAAA sender.Canvas.Pen.Width = 5 sender.Canvas.line(cw-5 , top +7, cw-5 , top+height-1 -7) end end function NFOWindowClass.scrollDoDelta(amount) local y = NFOWindowClass.currentY + amount y = math.min(0,math.max(y,NFOWindowClass.CH-NFOWindowClass.totalHeight)) if NFOWindowClass.DestY == y then return end NFOWindowClass.DestY = y if not NFOWindowClass.objects['timer'].Enabled then NFOWindowClass.objects['timer'].Enabled = true end end function NFOWindowClass.scrollUp() local speed = NFOWindowClass.objects['timer'].Enabled and 3 or 1 NFOWindowClass.scrollDoDelta(NFOWindowClass.scrollDistance*speed) end function NFOWindowClass.scrollDown() local speed = NFOWindowClass.objects['timer'].Enabled and 3 or 1 NFOWindowClass.scrollDoDelta(-NFOWindowClass.scrollDistance*speed) end function NFOWindowClass.scrollOnTimer(timer) local y = NFOWindowClass.currentY local step = (NFOWindowClass.DestY-y) * 0.05 if step < 1 and step > 0 then step = 1 end if step > -1 and step < 0 then step = -1 end y = y + step if step < 0 and y < NFOWindowClass.DestY then y=NFOWindowClass.DestY end if step > 0 and y > NFOWindowClass.DestY then y=NFOWindowClass.DestY end if math.abs(y) < 1 then y=0 end NFOWindowClass.currentY = y if NFOWindowClass.DestY==y then timer_setEnabled(timer,false) end -- you can remove this IF if NFOWindowClass.CH~=NFOWindowClass.totalHeight then NFOWindowClass.Form.Caption = NFOWindowClass.windowCaption.. ' position: '.. math.floor(y/(NFOWindowClass.CH-NFOWindowClass.totalHeight)*100).. '%' end NFOWindowClass.PaintBox.repaint() end NFOWindowClass.authorNFO = [[ лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл лл лл лл This NFOWindow was made by: лл лл _ ______ _ лл лл (_) | ___ \ | лл лл _ __ ___ __ _ _ __ _ _ __ _()_ | |_/ / | __ _ _ _ ___ _ __ лл лл | '_ ` _ \ / _` | '__| | '_ \|_ / | __/| |/ _` | | | |/ _ \ '__| лл лл | | | | | | (_| | |_ | | | | |/ / _| | | | (_| | |_| | __/ | лл лл |_| |_| |_|\__, |_(_)|_|_| |_/___(_)_| |_|\__,_|\__, |\___|_| лл лл __/ | __/ | лл лл |___/ |___/ лл лл лл лл лл лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл лл лл лл You see this message, because you didn't set "nfo" лл лл лл лл Usage: лл лл лл лл NFOWindowClassOptions = лл лл { лл лл nfo='your text', -- mandatory лл лл windowCaption='NFOWindow by mgr.inz.Player', -- mandatory лл лл Button=UDF1_CEButton1, лл лл fontSize=12, -- (default 12) лл лл windowMaximumHeight=420, -- (default: 600, about 50 lines) лл лл scrollLines=5 -- (default: 9) лл лл } лл лл лл лл NFOWindowClass.Init(NFOWindowClassOptions) лл лл лл лл Example1 (show window after button onclick) : лл лл лл лл NFOWCO = { nfo='example 1\nline two', лл лл windowCaption='Example1 test', лл лл Button=UDF1_CEButton1 } лл лл лл лл NFOWindowClass.Init(NFOWCO) лл лл лл лл лл лл лл лл Example2 (ShowWindow used) : лл лл лл лл NFOWCO = { nfo='example 2\nline two', лл лл windowCaption='Example2 test' } лл лл лл лл NFOWindowClass.Init(NFOWCO) лл лл NFOWindowClass.ShowWindow() лл лл лл лл лл лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл ]] -- NFO Window Class END