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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 127
#1

Win32 API, MFC, или Windows Forms? - C++

31.07.2015, 02:53. Просмотров 2485. Ответов 32
Метки нет (Все метки)

Здравствуйте!
У меня очень простая задача на С++, нужно построить графики по точкам (данные из файлов) в разных окнах, масштабировать их и накладывать друг на друга иногда, (консоли недостаточно). Нужно меню и несколько кнопок, окна с графиками.
Полноценные Windows приложения никогда не делал.
У Щупака "Эффективная разработка" сказано, что надо начинать изучение с Win32 API, с другой стороны, всякие знатоки пишут, что никто сейчас так не делает и нужно MFC использовать. Кто что посоветует? Какую книгу или ресурс в сети русскоязычный, где я смог бы найти все вопросы, с которыми столкнусь при решении своей задачи? И в как правильно поступать изучать Win32 API, искать информацию по MFC, или Windows Forms изучать? У меня Win8.1, VS2013.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2015, 02:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Win32 API, MFC, или Windows Forms? (C++):

Посоветуйте, пожалуйста, каким образом будет лучше реализовать мою задачу? (MFC, Win API, Windows Forms)) - C++
Предупрежу, что я профан во всём сразу - MFC, Win API, Windows Forms (я даже не уверена, что правильно их написала...), но задачу нужно...

Win32 API vs MFC vs .NET - C++
Что это такое, чем они отличаются и что сейчас лучше учить?

Как создать windows forms приложение с возможностью работы с win32? - C++
Значит смысл примерно такой. Хочу создать Windows Forms приложении на C++. Это я делать умею. Все получилось. Проблема в том, что мне по...

Что выбрать: mfc, api, winforms,qt или перейти на с#? - C++
Подскажите пожалуйста, я взялся за изучение с++ теперь стал выбор mfc, api, winforms,qt или перейти на с#. Программы в будущем хотел бы...

Что выбирать для дальнейшего изучения Windows 7 c Win32 или Windows 8 c WinRt? - C++
Стоит или ещё изучать Windows 7 в целом и Win32? Сейчас много людей все ещё пользуется этим, но не уверен стоит ли начинать, ведь будет...

WinApi или windows forms - C++
Подскажите что лучше всего выбрать WinApi или windows forms, что проше что более понятный или легче. Просто у нас у универи надо выбрать...

32
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 127
31.07.2015, 17:20  [ТС] #16
Butt-Head, Шлее - Qt 4.8. скачал, читаю, QT устанавливаю.
Если можно ещё пару глупых вопросов:
Я научился перебирать файлы в каталоге (в консоли), пользовался atof() и getline(), это всё будет работать без изменений или мне нужно будет ещё пару книг прочитать и что-то переделать (это на сегодня мои супердостижения в С++)?
И последнее, я выбирал С++ из соображений скорости работы, т.к. по обзорам сделал вывод, что это самое быстрое после ассемблера и С, я не ошибся с языком?

Добавлено через 11 минут
Butt-Head, Прочитал,что Qt Libraries можно интегрировать в Visual Studio. Если я ничего другого не знаю пока, есть смысл это сделать или нет?
0
Butt-Head
Заблокирован
31.07.2015, 17:27 #17
Цитата Сообщение от russian_pepper Посмотреть сообщение
это всё будет работать без изменений или мне нужно будет ещё пару книг прочитать и что-то переделать (это на сегодня мои супердостижения в С++)?
Разумеется всё будет работать, т.к. Qt - этот тот же С++, просто это как бы надстройка над ним для более удобной работы и поддержки всех современных операционных систем, то есть если ты будешь писать код чисто на Qt (в это входит и чистый стандарт С++), то этот код соберётся и под Windows и под Linux и под Mac и под iOS и под Adroid и ещё много под что...
Правда в Qt есть более удобные средства для работы с файлами.
В общем то в Qt есть практический всё, что может потребоваться программисту, включая 3D графику на OpenGL, поддержку сети, устройств ввода и многое другое ..

Цитата Сообщение от russian_pepper Посмотреть сообщение
И последнее, я выбирал С++ из соображений скорости работы, т.к. по обзорам сделал вывод, что это самое быстрое после ассемблера и С, я не ошибся с языком?
Не ошибся. С++ действительно - самый мощный язык на данный момент времени и думаю он таким и останется.

Хотя, если нужно для будущей работы, можно рассмотреть так же и Java.

Добавлено через 3 минуты
Цитата Сообщение от russian_pepper Посмотреть сообщение
Прочитал,что Qt Libraries можно интегрировать в Visual Studio.
Я бы не стал, т.к. в комплекте того, что ты устанавливаешь, уже есть прекрасная IDE под названием QtCreator.
Я по началу то же от студии не мог отвыкнуть, а потом как то понял, что QtCreator на самом деле даже удобнее, плюс - я не нашёл в VisualStudio ничего того, чего бы не было в QtCreator, ну не считая специфических аддонов, типа отладки CUDA/ DirectX/ GPGPU на VisualStudio... Но это уже отдельная песня.
Зато в QtCreator есть то, чего нет в студии и плюс он заточен под Qt. А так же, проект в QtCreator ты легко может дать своему другу на другой ОС и он его с лёгкостью откроет и соберёт, а вот проект на Qt под студию ты там просто не передаешь, придётся очень много гемороится ...

Добавлено через 46 секунд
Я через минут 50 домой ухожу, так что задавай быстрей вопросы по хелоу ворлду :-)
1
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 127
31.07.2015, 17:38  [ТС] #18
У меня только Qt на 2/3 установилась ещё... Вопросы позже будут...
0
Butt-Head
Заблокирован
31.07.2015, 17:44 #19
Цитата Сообщение от russian_pepper Посмотреть сообщение
У меня только Qt на 2/3 установилась ещё...
А ты кстати какой Qt то скачал для установки? Для VisualStudio или под minGW или ещё какой ?
Скопируй сюда название ссылки...
И скажи заодно, какая версия VisualStudio у тебя установлена.
0
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 127
31.07.2015, 17:57  [ТС] #20
Butt-Head, По Вашей ссылке выбрал для Windows
http://master.qt.io/archive/online_i...2-1-online.exe
У меня VS Ultimate 2013

Добавлено через 6 минут
Butt-Head, Установилась, ещё и меню на русском языке. Это хорошо? Русский мой родной, но если не дай бог книга попадёт где меню без перевода, это смерть...
0
Butt-Head
Заблокирован
31.07.2015, 18:20 #21
Цитата Сообщение от russian_pepper Посмотреть сообщение
http://master.qt.io/archive/online_i...2-1-online.exe

На самом деле по моей ссылке было много вариантов того, что можно скачать:
Цитата Сообщение от Butt-Head Посмотреть сообщение
Для этих целей лучше всего подходит Qt (http://www.qt.io/ru/download-open-source/#section-2)
Если мотнуть страницу вниз, так как раз можно выбрать то, что конкретно нужно именно тебе.
Раз установленная VisualStudio, то оптимальным вариантом было бы Qt 5.5.0 for Windows 64-bit (VS 2013, 720MB) - http://download.qt.io/official_relea...3_64-5.5.0.exe

А онлайн инсталлятор, это ерунда, он ставит хрен знает что там... Хотя может и поставит что нужно.... но скорее всего лишнего ещё прихватит... Не знаю, когда - то давно один раз ставил так, не помню уже.

Это моё упущение, забыл предупредить...
Не да ладно, ждём завершения установки. Далее запускаешь QtCreator (зелёненький значок), потом Файл -> создать файл или проект -> Приложение QtWidgets (для теста).
Ну там имя, путь - всё по умолчанию ...
Как создастся - жми слева - снизу молоточек (собрать), как соберётся, - стрелку - то есть запустить (без жучка)
И наслаждайся простым кроссплатформенным окном на Qt!
Теперь можешь слева найти формочку этого окна и что нибуть кинуть на него

Добавлено через 2 минуты
Цитата Сообщение от russian_pepper Посмотреть сообщение
ещё и меню на русском языке. Это хорошо?
Да, всё ок. В QtCreator так даже лучше. (это в студии со старых времён ещё как то привычней было на английском)
Компилятор всё равно будет ошибки на английском выдавать, если у тебя студия английская :-)
В Qt нет своего компилятора, он использует либо студийный, либо MinGW под Windows (кстати, в последних версиях MinGw входит в комплект и ставится автоматический)

Добавлено через 15 минут
Ну что, получилось что - то собрать и запустить? (я через 3 минуты ухожу с работы, на выходных, если не забуду - гляну эту тему)

Добавлено через 3 минуты
Всё, я ушёл. Не забудь послушать на ютюбе мелодию - Orbital - Halcyon On and On (Aaron Static Bootleg)
1
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 127
01.08.2015, 01:51  [ТС] #22
Butt-Head, Поставил, проверил пару своих примеров в консоли, всё работает.
MainWindow тоже получилось для теста, прикольно, время не замерял, но вроде как быстрее чем VS работает.
Попробовал приложение Qt Quick, тоже получилось по умолчанию с тремя кнопками.
Но вот когда на место имеющегося кода в исходники/main.cpp подставил пример из книги, куча ошибок появляется и не получается Hello World.
C++
1
2
3
4
5
6
7
8
#include <QtGui>
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QLabel lbl("Hello, World !");
lbl.show();
return app.exec();
}
А молоток нажимать обязательно? Я попробовал стрелку сразу нажать, всё тоже работает...

Добавлено через 14 минут
Butt-Head, Получилось PushButton вставить и откомпилировать, с ней, я счастлив

Добавлено через 3 часа 39 минут
Butt-Head, Мелодию тоже прослушал, спасибо
0
Butt-Head
Заблокирован
01.08.2015, 07:24 #23
Цитата Сообщение от russian_pepper Посмотреть сообщение
Попробовал приложение Qt Quick, тоже получилось по умолчанию с тремя кнопками.
На самом деле - не стоит обольщаться. Пример с тремя кнопками сделан с помощью UI.QML файлов, что, мягко говоря не очень хорошо, т.к. на данный момент, QML - это как бы развивающаяся технология и многое там не доработано, изначально она была предназначена для гуя под мобильники, ну так вот, файлы типа ui.qml новичку лучше не использовать - берёшь и стираешь Там и редактор для них пока что убогий, ровно как и технологический там много нюансов по их использованию ... Лучше пока что делать GUI вручную в файлах типа QML.

Цитата Сообщение от russian_pepper Посмотреть сообщение
Но вот когда на место имеющегося кода в исходники/main.cpp подставил пример из книги, куча ошибок появляется и не получается Hello World.
Да... Книга то старая ... Там в основном изменились понятия о включаемых модулях так сказать.
Смотри, когда ты делаешь проект в QtCreator, то как бы то, что ты можешь подключать в коде посредствам директивы #include, нужно сперва объявить в PRO файле, см фторой файл сверху под названием проекта слева
Вот эта вот штука:
QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
говорит о том, что ты подключаешь к своему проекту модули core, gui и widgets, если быть точнее, ты как бы этим задаёшь пути к хедерам и автоматом подключаешь библиотеки, короче, если ты допустим хочешь использовать SQL, то пишешь там вдобавок или через пробел или отдельной строчкой: QT += sql. Название модулей конечно же не как захочется, но об этом позже ... Так вот, в книге скорее всего про файл левый...
Да, кстати, когда модули подключены правильно, то ты когда пишешь #include <... у тебя сразу имя нужно хедера находит, а если нет - значит ты модуль не тот подключил.

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

В общем, там вся разница с 4.8 Qt (а ты качал 5.5) в хедерах в данном случае... Есть понятие как бы - 4-й Qt и 5-й (ну не считая более ранних, так вот, 4-й хорошо отличается от 5-го).
Нынче не модно подключать какую - то ерунду и теперь если ты хочешь использовать класс QLabel, то его и надо подключать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <QApplication>
 
#include <QLabel>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    QLabel lbl("Hello, World !");
    lbl.show();
 
    return a.exec();
}
Не забывай, что первой строкой в коде должна быть строчка QApplication a(argc, argv);, а последней return a.exec();, запомни это как мантру Короче, этим ты инициализируешь базовый класс для GUIдных приложений и в ретурне запускаешь обработчик событий, который не вернёт управление до тех пор, пока его не попросят, по этому у тебя софт сразу не вылетает.

В общем, для того, чтоб твой убогий пример из книги заработал , тебе нужен CPP файл с кодом как выше, в PRO файле должны быть подключены гия и виджеты, допустим так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
QT       += core
 
QT       += gui widgets
 
TARGET = untitled5
CONFIG   += console
CONFIG   -= app_bundle
 
TEMPLATE = app
 
 
SOURCES += main.cpp
и чтоб лишнее окно консоли не вылетало при старте, можешь его отключить (оно вылетает, если ты в консольный проект вставил код, если в виджетный - то не вылетит).
Отключается оно так: на левой панели, где кнопки большие "начало", редактор, дизайн, отладка, проекты, анализ и спрака, жмёшь "ПРОЕКТЫ", сверху, где тёмный прямоугольничек с названием твоего комплекта для сборки, жмёшь на кнопку "ЗАПУСК" (сначала там горит "СБОРКА"), то есть ты теперь выставляешь параметры запуска и теперь тебе надо снять галку с "запускать в терминале", этот чек бокс под строкой "рабочий каталог"...

Цитата Сообщение от russian_pepper Посмотреть сообщение
А молоток нажимать обязательно? Я попробовал стрелку сразу нажать, всё тоже работает.
Не... не обязательно в принципе Я вообще себе управление, как в визуал студи настроил (Инструменты-Параметра-Среда-Клавиатура)... Иногда обязательно (зависит от комплекта), при добавление новых файлов запускать qmake перед сборкой. В общем новичком от многого спасает (меню сверху - Сборка - Запустить qmake)

По поводу PushButton и тд. Я даже не знаю, наверное пока кидаться в QML рановато, попробуй хоть что то сделать на виджетах (то есть проект QWidget, а не QtQuick).
Вот допустим создал ты проект обычный (приложение Qt Widget)
Зашёл в редактор форм, открыл свою главную форму (mainwindow.ui) (не путать с "плохими" файлами с расширением ui.qml ), перетащил из списка слева на неё допустим PushButton, оо круто! Теперь жмёшь по этому пушбаттану правой кнопкой мыши, ищешь "перейти к слоту" и жмешь по нему левой кнопкой
Тебе автоматом сгенерится код функции, которая будет вызываться при нажатие на эту кнопку. Что б в этом убедится, можешь добавить туда вывод в окно отладки посредствам qDebug
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{    
    qDebug() << "HELLO :-)";
}
Эту надпись нужно искать в QtCreator в окошке снизу под названием "Вывод приложения" (там где результаты поиска, проблемы, консоль сборки и тд)
Ну или можешь добавить что по круче:
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
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_pushButton_clicked()
{
    QMessageBox* pmbx =
                        new QMessageBox("MessageBox",
                        "<b>Hail</b> <i>to the king</i>   <u>baby!</u>",
                        QMessageBox::Information,
                        QMessageBox::Yes,
                        QMessageBox::No,
                        QMessageBox::Cancel | QMessageBox::Escape);
    int n = pmbx->exec();
    delete pmbx;
    if (n == QMessageBox::Yes)
    {
        qDebug() << "Нажата кнопка YES :-)";
    }
}
0
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 127
02.08.2015, 01:55  [ТС] #24
Butt-Head, Здравствуйте! Спасибо Вам большое, за то, что нашли время для меня!

Мне 45 лет, уже нет смекалки пятилетнего...
Осмыслить и попробовать всё, сразу не получается.
Вот что я понял пока, мне нужно всегда, для Windows приложения создавать проект через Qt Widgets.
Когда говорят о виджетах, я представляю, всякие шевелящиеся штуки в телефоне, погода, пробки и всё в таком духе... Конечно прочитал википедию ещё раз про виджет.
Второй файл сверху под названием проекта слева у меня HelloWorld.pro
вот он:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
TEMPLATE = app
 
QT += qml quick widgets
 
SOURCES += main.cpp
 
RESOURCES += qml.qrc
 
# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =
 
# Default rules for deployment.
include(deployment.pri)
Ваш пример работает, но из книги нет они же отличаются, и он не работает, даже если я меняю PRO файл как Вы показали. Возможно уже поздно и я начал тупить...
У Вас
C++ (Qt)
1
2
#include <QApplication>
#include <QLabel>
А в книге
C++ (Qt)
1
#include <QtGui>
Хедер – это *.h файлы или вообще всё, что в Include указано?
Ещё вопрос, как код отформатировать в Qt Creator, аналог VS Ctrl+K, F есть?
И ещё вопрос, строка
C++ (Qt)
1
int main(int argc, char *argv[])
Я видел в видеоуроках, что так передаются параметры в консольное приложение из командной строки, а тут она зачем, в таком виде? Или просто надо запомнить как перовую и последнюю строку и голову не забивать?
Остальное в понедельник буду разбирать, читать, экспериментировать...
0
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 127
04.08.2015, 00:43  [ТС] #25
Butt-Head, У меня всегда при создании приложения Qt Widget появляется окно выбор комплекта, и там всегда по умолчанию стоят четыре галочки:
Desktop Qt 5.5.0 NSVC2013 64 bit , ...2012 32 bit, Desktop Qt5.4.2 NSVC2012 OpenGL 32 bit, Desktop Qt 5.4.2 NSVC2013 64 bit2.
Их все нужно всегда оставлять включенными или какие-то отключать?

Добавлено через 6 часов 55 минут
Butt-Head, и ещё, попробовал пример из другой книги по 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
58
59
60
61
62
63
64
65
66
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static char szAppName[] = "HelloWin";
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wndclass;
    wndclass.cbSize = sizeof(wndclass);
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;
    wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    RegisterClassEx(&wndclass);
    hwnd = CreateWindow(
        szAppName, // window class name
        "The Hello Program", // window caption
        WS_OVERLAPPEDWINDOW, // window style
        CW_USEDEFAULT, // initial x position
        CW_USEDEFAULT, // initial y position
        CW_USEDEFAULT, // initial x size
        CW_USEDEFAULT, // initial y size
        NULL, // parent window handle
        NULL, // window menu handle
        hInstance, // program instance handle
        NULL
        ); // creation parameters
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    switch (iMsg)
    {
    case WM_CREATE:
        //PlaySound("hellowin.wav", NULL, SND_FILENAME | SND_ASYNC);
        return 0;
 
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        GetClientRect(hwnd, &rect);
        DrawText(hdc, "Hello, Windows 95!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        EndPaint(hwnd, &ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
Для эксперимента, появились ошибки. Этот пример у меня в VS тоже не работал, подсказали включить:
Use Multi-Byte Character Set тогда всё заработало...
А как тоже самое включить в Qt Creator? Или причина в другом в чём-то?
Ошибки такие:
main.cpp:19: ошибка: C2440: '=' : cannot convert from 'char [9]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

main.cpp:34: ошибка: C2664: 'HWND CreateWindowExW(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID)' : cannot convert argument 2 from 'char [9]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

main.cpp:42: предупреждение: C4244: 'return' : conversion from 'WPARAM' to 'int', possible loss of data

main.cpp:58: ошибка: C2664: 'int DrawTextW(HDC,LPCWSTR,int,LPRECT,UINT)' : cannot convert argument 2 from 'const char [19]' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
0
MansMI
1247 / 1022 / 283
Регистрация: 08.01.2012
Сообщений: 3,789
04.08.2015, 00:50 #26
имея VS вы послушали того кто громче орет, а нужны лишь были графики, не становиться С++ проф
3
Qt
Заблокирован
04.08.2015, 12:14 #27
Цитата Сообщение от russian_pepper Посмотреть сообщение
У меня всегда при создании приложения Qt Widget появляется окно выбор комплекта, и там всегда по умолчанию стоят четыре галочки:
Desktop Qt 5.5.0 NSVC2013 64 bit , ...2012 32 bit, Desktop Qt5.4.2 NSVC2012 OpenGL 32 bit, Desktop Qt 5.4.2 NSVC2013 64 bit2.
Это последствия того, что при установки онлайн инсталялтором не был просмотрен перечень того, что он предлагает ставить. Нужно было с лишнего снять галочки.
Используй только последнюю версию, с других галочки снимай, тебе нужна Desktop Qt 5.5.0 MSVC2013 64bit
Цитата Сообщение от russian_pepper Посмотреть сообщение
Для эксперимента, появились ошибки. Этот пример у меня в VS тоже не работал, подсказали включить:
Use Multi-Byte Character Set тогда всё заработало...
В VS этот костыль для тех, кто не понимает разницы, когда пишет char и wchar_t
Ерунда всё это. В QtCreator такого конечно же включить нельзя включить, т.к. нужно только для VS.
В общем, в Qt так код никто не пишет. Зачем тебе суперкрутой фреймворк Qt, если ты пишешь код не на нём?
Под Qt пишут кодом самого Qt. В частности в нём есть QString (для решения проблем с юникодом )
Если ты будешь писать платформозависимые вещи в коде на Qt, тогда никакой кроссплатформенности ты не получишь. Понимаешь в чём фокус, всё подобные кроссплатформенные вещи вшиты в недра Qt и он сам знает посредствам всяких #ifdef-ов, когда ему какой код применять в зависимости от платформы. Ты же должен использовать классы Qt (начинаются на букву Q, допустим QString, QVector), стандарт С++, STL, свои класса с платформонезависимым кодом, а так же сторонние кроссплатформенные библиотеки.

Про всякие #include <windows.h> - забудь.

А что же до твоего примера выше, которые написан на VisualStudio... Ну что ж, если понимать суть, то можно хоть в командной строке собрать, тут ведь нет ничего сложного. Для его сборки в QtCreator тебе необходимо сделать следующее:
1. Создать пустой проект (делай именно так): Файл->Новый файл или проект->Другой проект->Empty qmake Project
2. Добавить туда CPP файл: Файл->Новый файл или проект->(снизу в разделе "файлы и классы")C++->C++ Source File. Вводишь там любое имя ему, жмёшь далее .. далее...
3. В этот файл нужно скопировать свой код под WinApi (VS) и подправить там следующее:
a) Короче, в коде перед текстом везде пиши буковку L, например, L"Hello World", это говорит о том, что текст в юникоде.
б) Подключи библиотеки винды для винапишных фнукций..
Догадываясь, что ты см это не сделаешь , я тебе всё подправил. Вот готовый код:
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
#include <windows.h>
#include <tchar.h>
 
#pragma comment ( lib , "User32.lib")
#pragma comment ( lib , "gdi32.lib")
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static wchar_t szAppName[] = L"HelloWin";
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wndclass;
    wndclass.cbSize = sizeof(wndclass);
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;
    wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    RegisterClassEx(&wndclass);
    hwnd = CreateWindow(
        szAppName, // window class name
        L"The Hello Program", // window caption
        WS_OVERLAPPEDWINDOW, // window style
        CW_USEDEFAULT, // initial x position
        CW_USEDEFAULT, // initial y position
        CW_USEDEFAULT, // initial x size
        CW_USEDEFAULT, // initial y size
        NULL, // parent window handle
        NULL, // window menu handle
        hInstance, // program instance handle
        NULL
        ); // creation parameters
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    switch (iMsg)
    {
    case WM_CREATE:
        //PlaySound("hellowin.wav", NULL, SND_FILENAME | SND_ASYNC);
        return 0;
 
    case WM_PAINT:
        hdc = BeginPaint(hwnd, &ps);
        GetClientRect(hwnd, &rect);
        DrawText(hdc, L"Hello, Windows 95!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        EndPaint(hwnd, &ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
Всё, собирай и запускай.
0
Croessmah
Эксперт CЭксперт С++
13409 / 7559 / 853
Регистрация: 27.09.2012
Сообщений: 18,602
Записей в блоге: 3
Завершенные тесты: 1
04.08.2015, 12:37 #28
Цитата Сообщение от Qt Посмотреть сообщение
Короче, в коде перед текстом везде пиши буковку L, например, L"Hello World", это говорит о том, что текст в юникоде.
Цитата Сообщение от Qt Посмотреть сообщение
я тебе всё подправил
C++
1
2
3
4
5
6
7
8
//...
WinMain ( /*...*/ PSTR szCmdLine /*...*/ )
//...
static wchar_t szAppName[] = L"HelloWin";
//...
CreateWindow ( szAppName, L"The Hello Program", /*...*/ )
//...
DrawText ( /*...*/ L"Hello, Windows 95!" /*...*/ )
Смешались в кучу кони, люди...
0
Qt
Заблокирован
04.08.2015, 12:49 #29
Цитата Сообщение от Croessmah Посмотреть сообщение
Смешались в кучу кони, люди...
Чего тебе не нравится вредный кошак ?
0
Croessmah
Эксперт CЭксперт С++
13409 / 7559 / 853
Регистрация: 27.09.2012
Сообщений: 18,602
Записей в блоге: 3
Завершенные тесты: 1
04.08.2015, 12:59 #30
Цитата Сообщение от Qt Посмотреть сообщение
Чего тебе не нравится вредный кошак ?
Смесь wchar_t и макросов.
CreateWindow, например, макрос, который определяется как
C++
1
2
3
4
5
#ifdef UNICODE
#define CreateWindow  CreateWindowW
#else
#define CreateWindow  CreateWindowA
#endif
соответственно, у Вас CreateWindowW и CreateWindowA выбираются опционально, в зависимости от UNICODE, а wchar_t прибит гвоздями... страшная картина.
TCHAR бы развернулся как надо, естественно пришлось бы _T("string literal") использовать, вместо L"string literal".

А про WinMain на MSDN вообще страшные вещи пишут:
This means that WinMain cannot be used by Unicode programs.
For example, the Microsoft Visual Studio C++ complier uses the name wWinMain for the Unicode entry point.
Ну и всё в этом духе, написал же
Цитата Сообщение от Croessmah Посмотреть сообщение
Смешались в кучу кони, люди Юникоды, не Юникоды...
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2015, 12:59
Привет! Вот еще темы с ответами:

Пытаться ли использовать Windows forms с C++? Или лучше иди в C#? - C++
Знаю, что много таких тем уже было т .д., но хочу конкретно сформулировать вопрос и получить ответ. Изучил с++ и теперь хочу писать...

Win32 Mfc отличия - C++
не могу никак переделать из Win32 в MFC собственно в Win32 stdafx.h #include &quot;../NativeToCLRWrapperLibrary/SomeClass.h&quot; ...

Создание документа в MFC и Win32 - C++
Как создать на с++ документы из программы если нужно написать программу MFC Аналогичный вопрос относительно WIN 32

Как включить поддержку MFC в Win32 проекте VC++ 7.0? - C++
Дело в том, что Debug версия работает, а Release ругается ошибками, похожими на те, которые возникали в VC++ 6 ( error LNK2019: Unresolved...


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
04.08.2015, 12:59
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru