diff --git a/ScanBox/CapturaImagen.cs b/ScanBox/CapturaImagen.cs
new file mode 100644
index 0000000..c5b493b
--- /dev/null
+++ b/ScanBox/CapturaImagen.cs
@@ -0,0 +1,126 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ScaBox30
+{
+ public class CapturaImagen : IDisposable
+ {
+ private Bitmap screenshot;
+
+ ///
+ /// Captura una zona especÃfica de la pantalla a partir de un PictureBox
+ ///
+ /// El PictureBox a capturar
+ /// Delay en milisegundos antes de capturar (por defecto 500ms)
+ public Bitmap CapturarImg(PictureBox pictureBox, int delayMs = 500)
+ {
+ try
+ {
+ if (pictureBox == null)
+ {
+ MessageBox.Show("El PictureBox no puede ser nulo.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return null;
+ }
+
+ // Forzar que la UI se redibuje antes de capturar
+ pictureBox.Refresh();
+ Application.DoEvents();
+
+ // Esperar a que la imagen se actualice completamente
+ System.Threading.Thread.Sleep(delayMs);
+
+ // Obtener las coordenadas en pantalla del PictureBox
+ Point screenLocation = pictureBox.PointToScreen(Point.Empty);
+ int x = screenLocation.X;
+ int y = screenLocation.Y;
+ int width = pictureBox.Width;
+ int height = pictureBox.Height;
+
+ // Crear una imagen con el tamaño del PictureBox
+ screenshot = new Bitmap(width, height);
+
+ using (Graphics g = Graphics.FromImage(screenshot))
+ {
+ // Capturar la zona especÃfica de la pantalla
+ g.CopyFromScreen(x, y, 0, 0, new Size(width, height));
+ }
+
+ return screenshot;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"Error al capturar pantalla:\n{ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return null;
+ }
+ }
+
+ public void GuardarImg(string productNum, string operatorTag)
+ {
+ // Validar que la captura existe
+ if (screenshot == null)
+ {
+ MessageBox.Show("No hay captura de pantalla disponible. Realiza una captura primero.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ return;
+ }
+
+ try
+ {
+ // Crear la carpeta de destino
+ string picturesPath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "BoxScaner");
+ string capturesFolder = Path.Combine(picturesPath, Globals.consecDate.ToString("yyyy-MM-dd"));
+
+ if (!Directory.Exists(capturesFolder))
+ {
+ Directory.CreateDirectory(capturesFolder);
+ }
+
+ // Generar nombre de archivo con timestamp y sanitizar caracteres inválidos
+ string timestamp = DateTime.Now.ToString("HH-mm-ss");
+ string safeProductNum = Path.GetInvalidFileNameChars().Aggregate(productNum, (current, c) => current.Replace(c.ToString(), ""));
+ string safeOperatorTag = Path.GetInvalidFileNameChars().Aggregate(operatorTag, (current, c) => current.Replace(c.ToString(), ""));
+
+ // Formato de fecha juliano: yyyyDDD
+ int julianDay = Globals.consecDate.DayOfYear;
+ string julianDate = $"{Globals.consecDate:yyyy}{julianDay:000}";
+
+ // Formato: CONSECUTIVO_yyyyDDD_TIMESTAMP_PRODUCTO_OPERADOR.png
+ string fileName = Path.Combine(capturesFolder,
+ $"{Globals.consec:D5}_{julianDate}_{timestamp}_{safeProductNum}_{safeOperatorTag}.png");
+
+ // Guardar la captura como PNG
+ screenshot.Save(fileName, System.Drawing.Imaging.ImageFormat.Png);
+ }
+ catch (UnauthorizedAccessException ex)
+ {
+ MessageBox.Show($"Acceso denegado al guardar imagen:\n{ex.Message}", "Error de permisos", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ catch (IOException ex)
+ {
+ MessageBox.Show($"Error al guardar imagen:\n{ex.Message}", "Error de I/O", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"Error inesperado al guardar imagen:\n{ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ ///
+ /// Libera los recursos de la captura de pantalla
+ ///
+ public void Dispose()
+ {
+ if (screenshot != null)
+ {
+ screenshot.Dispose();
+ screenshot = null;
+ }
+ }
+ }
+}
diff --git a/ScanBox/Controller/DbController.cs b/ScanBox/Controller/DbController.cs
index a081cd4..30de810 100644
--- a/ScanBox/Controller/DbController.cs
+++ b/ScanBox/Controller/DbController.cs
@@ -33,6 +33,7 @@ namespace ScaBox30.Controller
catch (Exception e)
{
Console.WriteLine(e);
+ System.Windows.Forms.MessageBox.Show("Error al conectar con la BD: " + e.Message);
}
}
diff --git a/ScanBox/Principal.Designer.cs b/ScanBox/Principal.Designer.cs
index d310517..3900d87 100644
--- a/ScanBox/Principal.Designer.cs
+++ b/ScanBox/Principal.Designer.cs
@@ -66,6 +66,7 @@
this.sr2000w_ip_lbl = new System.Windows.Forms.Label();
this.version = new System.Windows.Forms.Label();
this.reader_connector = new System.Windows.Forms.Timer(this.components);
+ this.bttnQA = new System.Windows.Forms.Button();
this.panelTitleBar.SuspendLayout();
this.panelBody.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.blackimg_picbx)).BeginInit();
@@ -166,6 +167,7 @@
// panelBody
//
this.panelBody.BackColor = System.Drawing.Color.WhiteSmoke;
+ this.panelBody.Controls.Add(this.bttnQA);
this.panelBody.Controls.Add(this.labelRate);
this.panelBody.Controls.Add(this.btnConfiguración);
this.panelBody.Controls.Add(this.barcode_lbl);
@@ -274,7 +276,7 @@
this.btnBD.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(119)))), ((int)(((byte)(232)))));
this.btnBD.CausesValidation = false;
this.btnBD.ForeColor = System.Drawing.Color.White;
- this.btnBD.Location = new System.Drawing.Point(1001, 609);
+ this.btnBD.Location = new System.Drawing.Point(956, 609);
this.btnBD.Name = "btnBD";
this.btnBD.Size = new System.Drawing.Size(44, 58);
this.btnBD.TabIndex = 107;
@@ -434,7 +436,7 @@
this.DataText.Multiline = true;
this.DataText.Name = "DataText";
this.DataText.ScrollBars = System.Windows.Forms.ScrollBars.Both;
- this.DataText.Size = new System.Drawing.Size(983, 58);
+ this.DataText.Size = new System.Drawing.Size(938, 58);
this.DataText.TabIndex = 91;
//
// TgrBtn
@@ -531,7 +533,7 @@
this.version.Name = "version";
this.version.Size = new System.Drawing.Size(64, 21);
this.version.TabIndex = 87;
- this.version.Text = "5.1";
+ this.version.Text = "5.0.2";
this.version.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// reader_connector
@@ -540,6 +542,20 @@
this.reader_connector.Interval = 5000;
this.reader_connector.Tick += new System.EventHandler(this.reader_connector_Tick);
//
+ // bttnQA
+ //
+ this.bttnQA.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.bttnQA.BackColor = System.Drawing.Color.Maroon;
+ this.bttnQA.CausesValidation = false;
+ this.bttnQA.ForeColor = System.Drawing.Color.White;
+ this.bttnQA.Location = new System.Drawing.Point(1003, 609);
+ this.bttnQA.Name = "bttnQA";
+ this.bttnQA.Size = new System.Drawing.Size(44, 58);
+ this.bttnQA.TabIndex = 114;
+ this.bttnQA.Text = "QA";
+ this.bttnQA.UseVisualStyleBackColor = false;
+ this.bttnQA.Click += new System.EventHandler(this.bttnQA_Click_1);
+ //
// Principal
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -605,5 +621,6 @@
private System.Windows.Forms.Button btnConfiguración;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.Label labelRate;
+ private System.Windows.Forms.Button bttnQA;
}
}
\ No newline at end of file
diff --git a/ScanBox/Principal.cs b/ScanBox/Principal.cs
index 4aa4408..3448e58 100644
--- a/ScanBox/Principal.cs
+++ b/ScanBox/Principal.cs
@@ -13,6 +13,7 @@ using ScaBox30.Model;
using ScaBox30.Controller;
using System.Text.Json;
using System.Runtime.InteropServices;
+using System.Reflection;
namespace ScaBox30
{
@@ -96,6 +97,9 @@ namespace ScaBox30
// Zebra printer variables
ZebraController ZT231 = new ZebraController("Etiqueta.prn");
+ // Screenshot capture variables
+ CapturaImagen capturaImagen = new CapturaImagen();
+
ErrorCode code_actual = ErrorCode.None;
@@ -579,6 +583,10 @@ namespace ScaBox30
this.BackColor = Color.Red;
DialogResult dialogResult = RJMessageBox.Show("Uno o más codigos son incorrectos!", "ScanBox", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.BackColor = SystemColors.Control;
+
+ // Capturar zona del PictureBox cuando hay errores para auditoría
+ capturaImagen.CapturarImg(blackimg_picbx);
+ capturaImagen.GuardarImg(barcode_lbl.Text + "_ERROR", operatorTag);
}
//If 1 or more codes are questionable (utr_count>0) the user has to decide if the results are added to the csv file
@@ -609,6 +617,10 @@ namespace ScaBox30
labelRate.Text = (time.TotalMilliseconds / 1000).ToString().Substring(0, 5) + " Seg.";
TgrBtn.Enabled = true;
save_data = true;
+
+ // Capturar zona del PictureBox después del segundo escaneo exitoso
+ capturaImagen.CapturarImg(blackimg_picbx);
+ capturaImagen.GuardarImg(barcode_lbl.Text, operatorTag);
}
@@ -811,6 +823,7 @@ namespace ScaBox30
m_reader?.Dispose();
m_searcher?.Dispose();
liveviewForm1?.Dispose();
+ capturaImagen?.Dispose();
}
@@ -1296,6 +1309,13 @@ namespace ScaBox30
}
}
}
+
+ private void bttnQA_Click_1(object sender, EventArgs e)
+ {
+
+ }
+
+
}
diff --git a/ScanBox/Principal.resx b/ScanBox/Principal.resx
index 6c3378a..8e82669 100644
--- a/ScanBox/Principal.resx
+++ b/ScanBox/Principal.resx
@@ -1,17 +1,17 @@

-
diff --git a/ScanBox/ScanBox.csproj b/ScanBox/ScanBox.csproj
index 0a9617a..3151a26 100644
--- a/ScanBox/ScanBox.csproj
+++ b/ScanBox/ScanBox.csproj
@@ -215,6 +215,7 @@
Ayuda.cs
+