كيفية فتح مربع حوار غير مشروط بشكل صحيح من وحدة التحكم باستخدام MFC
سؤال
أحتاج إلى إنشاء تطبيق وحدة تحكم يحتوي على ملف رئيسي() وظيفة والبوب أ حوار لا نموذج له, ، لذلك لا يزال بإمكان وحدة التحكم العمل بالتوازي مع مربع الحوار غير المشروط (القيام بأعمال أخرى، مثل التواصل مع مربع الحوار غير المشروط).
مهما حاولت، لم أستطع إلا أن أفرقع مشروط الحوار.(حيث تكون وحدة التحكم معلقة حتى يغلق مربع الحوار المشروط نفسه).
عند التحول إلى عديم النموذج باستخدام مربع الحوار Create() وShowWindow()، يتم عرض مربع الحوار بدون عناصر التحكم الخاصة به تجميد / كتلة (يمكنك رؤية مؤشر الساعة الرملية).
1) حاولت فتح مربع الحوار غير المشروط من الوظيفة الرئيسية ():
void main()
{
AfxWinInit(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW);
TestGUI * gui;
gui = new TestGUI();
gui->Create(TestGUI::IDD);
gui->ShowWindow(SW_SHOW);
// just to see if the modeless dialog responses
Sleep(10000);
}
2) حاولت فتح مربع الحوار غير المشروط من InitInstance() لفئة مشتقة من CWinApp:
extern int AFXAPI AfxWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow);
class MyApp : public CWinApp
{
public:
virtual BOOL InitInstance()
{
gui = new TestGUI();
gui->Create(TestGUI::IDD);
gui->ShowWindow(SW_SHOW);
return TRUE;
}
private:
TestGUI * gui;
};
MyApp my_app;
void main()
{
AfxWinMain(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW);
// just to see if the modeless dialog responses
Sleep(10000);
}
في جميع الحالات يتجمد الحوار غير النموذجي.
أعتقد أن هذا حل من سطر واحد.
الرجاء المساعدة.
تينكس,
فيرتيلكا
المحلول
مقتطف التعليمات البرمجية التالي يحل المشكلة:
#include "stdafx.h"
#include "TestGUI.h"
DWORD WINAPI ModelessThreadFunc(LPVOID)
{
TestGUI gui;
gui.Create(TestGUI::IDD);
gui.ShowWindow(SW_SHOW);
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, L"CloseModelessDialog");
MSG msg;
while(WaitForSingleObject(hEvent, 0) != WAIT_OBJECT_0)
{
while(::GetMessage(&msg, NULL, 0, 0))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
// event cleanup
CloseHandle(hEvent);
return 0;
}
void main()
{
// initialize MFC
AfxWinInit(GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW);
// create thread for the modeless dialog
CreateThread(NULL, 0, ModelessThreadFunc, NULL, 0, NULL);
// wait for the modeless dialog to close itself
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, L"CloseModelessDialog");
while(WaitForSingleObject(hEvent, 0) != WAIT_OBJECT_0)
{
// do other job
}
// event cleanup
CloseHandle(hEvent);
}
أنظر أيضا إلى الرابط التالي: مجموعات أخبار مايكروسوفت