План действий, которые необходимо предпринять:
- заменить основной с 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);