سؤال

أحاول حفظ ملف باستخدام GetSaveFileName وتريد أن يكون لديك بعض المنبثقة الإضافية في أسفل مربع حوار حفظ الملف الخاص بي للسماح للمستخدم بتحديد المزيد من الخيارات. أحاول متابعة وثائق MSDN (على وجه التحديد تخصيص على طراز المستكشف) حول هذا الموضوع ولكن لا يمكن أن يظهر العنصر المخصص الخاص بي. أعتقد أنني قمت بإعداد OPENFILENAME بنية بشكل صحيح وأنا أتلقى مكالمات في بلدي OFNHookProc. بقدر ما أعرف أنه خلال WM_INITDIALOG الرسالة التي يجب أن أقوم بإنشائها الفرعية ، وهو ما أفعله:

HWND settings_popup =
    ::CreateWindowExW(WS_EX_CLIENTEDGE | WS_EX_NOPARENTNOTIFY,
                      L"COMBOBOX",
                      L"Settings:",
                      WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_BORDER | CBS_DROPDOWNLIST,
                      10,
                      10,
                      150,
                      30,
                      dialog, // the window parameter from the OFNHookProc
                      NULL,
                      ::GetModuleHandle(NULL),
                      NULL);

if (settings_popup)
{
    HWND parent = ::GetParent(settings_popup); // for verification
    ::ShowWindow(settings_popup, SW_SHOW);
    ::EnableWindow(settings_popup, true);
}

أنا أيضا العودة 1 من بلدي OFNHookProc ل WM_INITDIALOG رسالة و 0 لكل شيء آخر.

في كل محاولاتي للحصول على combobox لإظهارها في مربع الحوار ، فإنه لا يأتي. ما الذي أفتقده من التعليمات البرمجية لجعل Combobox جزءًا من تخصيص مربع الحوار "حفظ" الخاص بي؟

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

المحلول

عند استدعاء CreateWindowex () لإنشاء نافذة طفلك ، تحتاج إلى استخدام GetParent () للحصول على النافذة الأصل لحوار الحوار ، ثم استخدام هذا hwnd كنافذة الأصل. لا تستخدم مربع الحوار نفسه باعتباره الوالد. بعبارات أخرى:

HWND settings_popup =
    ::CreateWindowExW(WS_EX_CLIENTEDGE | WS_EX_NOPARENTNOTIFY,
                      L"COMBOBOX",
                      L"Settings:",
                      WS_CHILD | WS_CLIPSIBLINGS | WS_VSCROLL | WS_BORDER | CBS_DROPDOWNLIST,
                      10,
                      10,
                      150,
                      30,
                      ::GetParent(dialog),
                      NULL,
                      ::GetModuleHandle(NULL),
                      NULL);

نصائح أخرى

عادةً عند إضافة عناصر تحكم إلى مربع حوار مشترك ، توجد عناصر التحكم الجديدة هذه في قالب حوار (كمورد أو في الذاكرة). بهذه الطريقة يعتني Windows بالموقف.

إذا كنت لا تزال ترغب في إنشاء عناصر التحكم الخاصة بك في وقت التشغيل ، أعتقد أنه يتعين عليك أيضًا تغيير حجم الوالدين ووضعه WM_INITDIALOG أو CDN_INITDONE (والديك هو مربع حوار فارغ داخل الحوار الرئيسي) استخدم أداة مثل Winspy ++ إلى "تصحيح" الحوار في وقت التشغيل

تمرير عناصر التحكم الخاصة بك في قالب حوار منفصل reessource في معلمة lptemplatename لهيكل OpenFilename. هذا يعمل بكل بساطة وموثوقية. تم وصفه في الرابط الذي أشرت إليه ،

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