Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 13.07.2013
Сообщений: 9

Создания и работа консоли в графическом приложении

05.01.2014, 05:17. Показов 1279. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уважаемые форумчане. Я один из множества студентов, поступивших на программирование для создания своей игры. Я изучаю с++ всего пол года, до этого был год си, и по этому могу не знать всех нюансов. Сначала, работая на си, я думал создать игру в консоли, а потом переделать под графику, но во 2 семестре нам стали преподавать openGL, и я понял, что переделать будет сложновато. Но так как особо изучать графику у меня времени нет, то я решил, что буду реализовывать все в консоли, и потихоньку добавлять все в графическое приложение, по этому мне нужно гибридное приложение, с окном, но и с консолью. Окно я создаю на winapi, прочитав пару книжек я набрал небольшой кусок кода, который позволяет создать окно и только, вот он:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <windows.h>
#include <iostream>
using namespace std;
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
    switch(Message)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hWnd,Message,wParam,lParam);
}
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpczCmdParam, int nCmdShow)
{
    HWND hWnd;
    WNDCLASS WndClass;
    MSG Msg;
    LPCTSTR lpzClassName=TEXT("My Window Class!");
    WndClass.style=CS_HREDRAW|CS_VREDRAW;
    WndClass.lpfnWndProc=WndProc;
    WndClass.cbClsExtra=0;
    WndClass.cbWndExtra=0;
    WndClass.hInstance=hInstance;
    WndClass.hIcon=LoadIcon(NULL,IDI_WINLOGO);
    WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.lpszMenuName=NULL;
    WndClass.lpszClassName=lpzClassName;
    if(!RegisterClass(&WndClass))
    {
        MessageBox(NULL,"Cannot register class","Error",MB_OK);
        return 0;
    }
    hWnd=CreateWindow(lpzClassName,TEXT("NEW v 0.00000gui"),
        WS_OVERLAPPEDWINDOW, 60,60,200,200, NULL, NULL, 
        hInstance, NULL);
    if(!hWnd)
    {
        MessageBox(NULL,"Cannot create window","Error",MB_OK);
        return 0;
    }
 
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
 
    while(GetMessage(&Msg,NULL,0,0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}
Работаю я в visual studio 2012. Для создания проекта я выбрал пустой проект, что бы всякие stdafx.h не мешали мне. Данный код работал, все было хорошо, но надо же консоль где то взять. Погуглив, я нашёл функцию AllocConsole(), которая своё дело выполняет. Но когда я работал в консоли, код начинался с мейна, где то же он должен начинатся и здесь, так что я выбрал вот этот участок кода:
C++
1
2
3
4
5
6
7
8
9
10
ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
    AllocConsole();
        //main{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE);
        //}
    while(GetMessage(&Msg,NULL,0,0))
       {
Все работает, консоль есть, но как в неё выводить что то? cout не работает, пришлось использовать WriteConsole(), но использовать каждый раз запись наподобие WriteConsole(h,(const char*)s.data(),6,0,0); вместо простого cout<<s; как то не очень хочется, так что вот первый вопрос:
1 как в созданной через AllocConsole() консоли использовать функции cout/cin, или хотя бы printf?

Увидев, что консоль создаётся и план мой можно воплотить в жизнь, я решил соединить все мои различные версии этого проекта воедино и создал один новый проект. Ну и слияние я решил начать как раз с графической части, ибо в пустом проекте winmain это основа. Но скопировав код, я обнаружил, что он не компилируется. Как выяснилось, строки MessageBox(NULL,"Cannot register class","Error",MB_OK); и им подобные не компилируются, точнее текстовые части, но если написать MessageBox(NULL,L"Cannot register class",L"Error",MB_OK);. Я конечно не спец, но вроде дело в юникоде. Я не знаю, как он включился, включался ли вообще и как его использовать. Как отключить его в vs2012 я не нашёл. И я вроде бы не против юникода, я считаю, что за ним будущее, ибо миру нужна универсальность, но каждый раз писать L"" и использовать wstring не хочется, да и нужно ли? и вот второй вопрос:
2 как отключить юникод, и нужно ли его вообще отключать, может все нормальные программисты используют wstring и прочее?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.01.2014, 05:17
Ответы с готовыми решениями:

Создания и работа консоли в графическом приложении
Доброго времени суток, уважаемые форумчане. Я один из множества студентов, поступивших на программирование для создания своей игры. Я...

Вывод консоли в оконном приложении
Мне нужно затестировать как работает функция, т.е. выводить каждую операцию... Что - то неправильно клеит биты у меня...void...

Клавиши F1-F12 в консоли, и работа с мышкой в консоли
Я искал на сайте, но не нашел упоминания о том как обрабатывать и или узнавать где находится курсор мышки (и еще мне надо бы узнать нажатие...

7
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.01.2014, 07:38
Цитата Сообщение от AndyAdjutor Посмотреть сообщение
как отключить юникод,
Свойства проекта - Свойства конфигурации - Общие - Набор символов.
1
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
05.01.2014, 11:40
Цитата Сообщение от AndyAdjutor Посмотреть сообщение
как в созданной через AllocConsole() консоли использовать функции cout/cin, или хотя бы printf?
Можно сделать прогу как консольную - тогда там с выводом проблем не должно быть, а окошкам хуже точно не станет. Есть ещё вариант
C++
1
freopen("CONOUT$", "w", stdout);
1
0 / 0 / 0
Регистрация: 13.07.2013
Сообщений: 9
05.01.2014, 15:21  [ТС]
первая проблема решена добавлением двух дефайнов:
C++
1
2
#define cin freopen("CONIN$", "r", stdin); cin
#define cout freopen("CONOUT$", "w", stdout); cout
спасибо за это Somebody
вторая то же решена, спасибо alsav22, но это фейл, ибо я не увидел во вкладке основные слова юникод, ибо ожидал, что будет написано unicode
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.01.2014, 15:27
Цитата Сообщение от AndyAdjutor Посмотреть сообщение
ибо ожидал, что будет написано unicode
А что же там написано?
0
0 / 0 / 0
Регистрация: 13.07.2013
Сообщений: 9
05.01.2014, 15:30  [ТС]
там написано Юникод, по русски написано, и из за этого я и не заметил
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
05.01.2014, 16:40
Цитата Сообщение от AndyAdjutor Посмотреть сообщение
C++
1
2
#define cin freopen("CONIN$", "r", stdin); cin
#define cout freopen("CONOUT$", "w", stdout); cout

Чувствую следующий вопрос: почему какая-то странная ошибка компиляции на самой обычной строчке.
0
0 / 0 / 0
Регистрация: 13.07.2013
Сообщений: 9
05.01.2014, 16:44  [ТС]
Эмм...где?
Вроде ошибки не выскакивает, а что за ошибка?
единственное, wstring не работает, но я решил пока с юникодом повременить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.01.2014, 16:44
Помогаю со студенческими работами здесь

ПО для создания макетов приложении под Windows 7
Доброго времени суток! Хотелось бы узнать, есть ли такое ПО для быстрого создания макета программы под Windows 7 и ниже? Знаю что есть...

Не выводит русские символы в консоли в одном приложении, Code::Blocks
Делаю консольную программу, она должна заменять букву &quot;а&quot; на &quot;у&quot; из введенного текста, проблемы с выводом русского именно в ней (в других...

Работа в графическом режиме
Предположим, вы встречаете мага, который умеет считать время и который раскроет вам секреты звезд. Почему звезды сияют на небе? Каждая...

Работа с массивом в графическом окне
Столкнулся с проблемой заполнения массива матрицы в новом окне (работал в CodeBlocks-EP). В файле Определитель - основное содержится...

Borland C 3.14 Работа в графическом режиме!!!
Меня интересует каким образом можно вводить/выводить информацию в графическом режиме. Существут ли аналоги функций...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru