كيف يمكنني الكتابة نفسها جزء من وحدة التحكم في نظام التشغيل Windows الأصلي C++ وحدة التحكم التطبيق دون استخدام 3rd الطرف المكتبة ؟

StackOverflow https://stackoverflow.com/questions/45286

  •  09-06-2019
  •  | 
  •  

سؤال

لدي وحدة التحكم التطبيق الذي يحتاج إلى عرض حالة العناصر, ولكن بدلا من التمرير النص من قبل مثل المجنون أنا أفضل أن أرى الوضع الحالي تبقي تظهر على نفس المنوال.على سبيل المثال:

Running... nn% complete
Buffer size: bbbb bytes

يجب أن يكون الإخراج ، حيث 'ن' هو الحالي مئوية كاملة ، و 'bbbb' هو حجم المخزن المؤقت, يتم تحديثها بشكل دوري على نفس المنوال من وحدة التحكم.

النهج الأول أخذت ببساطة المطبوعة العدد الصحيح من backspaces إلى وحدة التحكم قبل الطباعة الدولة الجديدة ، ولكن هذا بغيض الرجفة التي أريد التخلص منها.أنا أيضا أريد التمسك إما المكتبة القياسية أو MS-توفير وظائف (VC 8) حتى لا أعرض تبعية أخرى لهذا بسيطة تحتاج.

هل كانت مفيدة؟

المحلول

يمكنك استخدام SetConsoleCursorPosition.سوف تحتاج إلى الاتصال GetStdHandle للحصول على مؤشر إلى المخزن المؤقت للإخراج.

نصائح أخرى

يوسف JP ، CodingTheWheel كل ما قدمت مساعدة قيمة.

بالنسبة لي بسيطة القضية الأكثر مباشرة إلى الأمام النهج يبدو أن يكون على أساس CodingTheWheel الجواب:

// before entering update loop
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(h, &bufferInfo);

// update loop
while (updating)
{
  // reset the cursor position to where it was each time
  SetConsoleCursorPosition(h, bufferInfo.dwCursorPosition);

  //...
  // insert combinations of sprintf, printf, etc. here
  //...
}

لمزيد من المشاكل المعقدة, كامل وحدة API على النحو المنصوص عليه من قبل JP الجواب, بالتنسيق مع الأمثلة المقدمة عبر الرابط من جوزيف الجواب قد تكون مفيدة ، ولكن وجدت العمل الضروري استخدام CHAR_INFO مملة جدا لمثل هذا التطبيق بسيطة.

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

التحديث:سؤال تم تغيير 2 خطوط الانتاج بدلا من 1 مما يجعل جوابي لم يعد كاملة.أكثر تعقيدا نهج المرجح اللازمة.JP لديه فكرة الحق مع وحدة API.أعتقد الموقع التالي تفاصيل العديد من الأشياء التي سوف تحتاج إلى تحقيق هدفك.الموقع يذكر أيضا أن مفتاح الحد من وميض هو تقديم كل شيء على الشاشة قبل عرض ذلك.هذا صحيح كلما يتم عرض أي شيء على الشاشة سواء كان نص أو رسومات (2D أو 3D).

http://www.benryves.com/tutorials/?t=winconsole

في حالة جوزيف اقتراح لا تعطيك ما يكفي من المرونة ، إلقاء نظرة على وحدة API: http://msdn.microsoft.com/en-us/library/ms682073(مقابل.85).aspx.

في لينكس يمكنك إنجاز هذا بواسطة الطباعة \ب و/أو إلى stderr.قد تحتاج إلى تجربة للعثور على الحق في الجمع بين الأشياء في نظام التشغيل Windows.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top