القبض على الشاشة لا يعمل على MFC التطبيق في ويندوز فيستا

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

  •  01-07-2019
  •  | 
  •  

سؤال

لدينا بعض التطبيقات الداخلية بنيت في MFC مع OpenGL إجراءات الرسم.أنهم جميعا استخدام نفس رمز رسم على الشاشة طباعة الشاشة أو حفظ إلى ملف JPEG.كل شيء كان على ما يرام في ويندوز XP و أنا بحاجة إلى العثور على طريقة لجعلها تعمل على ويندوز فيستا.

في ثلاثة من التطبيقات, كل شيء يعمل.في واحد المتبقية ، يمكنني الحصول على النافذة الحدود ، العنوان شريط القوائم و شريط المهام ولكن الداخلية لم يظهر.كما قلت هذه التطبيقات استخدام نفس رمز الكتابة إلى الشاشة و التقاط صورة نافذة, و الفرق الوحيد الذي أراه أن يبدو وكأنه قد تكون ذات صلة هو أن مشكلة تطبيق يستخدم MFC واجهة مستندات متعددة ، في حين أن تلك التي تعمل على استخدام وثيقة واحدة واجهة.

أما الجواب ليس على النت, أو أنا أسوأ في غوغلينغ مما كنت اعتقد.سألت في منتديات MSDN فقط اقتراح عملي حصلت استخدام GDI+ بدلا من GDI, و التي لم تفعل شيئا مختلفا.لقد حاولت أشياء مختلفة مع كل جزء من التعليمات البرمجية التي يلتقط طباعة أو حفظ بالنظر إلى مؤشر إلى النافذة ، على ما يبدو انها مسألة من النافذة نفسها.لم بناؤها المخالف باستخدام تطبيق SDI الآن و أنا حقا لم يكن لديك أي أفكار أخرى.

وقد أي شخص ينظر إلى شيء مثل هذا ؟


ما لدي هو أربعة التطبيقات.أنها تستخدم الكثير من ومشاركتها الفعلية .ساعة .cpp الملفات حتى أعرف الرسم و التقاط الشاشة رمز مطابق.

هناك WindowtoDIB() الروتينية التي تأخذ *pWnd ، مصدر المستطيل الوجهة الحجم.يبدو قليلا جدا تكييف Microsoft رمز, و لقد وجدت وظائف أخرى في هذا الملف على موقع مايكروسوفت.من أربعة تطبيقات ثلاثة التعامل مع هذا على ما يرام, ولكن لا أحد.الفرق الأكثر وضوحا هو أن مشكلة واحدة هي MDI.

يبدو لي مثل *pWnd هو المشكلة.أنا لست MFC المعلم عن طريق تسديدة طويلة, و يبدو لي أن المشكلة قد تكون لدينا نافذة واحدة الإعداد في SDIs أكثر من واحد في MDI.قد يكون مرور خاطئة *pWnd إلى وظيفة.

في غضون ذلك بدأ يعمل بشكل صحيح على 64 بت فيستا آلة الاختبار ، على الرغم من أنه لا يزال لا يعمل على 32 بت ويندوز فيستا آلة.ليس لدي أي فكرة عن السبب.لم يتغير أي شيء منذ آخر الاختبارات ، لم أكن أعتقد أي شخص آخر.(32 بت, مفتاح طباعة الشاشة تعمل كما هو متوقع, لكنه لا يحفظ الشاشة كملف JPEG.)

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

المحلول 5

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

نصائح أخرى

سؤالك العنوان يذكر التقاط الشاشة لكن السؤال الفعلي لا.يرجى تقديم تفاصيل أكثر وضوحا.هي المشكلة التي يمكنك القيام به شاشة القبض على ثلاثة من التطبيقات الخاصة بك, ولكن ليس الجزء الرابع ؟ يمكنك استخدام مختلف القبض على الشاشة البرمجيات التي يمكن التقاط OpenGL/DirectX ويندوز.تلك الأسطح يتم التعامل معها مباشرة من قبل مدير النوافذ و لن تظهر مع بسيطة 'PrtScn'.

التحول إلى GDI+ لا حل لها ولا تبديل إلى SDI.

إذا كان المحتوى من CView التي تريد, ثم نعم, ينبغي أن يكون على حق واحد.إذا كان محتوى الشاشة بأكملها (على الأقل المحتوى ، دون شريط الأدوات(s) و شريط الحالة) ، ثم عليك أن تمر عليه CMainFrame (هذا هو الاسم الافتراضي الذي قد يكون تم تغيير واحد مشتق من CMDIFrameWnd).

يمكنك إضافة رمز من WindowToDIB()?لقد حاولت ذلك وأنه يعمل بالنسبة لي (TM), ولكن من دون OpenGL البرمجية في الرأي.محاولة تمرير التالية ويندوز الخاص بك WindowToDIB (وظيفة):

CMainFrame* mainfrm = static_cast<CMainFrame*>(::AfxGetMainWnd());

- mainfrm

- mainfrm->MDIGetActive()

- mainfrm->MDIGetActive()->GetActiveView()

و انظر ما تحصل عليه.

محتويات كل نافذة دايركت الأسطح فقط تجميعها من قبل مدير النوافذ في بطاقة الرسومات.أنك سوف لا تكون قادرة على التقاط هذا إلا إذا كنت إيقاف تشغيل واجهة جديدة (DWM) أو رمز خصيصا لالتقاط الشاشة من DWM.

ويكيبيديا لديها وصفا جيدا من Desktop Window Manager (DWM)

آسف, أنا لا أفهم.أنت تحاول الحصول على مفتاح طباعة الشاشة على العمل على التطبيقات ؟ أو كنت تحاول الحصول على WindowtoDIB() وظيفة للعمل ، والتي تأخذ 'قطة' (من داخل التطبيق الخاص بك) من التطبيق نفسه ، حتى أنه يمكن حفظ صورة الملف ؟

أيضا ماذا تقصد مع انه مفتاح طباعة الشاشة تعمل كما هو متوقع, لكنه لا يحفظ الشاشة كملف JPEG.'?طباعة الشاشة فقط نسخ إلى الحافظة ، ماذا يحدث عند لصق في الطلاء ؟

إذا كان الخاص بك WindowtoDIB() وظيفة فقط 'يلتقط' النافذة يمكنك تمرير إلى ذلك ، إذا نعم ، MDI التابع ويندوز لن تظهر.

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