Вверх ↑
Ответов: 1114
Рейтинг: 224
#1: 2026-06-06 20:56:53 ЛС | профиль | цитата
Gitarist писал(а):
что то типа простейшего пэйнта но на Hiasm. Очень желательно с функцией отмены последнего действия.

Примитивный редактор BMP картинок, только карандаш с отменой внесённых изменений.

Add(MainForm,2953706,42,105)
{
link(onCreate,7937065:doString,[])
}
Add(WinExec,12830869,147,105)
{
FileName="PowerShell"
Mode=0
Point(onConsoleResult)
Point(onConsoleError)
Point(doConsoleExec)
Point(onConsoleTerminate)
link(onConsoleTerminate,2953706:doClose,[(186,139)(186,160)(32,160)(32,132)])
}
Add(FormatStr,7937065,98,119)
{
Mask="$Win32 = Add-Type -MemberDefinition @'\r\n [DllImport("""kernel32.dll""")]\r\n public static extern IntPtr GetConsoleWindow();\r\n\r\n [DllImport("""user32.dll""")]\r\n public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);\r\n'@ -Name 'Win32Console' -Namespace 'Win32' -PassThru\r\n\r\n$consoleHandle = $Win32::GetConsoleWindow()\r\nif ($consoleHandle -ne [IntPtr]::Zero) {\r\n $null = $Win32::ShowWindow($consoleHandle, 0)\r\n}\r\n\r\n\r\nAdd-Type -AssemblyName System.Windows.Forms\r\nAdd-Type -AssemblyName System.Drawing\r\n\r\n$form = New-Object System.Windows.Forms.Form\r\n$form.Text = 'BMP Редактор (только Карандаш)'\r\n$form.Size = New-Object System.Drawing.Size 860, 720\r\n$form.MinimumSize = New-Object System.Drawing.Size 450, 300\r\n$form.StartPosition = 'CenterScreen'\r\n\r\n$global:bmp = New-Object System.Drawing.Bitmap 800, 600\r\n$global:g = [System.Drawing.Graphics]::FromImage($global:bmp)\r\n$global:g.Clear([System.Drawing.Color]::White)\r\n\r\n$isDrawing = $false\r\n$lastPoint = New-Object System.Drawing.Point\r\n$history = New-Object System.Collections.Generic.List[System.Drawing.Bitmap]\r\n\r\nfunction SaveToHistory {\r\n if ($history.Count -ge 20) { $history.RemoveAt(0) }\r\n $history.Add($global:bmp.Clone())\r\n}\r\nSaveToHistory\r\n\r\n$panel = New-Object System.Windows.Forms.Panel\r\n$panel.Location = New-Object System.Drawing.Point 10, 50\r\n$panel.Width = $form.ClientSize.Width - 20\r\n$panel.Height = $form.ClientSize.Height - 60\r\n$panel.BorderStyle = [System.Windows.Forms.BorderStyle]::Fixed3D\r\n$panel.AutoScroll = $true\r\n\r\n$panel.Anchor = [System.Windows.Forms.AnchorStyles]::Top -bor \r\n [System.Windows.Forms.AnchorStyles]::Bottom -bor \r\n [System.Windows.Forms.AnchorStyles]::Left -bor \r\n [System.Windows.Forms.AnchorStyles]::Right\r\n\r\n$form.Controls.Add($panel)\r\n\r\n$pictureBox = New-Object System.Windows.Forms.PictureBox\r\n$pictureBox.Location = New-Object System.Drawing.Point 0, 0\r\n$pictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::AutoSize\r\n$pictureBox.Image = $global:bmp\r\n$panel.Controls.Add($pictureBox)\r\n\r\n# 5. Логика рисования мышью\r\n$pictureBox.Add_MouseDown({\r\n param($sender, $e)\r\n if ($e.Button -eq [System.Windows.Forms.MouseButtons]::Left) {\r\n $global:isDrawing = $true\r\n $global:lastPoint = $e.Location\r\n }\r\n})\r\n\r\n$pictureBox.Add_MouseMove({\r\n param($sender, $e)\r\n if ($global:isDrawing) {\r\n $pen = New-Object System.Drawing.Pen([System.Drawing.Color]::Black, 2)\r\n $global:g.DrawLine($pen, $global:lastPoint, $e.Location)\r\n $pen.Dispose()\r\n $global:lastPoint = $e.Location\r\n $pictureBox.Invalidate()\r\n }\r\n})\r\n\r\n$pictureBox.Add_MouseUp({\r\n param($sender, $e)\r\n if ($global:isDrawing) {\r\n $global:isDrawing = $false\r\n SaveToHistory\r\n }\r\n})\r\n\r\n$btnOpen = New-Object System.Windows.Forms.Button\r\n$btnOpen.Text = 'Открыть BMP'\r\n$btnOpen.Location = New-Object System.Drawing.Point 10, 10\r\n$btnOpen.Size = New-Object System.Drawing.Size 120, 30\r\n$btnOpen.Add_Click({\r\n $ofd = New-Object System.Windows.Forms.OpenFileDialog\r\n $ofd.Filter = 'BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*'\r\n \r\n if ($ofd.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {\r\n $global:g.Dispose()\r\n $global:bmp.Dispose()\r\n foreach ($h in $history) { $h.Dispose() }\r\n $history.Clear()\r\n \r\n $loadedImg = [System.Drawing.Image]::FromFile($ofd.FileName)\r\n $global:bmp = New-Object System.Drawing.Bitmap $loadedImg\r\n $loadedImg.Dispose()\r\n \r\n $global:g = [System.Drawing.Graphics]::FromImage($global:bmp)\r\n $pictureBox.Image = $global:bmp\r\n \r\n SaveToHistory\r\n $pictureBox.Invalidate()\r\n }\r\n})\r\n$form.Controls.Add($btnOpen)\r\n\r\n$btnUndo = New-Object System.Windows.Forms.Button\r\n$btnUndo.Text = 'Отмена (Undo)'\r\n$btnUndo.Location = New-Object System.Drawing.Point 140, 10\r\n$btnUndo.Size = New-Object System.Drawing.Size 120, 30\r\n$btnUndo.Add_Click({\r\n if ($history.Count -gt 1) {\r\n $history.RemoveAt($history.Count - 1)\r\n $previousBmp = $history[$history.Count - 1]\r\n \r\n $global:g.Dispose()\r\n $global:bmp = $previousBmp.Clone()\r\n $global:g = [System.Drawing.Graphics]::FromImage($global:bmp)\r\n $pictureBox.Image = $global:bmp\r\n $pictureBox.Invalidate()\r\n }\r\n})\r\n$form.Controls.Add($btnUndo)\r\n\r\n$btnSave = New-Object System.Windows.Forms.Button\r\n$btnSave.Text = 'Сохранить BMP'\r\n$btnSave.Location = New-Object System.Drawing.Point 270, 10\r\n$btnSave.Size = New-Object System.Drawing.Size 120, 30\r\n$btnSave.Add_Click({\r\n $sfd = New-Object System.Windows.Forms.SaveFileDialog\r\n $sfd.Filter = 'BMP Files (*.bmp)|*.bmp'\r\n if ($sfd.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {\r\n # ИСПРАВЛЕНИЕ: Получаем точную ссылку на формат через свойство .Bmp\r\n $bmpFormat = [System.Drawing.Imaging.ImageFormat]::Bmp\r\n $global:bmp.Save($sfd.FileName, $bmpFormat)\r\n [System.Windows.Forms.MessageBox]::Show('Файл успешно сохранен!', 'Успех')\r\n }\r\n})\r\n$form.Controls.Add($btnSave)\r\n\r\n$form.Add_FormClosed({\r\n $global:g.Dispose()\r\n $global:bmp.Dispose()\r\n foreach ($h in $history) { $h.Dispose() }\r\n})\r\n\r\n[System.Windows.Forms.Application]::Run($form)\r\n"
link(onFString,12830869:doConsoleExec,[])
}

карма: 20

0