Оконный интерфейс вместо консоли в c - PullRequest
1 голос
/ 17 марта 2010

У меня есть консольное приложение в c. Я хочу преобразовать в оконное приложение, пожалуйста, помогите мне, чтобы я мог сделать это возможным.

Ответы [ 2 ]

3 голосов
/ 17 марта 2010

Это огромная тема, требующая отдельного обсуждения. Вы можете изучить некоторые инструменты GUI. Qt или wxWidgets подойдут (хотя они написаны на C ++, а не на C). Если вы в кроссплатформенной разработке C, вы можете взглянуть на GTK +. Если вы планируете писать только программы для Windows, вы можете изучить Windows API. Какой бы путь вы ни выбрали, доступно много документов, но каждый из них требует много изучения и не может быть объяснен здесь.

2 голосов
/ 17 марта 2010

План действий, которые необходимо предпринять:

  • заменить основной с WinMain
  • изменить подсистему с консоли на окно
  • создать главное окно или диалог (здесь может пригодиться редактор ресурсов) и соответствующую ему процедуру
  • создать цикл сообщений
    • изменить структуру вашей программы, чтобы она выполнялась в цикле (программа всегда должна быть ответственной)
    • или запустите "последовательную консольную" программу в отдельном потоке, просто отправив свой вывод в "окно"

Первые два довольно просты, большая часть работы заключается в следующих шагах. если вы хотите, чтобы окно было просто вашей собственной копией консоли, вы можете создать диалог, содержащий один текст или элемент управления редактирования, и реализовать простую процедуру диалога и цикл сообщений. Далее следуют некоторые фрагменты кода, но предоставление полного и рабочего образца выходит за рамки разумного пространства. Если вы понимаете приведенный ниже код, думаю, вам стоит начать. Если нет, я боюсь, что вам придется сначала изучить основы программирования Windows.

Процедура диалога

HWND consoleEditHWnd;

static int CALLBACK ConsoleDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch (message)
  {
    case WM_INITDIALOG:
    {
      InitWindow((HINSTANCE)hInstApp,hDlg);
      consoleEditHWnd = GetDlgItem(hDlg,IDC_CONSOLE_EDIT);
      return TRUE;
    }


    case WM_SIZE:
      if (consoleEditHWnd)
      {
        RECT rect;
        GetClientRect(hDlg, &rect);
        MoveWindow(
          consoleEditHWnd, rect.left, rect.top,
          rect.right - rect.left, rect.bottom - rect.top, TRUE
        );
      }
      break;
  }
  return FALSE;
}

Создание диалога и цикл сообщений

    hwndApp = CreateDialog(hInst, MAKEINTRESOURCE(IDD_CONSOLE), NULL, ConsoleDlgProc);
    ShowWindow((HWND)hwndApp,SW_SHOW);
    UpdateWindow((HWND)hwndApp);

    MSG msg;
    while( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) )
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }

Запись в консоль

Если вы хотите добавить текст в «консоль», вы можете сделать это, используя

  int count = GetWindowTextLengthW(consoleEditHWnd);
  ... allocate a buffer
  GetWindowTextW(consoleEditHWnd,buffer,count+newTextSize);
  ... append
  SetWindowTextW(consoleEditHWnd,buffer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...