سؤال

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

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

أقوم بتغيير الشريط باستخدام "المواد الأساسية" (مجرد CWnd مع CStatic) من الحصول على خلفية رمادية متوسطة عند عدم التمييز إلى خلفية زرقاء عند تحريك الماوس فوقها.كل شيء يعمل بشكل جيد، تبدو رسائل OnDragEnter وOnDragExit قوية وتقوم بتعيين علامة تشير إلى حالة التمييز.ثم في OnCtrlColor أفعل هذا:

    if (!m_bHighlighted) {
    pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kBackgroundColour);
}
else {
    pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kHighlightedBackgroundColour);
}

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

هل هناك أي طريقة يمكنني من خلالها التغلب على هذا؟

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

المحلول 3

شكرًا على الإجابات يا رفاق، أجريان، يبدو أنك دائمًا ما تأتي بالمساعدة لأسئلتي، لذا شكرًا إضافيًا.

والحمد لله أن الإجابة هذه المرة كانت واضحة إلى حد ما....

ImageList_DragShowNolock(FALSE);
m_pDragDropTargetWnd->SendMessage(WM_USER_DRAG_DROP_OBJECT_DRAG_ENTER, (WPARAM)pDragDropObject, (LPARAM)(&dragDropPoint));
ImageList_DragShowNolock(TRUE);

يؤدي هذا إلى إيقاف رسم الصورة المسحوبة، ثم يرسل رسالة إلى النافذة التي يتم إدخالها لإعادة رسمها في حالة مميزة، ثم يعيد رسم صورة السحب في النهاية في الأعلى.الواضح انه انهى الخدعة.

نصائح أخرى

يعد تصحيح الأخطاء عن بعد بمثابة هبة من السماء لتصحيح الأخطاء المرئية.يعد الإعداد أمرًا صعبًا، ولكن وجود جهاز افتراضي جاهز لتصحيح الأخطاء عن بُعد سيؤتي ثماره بالتأكيد.

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

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

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