النصوص في النمط الرسومي في ++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() أو المصحح .
تعليقات
إرسال تعليق