لقد قرأت في بعض المقالات عن هذه الدالة بأنها جد هامة خاصة في معالجة النصوص
ومنذ ذلك الوقت ما فتئت أبحث عن شرح شامل لها
فمن له شرح عنها فليدرجه هنا مشكورا وسواصل بحثي عنها وعن غيرها حتى نوقظ منتدى الأبيي إن شاء الله تعالى.
لقد قرأت في بعض المقالات عن هذه الدالة بأنها جد هامة خاصة في معالجة النصوص
ومنذ ذلك الوقت ما فتئت أبحث عن شرح شامل لها
فمن له شرح عنها فليدرجه هنا مشكورا وسواصل بحثي عنها وعن غيرها حتى نوقظ منتدى الأبيي إن شاء الله تعالى.
هذه مشاركة متواضعة أرجو أن يكون فيها الفائدة ...
الوظيفة:
دالتي واجهة برمجة التطبيقات DrawText ونسختخها الاحدث DrawTextEX تقوم بطباعة نص معين في مستطيل محدد.
ملاحظة: الدوال المنتهية بالامتداد EX تعمل على مختلف أنظمة ويندوز.
تصريح الدالة حسب لغة فيجوال بيسك:
Declare Function DrawText Lib "user32" Alias "DrawTextA" _ (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount _ As Long, lpRect As RECT, ByVal wFormat As Long) As Long
وسيطات الدالة:
hDC : مقبض Device Context أوما يسمى بالعربية قرين الجهاز وفي بعض المراجع (سواقات الاجهزة) وتملك الكائنات التي يمكن الرسم عليها هذه الخاصية مثل النماذج ومربعات الصورة.
lpStr: النص المراد طباعته.
nCount : عدد الحروف المراد طباعتها.
lpRect : المستطيل المراد الطباعة فيه ويتم تمرير حدود المنطقة من خلال البنية RECT .
wFormat: تأخذ هذه الوسيطة عدد من الثوابت التي تحدد طريقة الطباعة. انظر الجدول التالي
الذي يحوي شرح لعدد من الثوابت المهمة:
DT_BOTTOM : محاذاة إلى الاسفل، مع ملاحظة ضرورة استخدام الثابت DT_SINGLE
DT_CENTER : محاذة إلى الوسط أفقيا.
DT_VCENTER : نفس السابق ولكن يستخدم عندما يكون الثابت DT_SINGLE محدد
DT_LEFT : محاذاة إلى اليسار.
DT_RIGHT : محاذاة غلى اليمين.
DT_TOP : محاذاة إلى الاعلى.
DT_NOCLIP : بدون التقيد بمساحة المستطيل.
DT_WORKBEAK : التفاف تلقائي للنص بحيث لا يخرج عن حدود المستطيل.
DT_SINGLELINE : طباعة سطر وحيد.
DT_CALRECT : اذا كان هناك سطر واحد يتم تمديد المستطيل من اليمين حسب الحاجة أما إذا كان هناك أكثر من سطر فإنه يتمدد المستطيل إلى الاسفل حسب الحاجة.
وهناك ثوابت اخرى (ربما تحتاج إليها) وهي كالتالي كماتنص عليها المكتبة MSDN
القيمة التي تعيدها الدالة :
ارتفاع النص المطبوع بالبيكسل.
أمثلة على استخدام الدالة DrawText .
مثال1:
هذا مثال مبسط يوضح كيفية طباعة عبارة على أداة PictureBox
ادرج PictureBox وCommandButton ثم استخدم الكود التالي:
'DrawText تصريح الدالة
Private Declare Function DrawText Lib "user32" Alias _
"DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, _
ByVal nCount As Long, lpRect As RECT, _
ByVal wFormat As Long) As Long
'RECT البنية
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Const DT_SINGLELINE = &H20
Private Sub Form_Load()
With Picture1
.Left = 0: .Top = 0: .Width = Me.ScaleWidth
End With
End Sub
Private Sub Command1_Click()
Dim Txt As String, Rct As RECT
Txt = "الفريق العربي للبرمجة"
'حدود المستطيل
Rct.Left = Picture1.Left: Rct.Top = Picture1.Top
Rct.Right = Picture1.Left + Picture1.Width
Rct.Bottom = Picture1.Top + Picture1.Height
'طباعة النص
DrawText Picture1.hdc, Txt, Len(Txt), Rct, DT_SINGLELINE
End Subمثال2:
هذا تطبيق آخر على الدالة السابقة يوضح كيف يمكن الاستفادة منها في انشاء مربع نصي شفاف.
ادرج CommandButton وTextBox خاصية MultiLine له مضبوطة إلى True ثم استخدم الكود...
'تصريحات دوال واجهة برمجة التطبيقات
Private Declare Function BitBlt Lib "gdi32" (ByVal hDCDest _
As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal _
nWidth As Long, ByVal nHeight As Long, ByVal hDCSrc As _
Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal _
dwRop As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal _
hWnd As Long) As Long
Private Declare Function DrawText Lib "user32" Alias _
"DrawTextA" (ByVal hdc As Long, ByVal lpStr As _
String, ByVal nCount As Long, lpRect As RECT, _
ByVal wFormat As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
'ثابت التفاف الاسطر
'راجع الثوابت أعلاه
Const DT_WORDBREAK = &H10
Dim DoTrans As Boolean
Sub Trans(Txt As TextBox)
Dim TxtBxDC As Long, Rct As RECT
Rct.Left = Txt.Left: Rct.Top = Txt.Top
Rct.Right = Rct.Left + Txt.Width
Rct.Bottom = Rct.Top + Txt.Height
Txt.Parent.Cls
Txt.Parent.ForeColor = vbRed
'طباعة النص
DrawText Txt.Parent.hdc, Txt, Len(Txt), Rct, DT_WORDBREAK
'انشاء منطقة رسم
TxtBxDC = GetDC(Txt.hWnd)
BitBlt TxtBxDC, 0, 0, Txt.Width, Txt.Height, Txt.Parent.hdc, _
Txt.Left, Txt.Top, vbSrcCopy
End Sub
Private Sub Form_Load()
With Me
' API لأن اجراءات
'لاتتعامل إلا بالبيكسل
Me.ScaleMode = 3: .AutoRedraw = True: .BackColor = vbBlack
Me.FontName = "Arial": Me.FontBold = True
End With
With Text1
.FontName = "Arial"
.Width = 200: .Height = 50
.ForeColor = vbRed
.Text = "اهلا بكم" & vbCrLf & "في منتديات" & vbCrLf _
& "الفريق العربي للبرمجة"
End With
End Sub
Private Sub Command1_Click()
'تحويل المربع النصي إلى شفاف
Trans Text1
DoTrans = True
End Sub
'استدعاء الدالة عند كل اعادة رسم للمربع النصي
'يمكن الاستغناء عن ذلك باستخدام مؤقت
Private Sub Text1_Change()
If Not DoTrans Then Exit Sub
Trans Text1
End Sub
Private Sub Text1_MouseMove(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If Not DoTrans Then Exit Sub
Trans Text1
End Subملاحظات:
1- لم أتحدث عن الدالة DrawTextEX النسخة الاحدث من الدالة DrawText والتي لاتختلف كثيرا عن الدالة السابقة ولكنها توفر امكانيات أكبر من خلال بعض الثوابت الاضافية مثل الثابت DT_EDITCONTROL الذي يتم استخدامه مع مربعات النصوص متعددة الاسطر وكان من الافضل استخدامه لتنفيذ المثال السابق. أيضا الثابت DT_RTLREADING والذي يمكن وظيفة الطباعة من اليمين إلى اليسار في انظمة ويندوز التي تدعم تقنية المرآة.
2- لقد استخدمت كلمة "الطباعة" بدلا من الكلمة "الرسم".
3- توفر الدالة CreateFont امكانيات أكبر لرسم النصوص بأشكال مختلفة كالنص المنحني والدائري وغيرها.
شكرا جزيلا أخي للقراءة فقط
وأتمنى أن تتظافر الجهود لتقديم مثل هذه الشروح الفائقة
وشكرا مرة أخرى
شكرا أخون للقراءة فقط .. شرح وافي و جميل ..
وبارك الله فيك .. و نفع بك .. و جعل ذلك في موازين حسناتك
محبك أبو زيد
اخي القراة فقط
بارك الله فيك
نتمنى ان تتحفنا بالمزيد من المعلومات في اغلب دوال api
لك كل تحياتي واحترامي
لا يتعلم العلم كل مستحي او مستكبر
هذا الموضوع مغلق.