📄 ficoneditor.class
字号:
CASE 2 Draw.LineStyle = LINE.Solid Draw.ForeColor = 1 Draw.FillStyle = Fill.Solid Draw.FillColor = 2 END SELECT Draw.Ellipse(0, 0, W, H) Draw.End hImage = hTemp.Image C2 = .OtherColor(C) FOR XX = 0 TO W - 1 FOR YY = 0 TO H - 1 SELECT CASE hImage[XX, YY] CASE 1 SetPixel(X + XX, Y + YY, C) CASE 2 SetPixel(X + XX, Y + YY, C2) END SELECT NEXT NEXT Modify RefreshImage(X, Y, W, H) END WITHENDPRIVATE SUB DrawGhost(OPTIONAL bNoBegin AS Boolean) DIM iS2 AS Integer DIM iSH AS Integer DIM iWH AS Integer WITH FIconTool IF .GetTool() = "select" AND NOT $bSelect THEN RETURN iS2 = $iScale \ 2 iSH = $iScale iWH = iSH * 2 + 1 IF NOT bNoBegin THEN Draw.Begin(dwgIcon) SELECT CASE .GetTool() CASE "line" Draw.Invert = TRUE Draw.LineStyle = Line.Solid Draw.LineWidth = 3 Draw.FillStyle = Fill.None Draw.ForeColor = Color.White Draw.Line($X * $iScale + iS2, $Y * $iScale + iS2, $X2 * $iScale + iS2, $Y2 * $iScale + iS2) Draw.Rect($X * $iScale, $Y * $iScale - 1, $iScale1, $iScale1) Draw.Rect($X2 * $iScale, $Y2 * $iScale - 1, $iScale1, $iScale1) CASE "select" Draw.Invert = TRUE Draw.LineStyle = Line.Solid Draw.LineWidth = 3 Draw.FillStyle = Fill.None Draw.ForeColor = Color.White Draw.Rect(Min($X, $X2) * $iScale, Min($Y, $Y2) * $iScale, (Abs($X - $X2) + 1) * $iScale + 1, (Abs($Y - $Y2) + 1) * $iScale + 1) CASE "rect" Draw.Invert = TRUE Draw.LineStyle = Line.Solid Draw.LineWidth = 3 Draw.FillStyle = Fill.None Draw.ForeColor = Color.White Draw.Rect(Min($X, $X2) * $iScale, Min($Y, $Y2) * $iScale, (Abs($X - $X2) + 1) * $iScale + 1, (Abs($Y - $Y2) + 1) * $iScale + 1) IF FIconTool.GetMode("rect") = 0 THEN IF Abs($X - $X2) > 1 AND Abs($Y - $Y2) > 1 THEN Draw.Rect((Min($X, $X2) + 1) * $iScale, (Min($Y, $Y2) + 1) * $iScale, (Abs($X - $X2) - 1) * $iScale + 1, (Abs($Y - $Y2) - 1) * $iScale + 1) ENDIF ENDIF CASE "circle" Draw.Invert = TRUE Draw.LineStyle = LINE.Solid Draw.LineWidth = 3 Draw.FillStyle = Fill.None Draw.ForeColor = Color.White Draw.Ellipse(Min($X, $X2) * $iScale, Min($Y, $Y2) * $iScale, (Abs($X - $X2) + 1) * $iScale + 1, (Abs($Y - $Y2) + 1) * $iScale + 1) IF FIconTool.GetMode("circle") = 0 THEN IF Abs($X - $X2) > 1 AND Abs($Y - $Y2) > 1 THEN Draw.Ellipse((Min($X, $X2) + 1) * $iScale, (Min($Y, $Y2) + 1) * $iScale, (Abs($X - $X2) - 1) * $iScale + 1, (Abs($Y - $Y2) - 1) * $iScale + 1) ENDIF ENDIF END SELECT IF NOT bNoBegin THEN Draw.End $bGhost = NOT $bGhost ENDIF END WITHENDPRIVATE SUB SetUndo() DIM X AS Integer DIM Y AS Integer $hUndo[$iUndo] = $hImage.Copy() $iUndo = ($iUndo + 1) MOD MAX_UNDOENDPUBLIC SUB Undo() INC Application.Busy DEC $iUndo IF $iUndo < 0 THEN $iUndo = MAX_UNDO - 1 IF $hUndo[$iUndo] THEN $hImage = $hUndo[$iUndo] $hUndo[$iUndo] = NULL 'PRINT svwICon.ClientX; svwIcon.ClientY; svwIcon.ClientW, svwIcon.ClientH 'PRINT svwICon.ScrollX; svwIcon.ScrollY 'dwgIcon.Refresh(svwIcon.ScrollX, svwIcon.ScrollY, svwIcon.ClientW, svwIcon.ClientH) 'svwIcon.Refresh RefreshZoom IF dwgPaste.Visible THEN dwgPaste.Refresh Modify ENDIF DEC Application.BusyEND' PRIVATE SUB RefreshSelect()'' DIM X AS Integer' DIM Y AS Integer' DIM X2 AS Integer' DIM Y2 AS Integer' DIM W AS Integer' DIM H AS Integer'' IF $bSelect THEN'' panSelectN.Visible = FALSE' panSelectS.Visible = FALSE' panSelectW.Visible = FALSE' panSelectE.Visible = FALSE'' X = $XS * $iScale' Y = $YS * $iScale' X2 = ($XS + $WS) * $iScale' Y2 = ($YS + $HS) * $iScale' W = $WS * $iScale' H = $HS * $iScale'' panSelectN.Move(X - WIDTH_SEL, Y - WIDTH_SEL, W + WIDTH_SEL * 2, WIDTH_SEL)' panSelectS.Move(X - WIDTH_SEL, Y2, W + WIDTH_SEL * 2, WIDTH_SEL)'' panSelectW.Move(X - WIDTH_SEL, Y, WIDTH_SEL, H)' panSelectE.Move(X2, Y, WIDTH_SEL, H)'' ENDIF'' panSelectN.Visible = $bSelect' panSelectS.Visible = $bSelect' panSelectW.Visible = $bSelect' panSelectE.Visible = $bSelect'' ENDPUBLIC FUNCTION HasSelection() AS Boolean RETURN dwgPaste.VisibleENDPUBLIC SUB HideSelection() IF NOT dwgPaste.Visible THEN RETURN IF $bPrivate THEN DoPaste $bPrivate = FALSE ENDIF $bSelect = FALSE $XS = 0 $YS = 0 dwgPaste.Visible = FALSEENDPRIVATE SUB ShowSelection() $bSelect = TRUE CopySelection ShowPaste WAIT IF $bPrivate THEN DeleteSelectionENDPRIVATE SUB FloodFill(X AS Integer, Y AS Integer, C AS Integer) DIM aStack AS NEW Integer[] DIM C2 AS Integer DIM CS AS Integer DIM X1 AS Integer DIM Y1 AS Integer DIM X2 AS Integer DIM Y2 AS Integer WITH FIconTool IF .GetMode("fill") = 1 THEN C2 = .OtherColor(C) ELSE C2 = C ENDIF END WITH CS = $hImage[X, Y] IF CS = C OR CS = C2 THEN RETURN INC Application.Busy X1 = X Y1 = Y X2 = X Y2 = Y aStack.Push(X) aStack.Push(Y) WHILE aStack.Count Y = aStack.Pop() X = aStack.Pop() X1 = Min(X1, X) Y1 = Min(Y1, Y) X2 = Max(X2, X) Y2 = Max(Y2, Y) IF (X + Y) AND 1 THEN SetPixel(X, Y, C) ELSE SetPixel(X, Y, C2) ENDIF IF X > 0 THEN IF $hImage[X - 1, Y] = CS THEN aStack.Push(X - 1) aStack.Push(Y) ENDIF ENDIF IF Y > 0 THEN IF $hImage[X, Y - 1] = CS THEN aStack.Push(X) aStack.Push(Y - 1) ENDIF ENDIF IF X < ($hImage.Width - 1) THEN IF $hImage[X + 1, Y] = CS THEN aStack.Push(X + 1) aStack.Push(Y) ENDIF ENDIF IF Y < ($hImage.Height - 1) THEN IF $hImage[X, Y + 1] = CS THEN aStack.Push(X) aStack.Push(Y + 1) ENDIF ENDIF WEND Modify RefreshImage(X1, Y1, X2 - X1 + 1, Y2 - Y1 + 1) DEC Application.BusyENDPRIVATE SUB CopySelection() IF dwgPaste.Visible THEN RETURN IF $bSelect THEN Clipboard.Copy($hImage.Copy($XS, $YS, $WS, $HS)) ELSE Clipboard.Copy($hImage) ENDIFENDPRIVATE SUB DeleteSelection() SetUndo DrawRect($XS, $YS, $WS, $HS, -1, 1)ENDPUBLIC SUB RefreshPaste() dwgPaste.Move($XS * $iScale, $YS * $iScale, $hPaste.Width * $iScale, $hPaste.Height * $iScale) IF NOT dwgPaste.Visible THEN dwgPaste.Show ELSE dwgPaste.Refresh ENDIF ' IF dwgPaste.Visible THEN dwgPaste.RefreshENDPUBLIC SUB ShowPaste(OPTIONAL bReset AS Boolean) IF Clipboard.Type <> Clipboard.Image THEN RETURN $hPaste = Clipboard.Paste() $WS = $hPaste.Width $HS = $hPaste.Height IF bReset THEN $XS = ($hImage.Width - $WS) \ 2 $YS = ($hImage.Height - $HS) \ 2 svwIcon.Scroll($XS * $iScale, $YS * $iScale) ENDIF RefreshPaste $bSelect = TRUEENDPRIVATE SUB HidePaste() dwgPaste.HideENDPRIVATE SUB PasteSelection() DIM X AS Integer DIM Y AS Integer DIM C AS Integer DIM bTrans AS Boolean bTrans = FIconTool.GetMode("select") = 0 IF bTrans THEN FOR X = 0 TO $hPaste.Width - 1 FOR Y = 0 TO $hPaste.Height - 1 C = $hPaste[X, Y] IF C < 0 THEN CONTINUE $hImage[X + $XS, Y + $YS] = C NEXT NEXT ELSE FOR X = 0 TO $hPaste.Width - 1 FOR Y = 0 TO $hPaste.Height - 1 $hImage[X + $XS, Y + $YS] = $hPaste[X, Y] NEXT NEXT ENDIF ModifyENDPUBLIC SUB DoPaste() DIM bTrans AS Boolean IF NOT dwgPaste.Visible THEN ShowPaste(TRUE) $bPrivate = FALSE RETURN ENDIF INC Application.Busy SetUndo PasteSelection DEC Application.BusyENDPUBLIC SUB dwgPaste_MouseDown() $X = Mouse.ScreenX - dwgPaste.ScreenX $Y = Mouse.ScreenY - dwgPaste.ScreenYENDPUBLIC SUB dwgPaste_MouseMove() DIM XP AS Integer DIM YP AS Integer XP = (Mouse.ScreenX - $X - dwgIcon.ScreenX) \ $iScale YP = (Mouse.ScreenY - $Y - dwgIcon.ScreenY) \ $iScale IF XP = $XS AND YP = $YS THEN RETURN $XS = XP $YS = YP dwgPaste.Refresh dwgPaste.Move($XS * $iScale, $YS * $iScale) 'dwgPaste.Show UpdateScroll(Mouse.X + dwgPaste.X, Mouse.Y + dwgPaste.Y)ENDPRIVATE SUB UpdateScroll(X AS Integer, Y AS Integer) DIM NX AS Integer DIM NY AS Integer IF X >= (svwIcon.ScrollX + svwIcon.ClientW) THEN NX = X - svwIcon.ClientW + 1 ELSE IF X < svwIcon.ScrollX THEN NX = Max(0, X) ELSE NX = svwIcon.ScrollX ENDIF IF Y >= (svwIcon.ScrollY + svwIcon.ClientH) THEN NY = Y - svwIcon.ClientH + 1 ELSE IF Y < svwIcon.ScrollY THEN NY = Max(0, Y) ELSE NY = svwIcon.ScrollY ENDIF svwIcon.Scroll(NX, NY)ENDPUBLIC SUB dwgPaste_MouseUp() IF Mouse.Right THEN DoPaste ENDIFENDPUBLIC SUB DoFlip() DIM iAngle AS Float DIM iMode AS Integer iMode = FIconTool.GetMode("flip") IF dwgPaste.Visible THEN SELECT CASE iMode CASE 0 $hPaste = $hPaste.Flip() CASE 1 $hPaste = $hPaste.Mirror() CASE 2 $hPaste = $hPaste.Rotate(90) CASE 3 $hPaste = $hPaste.Rotate(-90) END SELECT RefreshPaste ELSE SetUndo SELECT CASE iMode CASE 0 $hImage = $hImage.Flip() CASE 1 $hImage = $hImage.Mirror() CASE 2 $hImage = $hImage.Rotate(90) DrawTitle CASE 3 $hImage = $hImage.Rotate(-90) DrawTitle END SELECT RefreshZoom Modify ENDIFENDPUBLIC SUB SelectAll() HideSelection $XS = 0 $YS = 0 $WS = $hImage.Width $HS = $hImage.Height ShowSelectionENDPUBLIC SUB Form_KeyPress() IF Key.Control THEN IF Key.Code = Key["Z"] THEN Undo ELSE IF Key.Code = Key["A"] THEN IF FIconTool.GetTool() = "select" THEN SelectAll ENDIF ELSE IF Key.Code = Key["S"] THEN Save ENDIF ELSE IF Key.Code = Key["Esc"] THEN HideSelection ENDIF ENDIFENDPUBLIC SUB Clear() IF Message.Delete(("Do you want to clear the image ?"), ("Clear"), ("Cancel")) <> 1 THEN RETURN SetUndo $hImage.Fill(-1) RefreshAllImage() ModifyENDPUBLIC SUB dwgIcon_DblClick() DrawGhostENDPUBLIC FUNCTION Form_Close() AS Boolean IF $bModify THEN IF NOT Project.AboutToQuit THEN SELECT CASE Message.Question(("This image has been modified.\nDo you want to save it ?"), ("Save"), ("Close"), ("Cancel")) CASE 1 Save CASE 3 RETURN TRUE END SELECT ENDIF ENDIF Project.Files[Path] = NULLENDPUBLIC SUB Form_Activate() Project.Activate(ME) FIconTool.Activate(ME)ENDPUBLIC SUB ZoomIn() DIM iPos AS Integer iPos = $aZoom.Find($iScale) IF iPos < 0 OR iPos >= ($aZoom.Count - 1) THEN RETURN $iScale = $aZoom[iPos + 1] RefreshZoomENDPUBLIC SUB ZoomOut() DIM iPos AS Integer iPos = $aZoom.Find($iScale) IF iPos <= 0 THEN RETURN $iScale = $aZoom[iPos - 1] RefreshZoomENDPUBLIC SUB Form_Hide() Project.Deactivate(ME)ENDPUBLIC SUB Form_Enter() dwgIcon.Mouse = FIconTool.GetMouse()ENDPUBLIC SUB SwapColor(bInv AS Boolean) DIM C1 AS Integer DIM C2 AS Integer WITH FIconTool C1 = .GetColor(1) C2 = .GetColor(2) IF bInv THEN SWAP C1, C2 END WITH IF dwgPaste.Visible THEN $hPaste.Replace(C1, C2) RefreshPaste ELSE SetUndo $hImage.Replace(C1, C2) RefreshZoom Modify ENDIFEND
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -