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





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




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



__________________________________________________ ______________________________


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_H ANDLE), 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("\r\n");
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 ضمن البرنامج





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