Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.95/37: Рейтинг темы: голосов - 37, средняя оценка - 4.95
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152

Win32 API, MFC, или Windows Forms?

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

Студворк — интернет-сервис помощи студентам
Здравствуйте!
У меня очень простая задача на С++, нужно построить графики по точкам (данные из файлов) в разных окнах, масштабировать их и накладывать друг на друга иногда, (консоли недостаточно). Нужно меню и несколько кнопок, окна с графиками.
Полноценные Windows приложения никогда не делал.
У Щупака "Эффективная разработка" сказано, что надо начинать изучение с Win32 API, с другой стороны, всякие знатоки пишут, что никто сейчас так не делает и нужно MFC использовать. Кто что посоветует? Какую книгу или ресурс в сети русскоязычный, где я смог бы найти все вопросы, с которыми столкнусь при решении своей задачи? И в как правильно поступать изучать Win32 API, искать информацию по MFC, или Windows Forms изучать? У меня Win8.1, VS2013.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.07.2015, 02:53
Ответы с готовыми решениями:

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

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

clr,mfc,windows forms
на чем лучше всего создавать оконный проект в MSVS2010? и как его собрать в 1 exe исполняемый файл ? и чтобы этот 1 exe можно было...

32
Заблокирован
31.07.2015, 18:20
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от russian_pepper Посмотреть сообщение
http://master.qt.io/archive/online_i...2-1-online.exe

На самом деле по моей ссылке было много вариантов того, что можно скачать:
Цитата Сообщение от Butt-Head Посмотреть сообщение
Для этих целей лучше всего подходит Qt (http://www.qt.io/ru/download-o... #section-2)
Если мотнуть страницу вниз, так как раз можно выбрать то, что конкретно нужно именно тебе.
Раз установленная VisualStudio, то оптимальным вариантом было бы Qt 5.5.0 for Windows 64-bit (VS 2013, 720MB) - http://download.qt.io/official... -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
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
01.08.2015, 01:51  [ТС]
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
Заблокирован
01.08.2015, 07:24
Цитата Сообщение от 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
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
02.08.2015, 01:55  [ТС]
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
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
04.08.2015, 00:43  [ТС]
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,DW ORD,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
1620 / 1185 / 553
Регистрация: 08.01.2012
Сообщений: 4,564
04.08.2015, 00:50
имея VS вы послушали того кто громче орет, а нужны лишь были графики, не становиться С++ проф
3
Qt
Заблокирован
04.08.2015, 12:14
Цитата Сообщение от 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
04.08.2015, 12:37
Цитата Сообщение от 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
Цитата Сообщение от Croessmah Посмотреть сообщение
Смешались в кучу кони, люди...
Чего тебе не нравится вредный кошак ?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
04.08.2015, 12:59
Цитата Сообщение от 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
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
06.08.2015, 10:52  [ТС]
Qt, Butt-Head, Спасибо! Каждое Ваше сообщение, после небольшого редактирования, могло бы стать главой книги.
Всё попробовал, всё работает, мне понравилось, у Вас тут кнопка "+ Спасибо" пропала Многое не знаю, но похоже, что для моих графиков с этим Qt можно всё сделать как мне нужно не понимая полностью, всё как работает...
А как мне теперь окно сделать и в нём точки и отрезки ставить?

Добавлено через 18 часов 49 минут
MansMI,
имея VS вы послушали того кто громче орет, а нужны лишь были графики, не становиться С++ проф
Я слушаю того, кто даёт понятные советы и рабочие примеры
0
9 / 9 / 0
Регистрация: 26.01.2015
Сообщений: 94
06.08.2015, 11:06
Сейчас вроде бы все делают в qt GUI приложения.Про WinApi вообще забудь .Можешь с OpenGL поиграться)
0
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 152
06.08.2015, 11:16  [ТС]
Licoze, Про WinApi уже посмотрел, понял...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.08.2015, 11:16

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

Элементы интерфейса на opengl или win32 api?
В своей программе для Windows 7 мне надо сделать нестандартный графический интерфейс - кнопки, иконки, рамку и т.д. Хочу подчеркнуть, что...

Подскажите, Win API или MFC?
Добрый вечер! Люди добрые, вот какая ситуация: Надо начинать писать курсовую работу. На лабораторных приложения писать на чистом API,...

Односвязный список на MFC или API
делаю курсовую, но никак не могу сладить с односвязным списком, видимо где-то ошибка в обращении с памятью.Помогите на писать программу(на...

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


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru