Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
AndyAdjutor
0 / 0 / 0
Регистрация: 13.07.2013
Сообщений: 9
05.01.2014, 05:17     Создания и работа консоли в графическом приложении #1
Доброго времени суток, уважаемые форумчане. Я один из множества студентов, поступивших на программирование для создания своей игры. Я изучаю с++ всего пол года, до этого был год си, и по этому могу не знать всех нюансов. Сначала, работая на си, я думал создать игру в консоли, а потом переделать под графику, но во 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 и прочее?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.01.2014, 07:38     Создания и работа консоли в графическом приложении #2
Цитата Сообщение от AndyAdjutor Посмотреть сообщение
как отключить юникод,
Свойства проекта - Свойства конфигурации - Общие - Набор символов.
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
05.01.2014, 11:40     Создания и работа консоли в графическом приложении #3
Цитата Сообщение от AndyAdjutor Посмотреть сообщение
как в созданной через AllocConsole() консоли использовать функции cout/cin, или хотя бы printf?
Можно сделать прогу как консольную - тогда там с выводом проблем не должно быть, а окошкам хуже точно не станет. Есть ещё вариант
C++
1
freopen("CONOUT$", "w", stdout);
AndyAdjutor
0 / 0 / 0
Регистрация: 13.07.2013
Сообщений: 9
05.01.2014, 15:21  [ТС]     Создания и работа консоли в графическом приложении #4
первая проблема решена добавлением двух дефайнов:
C++
1
2
#define cin freopen("CONIN$", "r", stdin); cin
#define cout freopen("CONOUT$", "w", stdout); cout
спасибо за это Somebody
вторая то же решена, спасибо alsav22, но это фейл, ибо я не увидел во вкладке основные слова юникод, ибо ожидал, что будет написано unicode
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.01.2014, 15:27     Создания и работа консоли в графическом приложении #5
Цитата Сообщение от AndyAdjutor Посмотреть сообщение
ибо ожидал, что будет написано unicode
А что же там написано?
AndyAdjutor
0 / 0 / 0
Регистрация: 13.07.2013
Сообщений: 9
05.01.2014, 15:30  [ТС]     Создания и работа консоли в графическом приложении #6
там написано Юникод, по русски написано, и из за этого я и не заметил
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
05.01.2014, 16:40     Создания и работа консоли в графическом приложении #7
Цитата Сообщение от AndyAdjutor Посмотреть сообщение
C++
1
2
#define cin freopen("CONIN$", "r", stdin); cin
#define cout freopen("CONOUT$", "w", stdout); cout

Чувствую следующий вопрос: почему какая-то странная ошибка компиляции на самой обычной строчке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2014, 16:44     Создания и работа консоли в графическом приложении
Еще ссылки по теме:

C++ Работа с файлами в консольном приложении
Работа с русским языком в консольном приложении C++
C++ Создания и работа консоли в графическом приложении

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

Или воспользуйтесь поиском по форуму:
AndyAdjutor
0 / 0 / 0
Регистрация: 13.07.2013
Сообщений: 9
05.01.2014, 16:44  [ТС]     Создания и работа консоли в графическом приложении #8
Эмм...где?
Вроде ошибки не выскакивает, а что за ошибка?
единственное, wstring не работает, но я решил пока с юникодом повременить
Yandex
Объявления
05.01.2014, 16:44     Создания и работа консоли в графическом приложении
Ответ Создать тему
Опции темы

Текущее время: 09:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru