السلام عليكــم ورحمـة الله وبركاتــه ،،
الاخوه الكرام
لدي مثال رائع يقوم بسحب الاوراق من الاسكانر فيدر بدون ادوات
واقوم الان بتطويرة ليتم استخدامه بشكل احترافي ولكن احتاج مساعدة الخبراء منكم في اجراء تعديل عليه
حيث يقوم البرنامج بسحب الصور وارسالها الي فورم اخر وتكوين هذة الفورم بعدد الصور المسحوبه
ولكن اريد ان اقوم بتكوين PictureBox بعدد الاوراق المسحوبه علي نفس الفورم وعرض كافة الصور عليها
واترككم مع الكود الان
نقوم بتعريف التالي
Implements IMessageFilter
Private msgfilter As Boolean
Private tw As Twain
Private picnumber As Integer = 0
<STAThread()> Shared Sub Main()
If (Twain.ScreenBitDepth < 15) Then
MessageBox.Show("Need high/true-color video mode!", "Screen Bit Depth", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return
End If
Dim mf As FrmMain = New FrmMain()
Application.Run(mf)
End Sub
Public Sub New()
InitializeComponent()
tw = New Twain()
tw.Init(Me.Handle)
End Subثم نقوم بأنشاء عدد 3 كلاس بأسماء GdiPlusLib.vb & TwainDefs.vb & TwainLib.vb
مرفقين في اخر الشرح
ثم نقوم بوضع عدد 2 Button علي الفورم الاول لاختيار الاسكانر المراد التعامل معه ونضع فيه الكود التالي
tw.Select()
وButton الاخر لبدأ سحب الاوراق من الاسكانر ونضع فيه الكود التالي
If (Not msgfilter) Then 'Me.Enabled = False msgfilter = True Application.AddMessageFilter(Me) End If tw.Acquire()
ولا ننسي ان نقوم بأستدعاء الكلاس الذي يساعدنا بأستدعاء الاسكانر كالتالي
Imports SP_Scanner_Feeder.TwainLib
مع العلم بأن SP_Scanner_Feeder هو أسم البرنامج الذي قمت بتسميتة
ثم نقوم بأضافة الكود التالي وهو خاص بعد الانتهاء من سحب الصور
Private Sub EndingScan() If (msgfilter) Then Application.RemoveMessageFilter(Me) msgfilter = False ' Me.Enabled = True Me.Activate() End If End Sub
ثم نأتي بعد ذالك للكود المهم وهو الذي يقوم بتخزين الصور اثناء السحب
Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage Dim cmd As TwainCommand = tw.PassMessage(m) If (cmd = TwainCommand.Not) Then Return False End If Select Case cmd Case TwainCommand.CloseRequest EndingScan() tw.CloseSrc() Case TwainCommand.CloseOk EndingScan() tw.CloseSrc() Case TwainCommand.DeviceEvent Case TwainCommand.TransferReady Dim pics As ArrayList = tw.TransferPictures() EndingScan() tw.CloseSrc() picnumber += 1 Dim i As Integer 'هنا يتم ارسال الصور الي الفورم الاخر ليتم عرض كل صورة علي فورم وهذا المطلوب تعديله 'حيث ما اريد ان اقوم في كل خطوة بأنشاء PictureBox ليتم عرض الصور عليه وكود اضافة الصور مرفق بعد هذا الكود For i = 0 To pics.Count - 1 Step 1 Dim img As IntPtr = CType(pics(i), IntPtr) Dim newpic As TwainGui.PicForm = New TwainGui.PicForm(img) 'newpic.MdiParent = Forms.FMain 'Me.MdiParent Dim picnum As Integer = i + 1 newpic.Text = "ScanPass" + picnumber.ToString() + "_Pic" + picnum.ToString() newpic.Show() Next End Select Return True End Function
كما وضحت لكم بأعلي اريد استبدال طريقة عرض الصور بدلاً من تكوين فورم جديده لكل صورة
بأنشاء PictureBox لكل صورة علي الفورم وقمت بتصميم انشاء ال PictureBox علي الفور بشكل جيد ولكن يبقي كيفية اضافة الصورة له
كود اضافة ال PictureBox علي الفورم
Private m_ControlCount As Integer = 0 Private m_Location As New Point(10, 6) Private Sub Add_Photo() m_ControlCount += 1 Dim x As New PictureBox x.Name = "Pic" + m_ControlCount.ToString() x.Text = "Photo" & i + m_ControlCount.ToString() x.BorderStyle = BorderStyle.FixedSingle x.Size = New Size(160, 108) x.Location = New Point(Me.m_Location.X + 5, Me.m_Location.Y) m_Location.X += x.Width + 10 x.Cursor = System.Windows.Forms.Cursors.Hand ' Add the two event handlers AddHandler x.Click, AddressOf myPhoto_Click 'AddHandler x.MouseHover, AddressOf myButtonHandler_MouseHover ' Add the control to the collection of controls Controls.Add(x) ItemView.Controls.Add(x) CType(x, System.ComponentModel.ISupportInitialize).BeginInit() End Sub Private Sub myPhoto_Click(ByVal sender As Object, ByVal e As EventArgs) If TypeOf sender Is PictureBox Then MsgBox(CType(sender, PictureBox).Text + " was pressed!", _ MsgBoxStyle.OkOnly, Me.Text) End If End Sub
حيث نفرض في حال قيامنا بسحب عدد 10 اوراق بأستخدام الاسكانر يتم تكوين عدد 10 PictureBox علي الفور بشكل جيد ويتم عرض الصور عليهم
وفي هذة الحالة يكون كود سحب الصور كالتالي
Dim i As Integer 'هنا يتم تسحيب الصور صورة تلو الاخري وتسجيلها Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage Dim cmd As TwainCommand = tw.PassMessage(m) If (cmd = TwainCommand.Not) Then Return False End If Select Case cmd Case TwainCommand.CloseRequest EndingScan() tw.CloseSrc() Case TwainCommand.CloseOk EndingScan() tw.CloseSrc() Case TwainCommand.DeviceEvent Case TwainCommand.TransferReady Dim pics As ArrayList = tw.TransferPictures() EndingScan() tw.CloseSrc() picnumber += 1 For i = 0 To pics.Count - 1 Step 1 Dim img As IntPtr = CType(pics(i), IntPtr) 'Dim newpic As TwainGui.PicForm = New TwainGui.PicForm(img) 'newpic.MdiParent = Forms.FMain 'Me.MdiParent Add_Photo() 'Dim picnum As Integer = i + 1 'newpic.Text = "ScanPass" + picnumber.ToString() + "_Pic" + picnum.ToString() 'newpic.Show() Next End Select Return True End Function
ولكن يبقي طريقة عرض الصور علي نفس الفورم في ال PictureBox المخصص له
مرفق المثال بالكامل