كيف يمكنني الكتابة نفسها جزء من وحدة التحكم في نظام التشغيل Windows الأصلي C++ وحدة التحكم التطبيق دون استخدام 3rd الطرف المكتبة ؟
سؤال
لدي وحدة التحكم التطبيق الذي يحتاج إلى عرض حالة العناصر, ولكن بدلا من التمرير النص من قبل مثل المجنون أنا أفضل أن أرى الوضع الحالي تبقي تظهر على نفس المنوال.على سبيل المثال:
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).
في حالة جوزيف اقتراح لا تعطيك ما يكفي من المرونة ، إلقاء نظرة على وحدة API: http://msdn.microsoft.com/en-us/library/ms682073(مقابل.85).aspx.
في لينكس يمكنك إنجاز هذا بواسطة الطباعة \ب و/أو إلى stderr.قد تحتاج إلى تجربة للعثور على الحق في الجمع بين الأشياء في نظام التشغيل Windows.