الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

دالة مسح الشاشة !

مغلق
بدأه Khaled.Alshaya في 12 ديسمبر 2006 · 8 رد · 3,073 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أول شيء السلام عليكم .

بعدين ندخل في الموضوع :

معظم من برمج أو يبرمج على ++C أو C استخدم دوال مسح الشاشة كـ Clrscr في Borland Compilers .

أنا أتكلم عن الـ Command Line و ليس GUI .

هناك طريقة أخرى في Windows و هي كالتالي :

#include <cstdlib>

   .
   .
   .

system ("cls");

وجدت طريقة أخرى و هي بأن تطيع 24 سطر فارغ لأن طول الشاشة هو 24 سطر و لكنها ليست بكفاءة الدالتين السابقتين.

هل هناك أي أفكار عن تصميم دالة مشابهة .

ملاحظة : لا أتكلم عن دوال جاهزة أتكلم عن طريقة تصميم هذه الدالة ..

شارك و لو بفكرة بسيطة . :)

1
#2

الفكرة إن شاشة الكونسول دى مربوطة ب buffer فى الذاكرة و كل ما عليك علشان تفضى الشاشة إنك تعمل flush لل buffer دا, الدالة اللى بتعمل كدة إيه بالظبط فى ال Win32 API مش عارف :) بس فى دالة بتملا ال output buffer بالحرف اللى تختاره (اللى هو حيبقى space) و بعد كدة ممكن تخلى ال cursor يقف عند أول حرف.

ولله أعلم

#3

مو ممكن (في اليونكس) انه يكون مرتبط بملف الـ stdout ؟؟

يعني ممكن يكون نفس الـ file هذا تسوي له clear وتمسح محتواه ما اتوقع ان كل الحروف الي تكون داخل الكنسول في بفر معين لأنه كبير جداً ولا لا ؟

خصوصا ان (في اليونكس) نستعمل Line Buffered للـ Command والـ IO بشكل عام (طبعا غير الـ Files)

لأن الملفات تستعمل الـ fully buffered

مجرد اجتهاد والخطأ احتماله اعلى من الصحة :)

#4

يعني معنى هذا الكلام أن الذي يعرض على الشاشة يكون في مكان في الذاكرة . عند القيام بتفريغ الذاكرة Flushing Buffer يمكن مسح الشاشة.

سأحاول البحث في الموضوع. الذي يجد فكرة أو طريقة ممكن أنه يشاركنا . :)

#5

سلام عليكم

شكراً للأخ Khaled.Alshaya على فتح الموضوع و عذراً معلوماتى قديمة شوية.

انا متخيل السؤال ده الهدف منه مسح الشاشة بطرق متنوعة لشاشات انتقال. مثلاً مسحها سطر بسطر أو من اليمين للشمال او ما شابه. ارجو ان اكون فهمت السؤال بشكل صحيح.

مسح الشاشة... من الدوال التى يجب ان تعمل بسرعة عالية لذلك افضل فى البداية ذكر بعض الحقائق عن كارت الشاشة. اولاً يحتوى كارت الشاشة على ذاكرة buffer يتم قرائتها بشكل مستمر للعرض على الشاشة refresh rate. و ايضا يوجد مجموعة من الرجيستر مسؤوله عن نظام القراءة ( حروف او نقط و كذلك الكثافة اللونية 16 لون 256 لون و حتى True Type. و يتم تحديد الذاكرة عن طريق عنوان ( مكان بداية الذاكرة) معين. و من هنا وجدت فكرة تخصيص مكان فى الذاكرة لعمل شاشات آخرى. مثلاً شركة Borland تدعم bgi وهى توفر دوال للرسم على شاشتين(واحدة على الكارت و الآخرى فى الذاكرة) و تستطيع عرض احدهما. نفس المنطق مطبق فى OpenGL. و الهدف بالطبع تجهيز الرسمة على شاشة ثم عرضها بحيث لا يشعر المستخدم بعملية الرسم.

نرجع للمسح.

1- باستخدام المعارضات interrupts. مع Borland ستجد دوال خاصة لذلك فى dos.h اعتقد الخاص بالشاشة هوinterrupt10. و دالة المسح هى 0x01 مش واثق.

2- بملئ الشاشه بفراغات( او اى شئ آخر) و اسرع طريقة هى pointers. و ممكن ترجع لكتب Robert Lafore القديمة.

3- استخدام دوال النظام ذى system("cls");

ارجو ان اكون شاركت فى الاجابة و مستعد لمزيد من التفاصيل.

سلام عليكم

#6

كما ذكر الاخوة . ذاكرة الـ VGA تعطينا مساحة من الذاكرة Buffer بحيث نستخدمها كـ"سبورة" للكتابه على كرت الـ VGA .

ويبدأ الموقع الـ Buffer في الذاكرة الفيزيائيه من 0xB8000 , يمكن ان نتصور حدودها كـمصفوفه 80x25 بحيث ان كل عنصر منها عباره عن قيمه مكونه من 16 بت , تمثل العنصر الذي سوف يتم عرضه .

وللقيام بعمليه المسح , فيكفي ان نقوم بعمليه وضع رمز فارغ مع لون معين وليكن الابيض .الكود التالي هو لداله بسيطه تستخدم هذا المفهوم للقيام بعمليه المسح :

void myclrscr()
{
  unsigned short *vidmem = (unsigned short  *) 0xb8000;
  unsigned int i=0;
  for(i=0;i<(80*25);i++)
  {
	vidmem=(unsigned char) ' ' | 0x7;
  }
}

تم تعديل هذه المشاركة بواسطة محمد معاشر في 13 ديسمبر 2006 في 09:07

لا إله الإ الله وحده لا شريك له الملك وله الحمد يحي ويميت وهو على كل شئ قدير

------------------------------------------------------------------------------------------------

gazabigBanner.jpg

------------------------------------------------------------------------------------------------

#7

أهلين من جديد ..

و الله الشباب مو مقصرين في شرح الموضوع و أعتقد أني فهمت الموضوع بشكل عام ..

شكراُ للشباب اللي شاركوا في الموضوع .. :)

في الحقيقة أخ PointerVC معلوماتك جميلة جداً .. و بالمناسبة الحديث عن المكتبة الجميلة , بالنسبة لي , BGI من Borland .. احدى المشاريع لدينا في الجامعة كانت تغليف الأمور الرئيسية في المكتبة باستخدام الفئات Classes لتسهيل التعامل معها. لأنها في الحقيقة مبنية باستخدام C .

الأخ محمد معاشر .. رد كامل مكمل و مشكور على الرد الذي لا يحتاج إلى استفسار .. :)

بالتوفيق للجميع .. :rolleyes:

#8
Blueteeth كتب:
الفكرة إن شاشة الكونسول دى مربوطة ب buffer فى الذاكرة و كل ما عليك علشان تفضى الشاشة إنك تعمل flush لل buffer دا, الدالة اللى بتعمل كدة إيه بالظبط فى ال Win32 API مش عارف :) بس فى دالة بتملا ال output buffer بالحرف اللى تختاره (اللى هو حيبقى space) و بعد كدة ممكن تخلى ال cursor يقف عند أول حرف.

ولله أعلم

السلام عليكم

جرب الكود التالي

#include <windows.h>

void cls()
{
   HANDLE hCons=GetStdHandle(STD_OUTPUT_HANDLE);
   COORD cPosition = {0,0};
   DWORD lpNumberOfCharsWritten;
   CONSOLE_SCREEN_BUFFER_INFO stc_scbi;
   GetConsoleScreenBufferInfo(hCons,&stc_scbi);
   //you can use return the &lpNumberOfCharsWritten insted the NULL
   FillConsoleOutputCharacter(hCons,' ',(stc_scbi.dwSize.X * stc_scbi.dwSize.Y), cPosition, NULL);
   SetConsoleCursorPosition( hCons, cPosition );
}

ولله أعلم

تم تعديل هذه المشاركة بواسطة Mo7eb_Alrasool في 15 ديسمبر 2006 في 08:26

سبحانك اللهم وبحمدك أشهد ان لا اله الا أنت

أستغفرك وأتوب اليك

الهم صلي وسلم وبارك على سيدنا وحبيبنا محمد

#9

كما قيل:

#ifdef _WIN32
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coordScreen = { 0, 0 }; /* here's where we'll home the cursor */
DWORD cCharsWritten;
CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */
DWORD dwConSize; /* number of character cells in the current buffer */
/* get the number of character cells in the current buffer */
GetConsoleScreenBufferInfo(hConsole, &csbi);
dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
/* fill the entire screen with blanks */
FillConsoleOutputCharacter(hConsole, (dftChar)_T(' '), dwConSize, coordScreen, &cCharsWritten);
/* get the current text attribute */
GetConsoleScreenBufferInfo(hConsole, &csbi);
/* now set the buffer's attributes accordingly */
FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
/* put the cursor at (0, 0) */
SetConsoleCursorPosition(hConsole, coordScreen);
#else
printf( _T("\33[2J") );
#endif

قطرة الماء تـثـقب الحجر.. لا بالعنف. لكن بتكرار المحاولة

at4re.gif

منتديات الفريق العربي للهندسة العكسية 不喜欢的勿入! www.at4re.com

هذا الموضوع مغلق.

مواضيع مشابهة