الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

من يشرح لنا عمل دالة الأبيي DrawText

مغلق
بدأه أبو محسن في 18 نوفمبر 2001 · 4 رد · 1,537 مشاهدة · في لغة Ms Visual Basic 6 وما قبلها من إصدارات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لقد قرأت في بعض المقالات عن هذه الدالة بأنها جد هامة خاصة في معالجة النصوص

ومنذ ذلك الوقت ما فتئت أبحث عن شرح شامل لها

فمن له شرح عنها فليدرجه هنا مشكورا وسواصل بحثي عنها وعن غيرها حتى نوقظ منتدى الأبيي إن شاء الله تعالى.

#2

هذه مشاركة متواضعة أرجو أن يكون فيها الفائدة ...

الوظيفة:

دالتي واجهة برمجة التطبيقات 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

[Code2]
DT_EXPANDTABS : Expands tab characters. The default number
of characters per tab is eight.

DT_EXTERNALLEADING: Includes the font’s external leading
in the line height. Normally, external leading is not
included in the height of a line of text.

DT_MODIFYSTRING : Modifies the given string to match the displayed text.
This flag has no effect unless the DT_END_ELLIPSIS
or DT_PATH_ELLIPSIS flag is specified.

DT_NOPREFIX : Turns off processing of prefix characters.
Normally, DrawText interprets the ampersand (&)
mnemonic-prefix character as a directive to
underscore the character that follows, and
the two-ampersand (&&) mnemonic-prefix characters
as a directive to print a single ampersand.
By specifying DT_NOPREFIX, this processing
is turned off.
DT_TABSTOP : Sets tab stops. The high-order byte of nFormat
is the number of characters for each tab. The
default number of characters per tab is eight.

القيمة التي تعيدها الدالة :

ارتفاع النص المطبوع بالبيكسل.

أمثلة على استخدام الدالة 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 امكانيات أكبر لرسم النصوص بأشكال مختلفة كالنص المنحني والدائري وغيرها.

#3

شكرا جزيلا أخي للقراءة فقط

وأتمنى أن تتظافر الجهود لتقديم مثل هذه الشروح الفائقة

وشكرا مرة أخرى

#4

شكرا أخون للقراءة فقط .. شرح وافي و جميل ..

وبارك الله فيك .. و نفع بك .. و جعل ذلك في موازين حسناتك

محبك أبو زيد

#5

اخي القراة فقط

بارك الله فيك

نتمنى ان تتحفنا بالمزيد من المعلومات في اغلب دوال api

لك كل تحياتي واحترامي

لا يتعلم العلم كل مستحي او مستكبر

هذا الموضوع مغلق.

مواضيع مشابهة