Devil Code

هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

DevilCode


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

    Coder
    Coder
    Manager
    Manager


    عدد المساهمات : 202
    النقاط : 5785
    تاريخ التسجيل : 20/10/2009
    العمر : 37

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

    مُساهمة  Coder الأحد ديسمبر 26, 2010 8:45 pm

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


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



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



    أولاً:
    من الدوال المثيرة في أي لغة هي الدوال لتي تتحكم في الالوان من خلفية الشاشة و من لون النص المكتوب . و من تحديد مكان للنص و الكتابة فيه .
    إذا كنت تستخدم أحد منتجات بورلاند مثل: 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 ضمن البرنامج



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


      الوقت/التاريخ الآن هو الأربعاء مايو 15, 2024 2:26 pm