دوال لتزيين و تحسين المخرجات

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

 

دوال تحسين و تزيين المخرجات



أولاً:
من الدوال المثيرة في أي لغة هي الدوال لتي تتحكم في الالوان من خلفية الشاشة و من لون النص المكتوب . و من تحديد مكان للنص و الكتابة فيه .
إذا كنت تستخدم أحد منتجات بورلاند مثل:  Turbo C أو++Turbo C أو++Boland C فهذه الدوال تعمل مباشره هناك تحت ملف conio.h و إليكم هيه:
 

________________________________________________________________________________

1. دالة مسح الشاشة:
وهي تستخدم لمسح الشاشة و وضع المؤشر في أول عمود من الصف الأول على الشاشة و تستخدم بالشكل التالي :
 

clrscr( );
 

_________________________________________________________________________________

2. دالة تغيير موضع المؤشر:
تستخدم لوضع المؤشر في العمود x من الصف y وتأخذ الصورة التالية :
 

gotoxy(int x, int y);
 

__________________________________________________________________________________

3.دالة تغيير لون الكتابة:
وتستخدم لتغيير لون الكتابة التي ستطبع بعد هذه الدالة وتأخذ الصيغة:
 


textcolor(color number);

OR
textcolor(color name);
 



ويتم تحديد اللون أما بالرقم او بالإسم .

اللون

اللون E

رقمة

أسود

BLACK

0

أزرق

BLUE

1

أخضر

GREEN

2

سماوي

CYAN

3

أحمر

RED

4

بنفسجي

MAGENTA

5

بني

BROWN

6

رمادي فاتح

LIGHT GRAY

7

رمادي غامق

DARK GRAY

8

أزرق فاتح

LIGHT BLUE

9

أخضر فاتح

LIGHT GREEN

10

سماوي فاتح

LIGHT CYAN

11

أحمر فاتح

LIGHT RED

12

بنفسجي فاتح

LIGHT MAGENTA

13

أصفر

YELLOW

14

أبيض

WHITE

15

 

لكن يجب أن نتتبه أنه مع هذه الدوال يجب أن تستخدم
cprintf بدل printf
ونستبدل علامة سطر جديد New Line

 ' n '    بــ   ' rn '
 

________________________________________________________________________________

4.دوال تغيير لون الخلفية:
وتستخدم لتغيير لون خلفية الكتابة وتأخذ الصيغة :


 

textbackground(color number);

OR
textbackground(color name);



ومعاملاتها هي نفس معاملات الـ textcolor مع ملاحظة أن هذه الدالة لا تأخذ غير الألوان من الرقم 1 إلى 7 المذكورين في الجدول.
و تستبدل جميع دوال الإدخال و الإخراج عند إستخدام الالوان من صيغتها الطبيعية إلى صيغتها مسبوقة بالحرف c المأخوذ من color .
لذا تصبح الــ cscanf <---- scanf.
 

ملاحظة:
إذا إستخدمة الدالة textbackground لتحديد لون لخلفية و أتبعتها بالدالة clrscr سيتم مسح الشاشة باللون الذي تم تحديدة .
أما إذا لم تستخدم الدالة clrscr فإن لون الخلفية سيخصص للكلمات التي تكتب فقط بينما يبقى لون الشاشه كما هو .

وأذكر أن جميع هذه الدوال تندرج تحت الهيدر فايل conio.h
أي يجب أن تكتب في أول البرنامج:
 

#include
 

_______________________________________________________________________________


*أما إذا كنت من مستخدمي منتجات ماسكروسوفت مثل ++Visual C فإن الدوال السابفة الذكر لن تعمل معك بل لا بد من كتابتها

 و هذه هي الدوال السابقة مكتوبة بلغة السي بإستخدام win API :

 


void clrscr()
{  
    COORD coordScreen = { 0, 0 };
    DWORD cCharsWritten;
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    DWORD dwConSize;
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
    FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten);
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
    SetConsoleCursorPosition(hConsole, coordScreen);
}
//---------------------------------------------------------------------------------
void gotoxy(int x, int y)
{
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
//----------------------------------------------------------------------------------
void textbackground(int color)
{

      __BACKGROUND = color;
      SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
      __FOREGROUND + (color << 4));
}

//-----------------------------------------------------------------------
void textcolor(int color)
{
      __FOREGROUND = color;  
     SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
     color + (__BACKGROUND << 4));
}

________________________________________________________________________________

*مثال شامل للمفاهيم السابقة :

ومن التطبيقات المثير في السي في رسم القوائم Menu
وهذا مثال عام يمكنكم تعديله لبرامجكم حسب الحاجة:

 

#include "stdio.h"
#include "conio.h"

#define numberchoices 6
#define menulength 9
#define menuposx 40-menulength/2
#define menuposy (25-numberchoices)/2
#define UP 72
#define DOWN 80
#define ENTER 13
#define ESCAPE 27

void center(char word[], int totallen);
void border(int x1,int y1,int x2,int y2);

void main()
{
     char menuchoice[numberchoices][menulength+1] = {"Choice #1", "Choice #2", "Quit", "Choice #4", "Choice #5", "Choice #6"};
     char ch;
     int x,currentchoice=1;
 
     _setcursortype(0);
    border(3,2,77,24);
    do
   {
       _setcursortype(0);
       textbackground(0);  
       textcolor(7); /*reverse  black on white*/
     

        for (x=0;x < numberchoices;x++)
        { /*Write menu options*/
             gotoxy(menuposx,menuposy+x);
             center(menuchoice[x],menulength);
        }
      

        textbackground(7);
        textcolor(0);
        gotoxy(menuposx,menuposy+currentchoice-1);
        center(menuchoice[currentchoice-1],menulength); /*position cursor on current option*/

        do
        {
            ch=getch(); /*wait For a key to be pressed*/
            textbackground(0);
            textcolor(7); /*reverse white on black*/
            gotoxy(menuposx,menuposy+currentchoice-1);
            center(menuchoice[currentchoice-1],menulength); /*un-highlight current option*/

            if (ch==UP)
                currentchoice = (currentchoice + numberchoices-2)%numberchoices + 1;
            else if (ch==DOWN)
                    currentchoice = 1 + currentchoice%numberchoices;

            textbackground(7);
            textcolor(0);   /*reverse  black on white*/
            gotoxy(menuposx,menuposy+currentchoice-1);
            center(menuchoice[currentchoice-1],menulength); /*highlight new option*/
        } while((ch != ENTER) && (ch != ESCAPE));

        textbackground(0);
        textcolor(7);
        _setcursortype(2);

        if (ch == ENTER)
        {
            switch(currentchoice)
            {
                case 1:
                    clrscr();
                    cprintf("Hello");
                break;
                case 3:
                    ch=ESCAPE; // FORCE EXIT
                break;
            }
        }
   } while(ch != ESCAPE);
}

void center(char word[], int totallen)
{
    int length;
    int count;

    length=strlen(word);
    for ( count = 0 ; count < (totallen-length)/2 ; count++ )
        cprintf(" ");
    cprintf("%s",word);
   

    for ( count = 0 ;(totallen-length)/2 + length + count < totallen ; count++ )

         cprintf(" ");
}

void border(int x1,int y1,int x2,int y2)
{
    int temppos;

    gotoxy(x1,y1);
    cprintf("ة");
        for (temppos=x1;x2-temppos>1;temppos++)
            cprintf("ح");
    cprintf("»");
        for (temppos=y1+1;y2-temppos>0;temppos++)
        {
            gotoxy(x1,temppos);
            cprintf("؛");
            gotoxy(x2,temppos);
            cprintf("؛");
        }
    gotoxy(x1,y2);
    cprintf("ب");
        for (temppos=x1;x2-temppos>1;temppos++)
            cprintf("ح");
    cprintf("¼");
    gotoxy(x1,y1);
}


 

____________________________________________________________________________


وهذا مثال آخر بسيط نوع ما:
وهو لتببين كيفية إستخدام الدوال السابقة:
 

#include "conio.h"
int main(void)
{
    int i, j;
    clrscr();
        for ( i=0 ; i < 9 ; i++ )
        {
            for ( j=0 ; j < 80 ; j++ )
                cprintf("c");
            cprintf("rn");
            textcolor(i+1);
            textbackground(i);
        }
    return 0;
}



 

______________________________________________________________________________

وهذا مثال آخر على دالة gotoxy :



 

#include "conio.h"
int main(void)
{
        clrscr();
        gotoxy(35, 12);
        cprintf("WooooooW it's easy in C");
        getch();
    return 0;
}

______________________________________________________________________________
 

و هناك أيضاً الدالتين :


 

int wherex( void ); // Return the current x location of the cursor

int wherey( void ); // Return the current y location of the cursor



 

وهي من ضمن الملف conio.h وهذا إذا كانت من مستخدمي منتجات
بورلاند أما إذا كنت من مستخدمي الفجول سي كمبايلر فهذه هي
دوال بلغة السي بإستخدام الــ win API :
 

int wherex( void )
{
        BOOL bSuccess;
        CONSOLE_SCREEN_BUFFER_INFO cinfo;

        bSuccess = GetConsoleScreenBufferInfo(m_hConsole, &cinfo);
        PERR( bSuccess, "GetConsoleScreenBufferInfo" );

    return cinfo.dwCursorPosition.X;
}

int wherey( void )
{
        BOOL bSuccess;
        CONSOLE_SCREEN_BUFFER_INFO cinfo;

        bSuccess = GetConsoleScreenBufferInfo(m_hConsole, &cinfo);
        PERR( bSuccess, "GetConsoleScreenBufferInfo" );

    return cinfo.dwCursorPosition.Y;
}


_______________________________________________________________________________
 

والدالة دليلي
 

void delay(int);

 

 

وهي دالة تؤخر العمل بحسب القيمة المعطاة وهذا أيضاً إذا كنت من
مستخدمي منتجات بورلاند و إذا كنت من مستخدمي منتجات
مايكروسوفت فهذه هي طريقة محاكاة الدالة مكتوبة بلغة السي:


 

for (int j = 0; j < 0xFFFFFF; j++)
            ; // delay loop



 

كل ما عليك هو وضع هذه الــ for داخل اللوب تبعك مثل:


 

#include"stdio.h"
#include"conio.h"
#include"windows.h"
main()
{
        int i, j;
        for (i = 0 ;(!_kbhit()) ; i++)
        {
            gotoxy(10, 10);
            printf("i=%d ",i);
            for ( j = 0; j < 0xFFFFFF; j++)
                    ; // delay loop

        }
}



 


جرب أن تحذف هذه الفقره و إنظر ما هي النتيجة


 

for (int j = 0; j < 0xFFFFFF; j++)
     ; // delay loop



 

و كلما زدت في عدد الـــ F  كلما زاد وقت الانتظار و العكس كلما قللت منها قل وقت الانتظار.

بالنسبه لعمل الدالة kbhit  فلن أشرحها هنا و لكنني سأكتفي بشرح مايكروسوفت عنها:

Return Value:

_kbhit returns a nonzero value if a key has been pressed. Otherwise, it returns 0.

Remarks:

The _kbhit function checks the console for a recent keystroke. If the function returns a nonzero value, a keystroke is waiting in the buffer. The program can then call _getch or _getche to get the keystroke.

 

مع مراعاة أنه مع كتابة أي من هذه الدالة في برنامج الفجول سي++ ( دوال الــ API ) لابد من إدراج الملف windows.h ضمن البرنامج

 

أتمنى من الله أن أكون قد وفقت في الطرح  و أراكم في دروس أخرى مع لغة السي ...
مع تحياتي ,,,

 

أخوك: طلال ...
 

 

 

 


Copyright © www.kettaneh.net