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

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

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

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

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

Здравствуйте!
У меня очень простая задача на С++, нужно построить графики по точкам (данные из файлов) в разных окнах, масштабировать их и накладывать друг на друга иногда, (консоли недостаточно). Нужно меню и несколько кнопок, окна с графиками.
Полноценные Windows приложения никогда не делал.
У Щупака "Эффективная разработка" сказано, что надо начинать изучение с Win32 API, с другой стороны, всякие знатоки пишут, что никто сейчас так не делает и нужно MFC использовать. Кто что посоветует? Какую книгу или ресурс в сети русскоязычный, где я смог бы найти все вопросы, с которыми столкнусь при решении своей задачи? И в как правильно поступать изучать Win32 API, искать информацию по MFC, или Windows Forms изучать? У меня Win8.1, VS2013.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2015, 02:53     Win32 API, MFC, или Windows Forms?
Посмотрите здесь:
Посоветуйте, пожалуйста, каким образом будет лучше реализовать мою задачу? (MFC, Win API, Windows Forms)) C++
C++ Win32 API vs MFC vs .NET
Как создать windows forms приложение с возможностью работы с win32? C++
Что выбрать: mfc, api, winforms,qt или перейти на с#? C++
Что выбирать для дальнейшего изучения Windows 7 c Win32 или Windows 8 c WinRt? C++
WinApi или windows forms C++
C++ Пытаться ли использовать Windows forms с C++? Или лучше иди в C#?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Butt-Head
Заблокирован
31.07.2015, 18:20     Win32 API, MFC, или Windows Forms? #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)
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 125
01.08.2015, 01:51  [ТС]     Win32 API, MFC, или Windows Forms? #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, Мелодию тоже прослушал, спасибо
Butt-Head
Заблокирован
01.08.2015, 07:24     Win32 API, MFC, или Windows Forms? #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 :-)";
    }
}
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 125
02.08.2015, 01:55  [ТС]     Win32 API, MFC, или Windows Forms? #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[])
Я видел в видеоуроках, что так передаются параметры в консольное приложение из командной строки, а тут она зачем, в таком виде? Или просто надо запомнить как перовую и последнюю строку и голову не забивать?
Остальное в понедельник буду разбирать, читать, экспериментировать...
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 125
04.08.2015, 00:43  [ТС]     Win32 API, MFC, или Windows Forms? #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
MansMI
1136 / 933 / 240
Регистрация: 08.01.2012
Сообщений: 3,389
04.08.2015, 00:50     Win32 API, MFC, или Windows Forms? #26
имея VS вы послушали того кто громче орет, а нужны лишь были графики, не становиться С++ проф
Qt
Заблокирован
04.08.2015, 12:14     Win32 API, MFC, или Windows Forms? #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);
}
Всё, собирай и запускай.
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
04.08.2015, 12:37     Win32 API, MFC, или Windows Forms? #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!" /*...*/ )
Смешались в кучу кони, люди...
Qt
Заблокирован
04.08.2015, 12:49     Win32 API, MFC, или Windows Forms? #29
Цитата Сообщение от Croessmah Посмотреть сообщение
Смешались в кучу кони, люди...
Чего тебе не нравится вредный кошак ?
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
04.08.2015, 12:59     Win32 API, MFC, или Windows Forms? #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 Посмотреть сообщение
Смешались в кучу кони, люди Юникоды, не Юникоды...
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 125
06.08.2015, 10:52  [ТС]     Win32 API, MFC, или Windows Forms? #31
Qt, Butt-Head, Спасибо! Каждое Ваше сообщение, после небольшого редактирования, могло бы стать главой книги.
Всё попробовал, всё работает, мне понравилось, у Вас тут кнопка "+ Спасибо" пропала Многое не знаю, но похоже, что для моих графиков с этим Qt можно всё сделать как мне нужно не понимая полностью, всё как работает...
А как мне теперь окно сделать и в нём точки и отрезки ставить?

Добавлено через 18 часов 49 минут
MansMI,
имея VS вы послушали того кто громче орет, а нужны лишь были графики, не становиться С++ проф
Я слушаю того, кто даёт понятные советы и рабочие примеры
Licoze
8 / 8 / 0
Регистрация: 26.01.2015
Сообщений: 94
06.08.2015, 11:06     Win32 API, MFC, или Windows Forms? #32
Сейчас вроде бы все делают в qt GUI приложения.Про WinApi вообще забудь .Можешь с OpenGL поиграться)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2015, 11:16     Win32 API, MFC, или Windows Forms?
Еще ссылки по теме:
C++ Win32 Mfc отличия
C++ Создание документа в MFC и Win32
Подключение OCX элемента а НЕ MFC программе Win32 C++
C++ Как включить поддержку MFC в Win32 проекте VC++ 7.0?
С++ Win32 API C++

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

Или воспользуйтесь поиском по форуму:
russian_pepper
43 / 0 / 0
Регистрация: 14.06.2014
Сообщений: 125
06.08.2015, 11:16  [ТС]     Win32 API, MFC, или Windows Forms? #33
Licoze, Про WinApi уже посмотрел, понял...
Yandex
Объявления
06.08.2015, 11:16     Win32 API, MFC, или Windows Forms?
Ответ Создать тему
Опции темы

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