النصوص في النمط الرسومي في ++C
النصوص في النمط الرسومي
إنتاج النصوص في النمط الرسومي أكثر مرونة بكثير عنه في النمط النصي , فبإمكانك التحكم في أشكال للحروف (الفونطات) , وأحجامها , ووضعها أفقيا أو رأسيا , وبصفة عامة ممارسة قدر أكبر من التحكم في إظهارها .
وسوف يتضمن مثالنا فئة gstring تحتوي علي المواصفات التي تستخدم في كتابة نص ما . تشمل هذه المواصفات علي النص المراد إظهاره مخزنا في مصفوفة str وموضعه من الشاشة معرفا بالإحداثيين الرأسي والأفقي كالمعتاد وفونط الحروف , واتجاه النص (أفقي أو رأسي ) , وحجم الحروف ولون الكتابة والمحاذاه الأفقية والرأسية justify وأخيرا طوله لعرضه .
grast.cpp
// grast.cpp// string class for graphics modes// UCS Laboratories#include <graphics.h>       // for graphics functions#include <conio.h>          // for getch()#include <string.h> // for strcpy()
class Gstring // graphics string class
   {   protected:char str[80]; // string to store text
int xCo, yCo; // coordinates of text
int font; // DEFAULT_FONT, TRIPLEX_FONT, etc.
int direction; // HORIZ_DIR or VERT_DIR
int size; // 1, 2, 3, etc.
int color; // BLUE, RED, etc.
int horzjustify; // LEFT_TEXT, etc.
int vertjustify; // BOTTOM_TEXT, etc.
int multx, divx; // horizontal scale factors
int multy, divy; // vertical scale factors
   public:      Gstring()             // no-arg constructor     {                  // set to default valuesstr[0] = '\0'; // empty string
     xCo = 0; yCo = 0;         // position     font = DEFAULT_FONT;      // font     direction = HORIZ_DIR;    // horizontal or vertical     size = 4;                 // character size     color = WHITE;            // character color     horzjustify = LEFT_TEXT;  // horizontal positioning     vertjustify = TOP_TEXT;   // vertical positioning     multx = 1; divx = 1;      // horizontal scale factors     multy = 1; divy = 1;      // vertical scale factors}
void DrawText() // draw the text
     {moveto(xCo, yCo);
settextstyle(font, direction, size);
setcolor(color);
settextjustify(horzjustify, vertjustify);
setusercharsize(multx, divx, multy, divy);
outtext(str);
}
void SetText(char s[]) // set text string
     { strcpy(str, s); }void SetPosition(int x, int y) // set position
     { xCo=x; yCo=y; }void SetFont(int f) // set font
     { font = f; }void SetDirection(int d) // set direction
     { direction = d; }void SetSize(int s) // set size
     { size = s; }void SetColor(int c) // set color
     { color = c; }void SetHJust(int hj) // set horizontal justification
     { horzjustify = hj; }void SetVJust(int vj) // set vertical justification
     { vertjustify = vj; }void SetHorzSize(int m, int d) // set horiz proportions
     { size=0; multx=m; divx=d; };void SetVertSize(int m, int d) // set vertical proportions
     { size=0; multy=m; divy=d; };};
void main() // UCS Laboratories
   {   int driver, mode;   driver = DETECT;                    // use best graphics mode   initgraph(&driver, &mode, "\\bc45\\bgi");   Gstring s1, s2, s3, s4, s5, s6;     // make some stringss1.SetText("Default everything"); // all defaults
s2.SetText("Gothic Font"); // gothic font
s2.SetFont(GOTHIC_FONT);
s2.SetPosition(0, 75);
s3.SetText("Vertical Sans Serif"); // vertical
s3.SetFont(SANS_SERIF_FONT);
s3.SetPosition(600, 0);
s3.SetDirection(VERT_DIR);
s4.SetText("Centered Triplex"); // centered
s4.SetFont(TRIPLEX_FONT);
s4.SetPosition(300, 150);
s4.SetHJust(CENTER_TEXT);
s5.SetText("Centered Sans Serif"); // centered
s5.SetFont(SANS_SERIF_FONT);
s5.SetSize(6);
s5.SetPosition(300, 225);
s5.SetHJust(CENTER_TEXT);
s6.SetText("Tall and narrow Triplex"); // change proportions
s6.SetFont(TRIPLEX_FONT);
s6.SetPosition(0, 300);
   s6.SetHorzSize(2, 3);               // two-thirds as wide   s6.SetVertSize(4, 1);               // four times as high   s1.DrawText();                      // display all   s2.DrawText();                      // the Gstringss3.DrawText();
s4.DrawText();
s5.DrawText();
s6.DrawText();
   getch();                            // wait for keypress   closegraph();                       // close graphics system}
تنشئ الدالة الأصلية للبرنامج ستة كائنات من فئة gstring يطبع الكائن الأول منها بالخيارات المبدئية جميعها تعدل المواصفات في بقية الكائنات بالصورة التي تلاحظها في البرنامج ويبين الشكل خرج البرنامج .
الدوال النصية للنمط الرسومي
تستخدم الدالة DrawText() في الفئة Gstring مجموعة من الدوال المكتبية للغة السي++ الخاصة بإظهار النصوص , وتشرح تلك الدوال فيما يلي :
الدالة moveto()
تستخدم لغة السي ++ نقطة تخيلية علي الشاشة تسمي "النقطة الجارية current point " (CP) كنقطة بداية لإظهار النص . وتقوم الدالة moveto بتحديد هذه النقطة باستخدام معاملين يحددان الإحداثيين لها . وتظهر النصوص عادة بالنقطة الجارية أعلي الشاشة وهو ما يمكن تعديله علي ما سنري .
الدالة settextstyle()
تعدل هذه الدالة الخصائص التالية : الفونط , اتجاه الكتابة وحجم الحرف وتعرف كل خاصية بثابت في معامل الدالة .
وللإصدارات الحالية من التيربو سي++ وبورلاند خمسة فونطات معرفة بثوابت علي الوجه المبين بجدول .
جدول الفونطات المتاحة
  
الفونط  | طبيعته  | 
DEFAULT_FONT  | الشكل المعتاد لخطوط الكمبيوتر , bit- mapped  | 
TRIPLEX_FONT  | سيرف , يماثل تايمز رومان  | 
SMALL_FONT  | الأفضل للنصوص الصغيرة  | 
SAN_SERIF_FONT  | سان سيرف , يشبة هلفتكا  | 
GOTHIC_FONT  | الخط الإنجليزي القديم  | 
SCRIPT_FONT  | يشبه خط اليد  | 
SIMPLEX_FONT  | حروف متقاربة  | 
TRIPLEX_SCR_FONT  | مائل  | 
COMPLEX_FONT  | خط سيرف أكثر تعقيدا  | 
EUROPEAN_FONT  | حروف متقاربة  | 
BOLD_FONT  | بنط غامق  | 
ولاستخدام أي من هذه الفنطات عليك التأكد من ملفاتها موجودة في المسار المذكور في الدالة initgraph() , وهذه الملفات تحمل الامتداد chr . ( اختصار character ). فالملف trip.chr مثلا يحتوي علي الفونط triplex .
أما للحصول علي برامج قائمة بذاتها , لا تعتمد علي مسارات معينة أنظر الملحق ج , المعامل الثاني للدالة يكون أحد ثابتين HORIZ_DIR, VERT_DIR وهو يحدد إن كانت الكتابة أفقية أم رأسية .
أما المعامل الثالث فيحدد حجم الحروف , 1 لأصغر حجم , 2 لحجم أكبر بمقدار الضعف , 3 أكبر بمقدار ثلاثة أضعاف , وهكذا .
الدالة sertextjustify()
تحدد هذه الدالة أسلوب المحاذاة أو مكان النقطة CP بالنسبة للنص , ولهذه الدالة معاملان , الأول للمحاذاة الأفقية , والثاني للمحاذاة الرأسية ولكل معامل ثلاثة خيارات مبينة جميعها في الجدولين
جدول خيارات المحاذاة الأفقية
  
الخيار  | طريقته  | 
LEFT_TEXT  | محاذاة لليسار  | 
CENTER_TEXT  | محاذاة للوسط  | 
RIGHT_TEXT  | محاذاة لليمين  | 
جدول خيارات المحاذاة الرأسية
  
الخيار  | طريقته  | 
TOP_TEXT  | محاذاه من أعلي  | 
CENTER_TEXT  | محاذاه من الوسط  | 
BOTTOM_TEXT  | محاذاه من أسفل  | 
الدالة setusercharsize()
تغير هذه الدالة من النسب بين أبعاد الحروف بتغير كل من الطول واعرض للحروف علي استقلال , ولكي تكون هذه الدالة فعالة يجب أن يكون الدالة settextstyle() مساويا 0 وهو يضع الحروف في الحجم 4 تلقائيا . ومن هذا الحجم يبدأ تشكيل الحروف طبقا لرغبة المستخدم
ولهذه الدالة أربعة معاملات يحدد الأثنان الأول البسط والمقام لنسبة التحويل لعرض الحرف فالرقمان 5 , 2 يجعلان العرض أكبر بنسبة 5/2 ونفس الشئ بالنسبة للطول إذ يحدد المعاملان الثالث والرابع نسبة تحويله .
الدالة outtext()
هذه الدالة هي المسئولة عن إظهار النص ومعاملها الوحيد هو النص المراد إظهاره .
تعديل صياغة الدوال
رأيت في المثال المعطي كيف يمكننا أن نعيد صياغة الدوال لإعطائها مظهرا أكثر وضوحا , فالدالة settextstyle قسمت علي الفئة Gstring إلي ثلاثة دوال , SetSize() , SetDirection() , SetFont() , كل دالة تبين بوضوح العرض منها . ويمكن بهذا الأسلوب أن يضفي المبرمج من ذوقه علي صياغة البرنامج .
توسيع إمكانيات الفئة Gstring
للمبرمج مجال واسع للإبداع عن طريق إدخال خواص إضافية كزيادة تحميل المؤثرات , كما تناولنا في مقالات سابقة وغيرها علي الفئات التي يضعها فيزيد بذلك برامجه الرسومية قوة ومرونة .
استخدام cout في البرامج الرسومية
يمكنك إذا شئت أن تستخدم الطريقة المعتادة في إخراج النصوص , إذا لم تكن تريد تجشم أعباء إخراجها بصورة معينة , فالدالة gotoxy ( x, y) تمكنك من وضع النص في موضع معين , ثم تقوم بإدخال النص كالمعتاد كما في المثال التالي:
Gotoxy (1, 10); تحديد بدية النص علي الشاشة
Cout << ''speed ='' <<speed;
وهذا الأسلوب مفيد غالبا في تصحيح البرامج حين لا تريد الدخول في تعقيدات الدالة outtext() أو المصحح .
تعليقات
إرسال تعليق