النصوص في النمط الرسومي في ++C

النصوص في النمط الرسومي

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 values


     str[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 strings


 


   s1.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 Gstrings


   s3.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() أو المصحح .

التسميات: