كيفية فتح مربع حوار غير مشروط بشكل صحيح من وحدة التحكم باستخدام MFC

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

  •  22-09-2019
  •  | 
  •  

سؤال

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

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

عند التحول إلى عديم النموذج باستخدام مربع الحوار 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);
}

أنظر أيضا إلى الرابط التالي: مجموعات أخبار مايكروسوفت

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