Frage

Ich brauche eine Konsolenanwendung zu erstellen, die eine main () hat Funktion und Pop einen modalen Dialog , so dass die Konsole noch arbeiten kann parallel zum modalen Dialog ( andere Arbeit verrichten, wie mit dem nicht modalen Dialog Kommunikation).

Was auch immer ich versuchte, konnte ich nur ein Pop-modal Dialog. (Wo die Konsole in halten, bis der modalen Dialog schließt selbst).

Bei der Umstellung auf modeless Dialog mit Create () und Showwindow () der Dialog ohne seine Kontrollen angezeigt wird und es freeze / Block (Sie können die Sanduhr Cursor sehen) .

1) Ich habe versucht, den modalen Dialog aus der main () Funktion, um Pop:

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) Ich habe versucht, den modalen Dialog aus dem InitInstance () eine CWinApp abgeleiteten Klasse Pop:

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);
}

In allen Fällen ist die modale Dialog einfrieren.

Ich glaube, dies ist eine eine Zeile Lösung.
Bitte Hilfe.

TNX,
Vertilka

War es hilfreich?

Lösung

Nach dem Code-Schnipsel löst das Problem:

#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);
}

Schauen Sie auch unter folgendem Link: Microsoft-Newsgroup

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top