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

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

Восстановить пароль Регистрация
 
AndyAdjutor
0 / 0 / 0
Регистрация: 13.07.2013
Сообщений: 9
05.01.2014, 05:25     Создания и работа консоли в графическом приложении #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
57
#include <windows.h>
#include <conio.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
ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
    AllocConsole();
    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 и прочее?

Добавлено через 2 минуты
файрфокс заглючил, это копия, как удалить незнаю
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2014, 05:25     Создания и работа консоли в графическом приложении
Посмотрите здесь:

Borland C 3.14 Работа в графическом режиме!!! C++
работа в консоли С++ C++
Работа с клавиатурой в графическом режиме C++
C++ РАБОТА С ЭКРАНОМ В ГРАФИЧЕСКОМ РЕЖИМЕ
Работа в графическом режиме. Графические примитивы, движение объектов. C++
C++ Работа с файлами в консольном приложении
Работа с русским языком в консольном приложении C++
Создания и работа консоли в графическом приложении C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
05.01.2014, 06:14     Создания и работа консоли в графическом приложении #2
AndyAdjutor,

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <windows.h>
#include <conio.h>
#include <iostream>
#include <io.h>
#include <fcntl.h>
 
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 _stdcall 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);
    AllocConsole();
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int h = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
 
    *stdout = *(_fdopen((int)h, "w"));
    setvbuf(stdout, NULL, _IONBF, 0);
 
    cout << "Hello" << endl;
 
 
    while(GetMessage(&Msg,NULL,0,0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
 
    return Msg.wParam;
}
Добавлено через 19 секунд
С stdin и stderr по аналогии
Yandex
Объявления
05.01.2014, 06:14     Создания и работа консоли в графическом приложении
Ответ Создать тему
Опции темы

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