C++ Windows API цикл обработки сообщений

158
15 января 2019, 14:40

Есть Windows API окно обернутое в клас. Создается в Windows API main методе например так:

Window* window = new Window();

В классе Window есть некий список Controls. Цикл обработки сообщений сидит в конструкторе Window и тем самым не дает работать с window после его создания.

Window* window = new Window();
Panel* panel = new Panel(); // не работает
window->Controls-Add(panel); // не работает

Где хранить цикл обработки сообщений чтобы была возможность работать с обьектом после его создания? Я знаю что можно вынести его из конструктора класса в main метод но соответственно нужно ещё и вытащить HWND из класса. Что если окна два? Хочется чтобы все обрабатывалось в классе.

Answer 1

Вопрос выдает полное непонимание как работает Windows программа... вам бы почитать Петцольда.

По теме: цикл сообщений нельзя размещать в конструкторе. Собственно, цикл сообщений это и есть Windows программа - все, что делает любая неконсольная программа Windows, это выполнение цикла сообщений. Выглядит она вариацией вот такого кода:

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
    // Initialize app and create main window
    InitApp();
    // Run message loop
    MSG msg;
    while(::GetMessage(&msg, NULL, 0, 0)) {
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);
    }
    return msg.wParam;
}

(код немного упрощен, поскольку не проверяет возврат по ошибке GetMessage. В данном конкретном случае ошибка крайне маловерятна, поскольку все аргументы гарантированно корректны).

Обычно программист не пишет сам цикл сообщений, а пользуется каким-либо фреймворком - MFC, wxWidgets, Qt, и т.п.

Не могу ничего сказать насчет фреймворка для Managed C++/CLI (по моему мнению, Managed C++ относится к C++ примерно так же, как Javascript относится к Java), но насколько я помню, для C# главная программа выглядит примерно так:

  static class Program {
    static void Main() {
      Application.Run(new MainForm());
    }
  }
READ ALSO
Создание таблиц в PostgreSql из сгенерированных POJO классов из схемы AVRO

Создание таблиц в PostgreSql из сгенерированных POJO классов из схемы AVRO

Всем привет! Может кто сталкивался или знает куда копать?

200
MyClass<> myClass = new MyClass<>();

MyClass<> myClass = new MyClass<>();

И такЕсть известный класс ArrayList

148
Вычисление строк по hashCode

Вычисление строк по hashCode

Поставлена такая задача

207
Сортировка элементов в GridView

Сортировка элементов в GridView

// С Collectionssort(colors); показывает ошибку:

186