Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
 Аватар для kirill1059
14 / 14 / 3
Регистрация: 16.04.2013
Сообщений: 404
1

Изучение WinAPI

07.06.2014, 00:54. Показов 3708. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер.
Начал изучать WinApi, но как увидел код простого окна, то немного очумел
Расскажите кто как его учил и посоветуйте как лучше изучать, ведь что бы написать код одного окна, это же сколько нужно всего запомнить. Я знаю что можно использовать шаблоны, но хотелось бы понимать и уметь самому писать код.

Вот простой код окна с 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
72
73
74
75
76
77
78
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow); {
    HWND hMainWnd;
    char szClassName[] = "MyClass";
 
    MSG msg;
    WNDCLASSEX wc;
 
    wc.cbSize = sizeof(wc);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbCLsExta = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackround = (HBRUS)GetStockObject(WHITE_BRUS);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szClassName;
    wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
 
    if(!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Cannot register class", "Error", MB_OK);
        return 0;
    }
 
    hMainWnd = CreateWindow { 
        (szClassName, "A Helll Application", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, O, CW_USEDEFAULT, O,
        (HWND)NULL, (HMENU)NULL,
        (HINSTANCE)hInstance, NULL
        );
    }
 
    if(!hMainWnd) {
        MessageBox(NULL, "Cannot create main window", "Error", MB_OK);
        return 0;
    }
 
    ShowWindow(hMainWnd, nCmdShow)
    while {
        (GetMessage(&msg. NULL. O. O)) {
        TranslateMessage(&masg);
        DispathMessage(&masg);
    }
 
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UNIT uMsg, WPARAM wParam, LPARAM lParam) {
    HDC hDc;
    PAINTSTRUCT ps;
    RECT rect;
 
    switch(uMsg) {
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
 
        GetClientRect(hWnd, &rect);
        DrawText(hDC, "Hello, World!", -1, &rect,
            DT_SINGLELINE | DT_CENTER | DT_VCENTER);
 
        EndPaint(hWnd, &ps);
        break;
 
    case WM_CLOSE:
        DestroyWindow(hWnd);
        break;
 
    case WM_DESTROY:
        PostQuitMessage(0) {
        break;
 
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam) {
 
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.06.2014, 00:54
Ответы с готовыми решениями:

Изучение Winapi
Хотел начать учить WinApi, так вот возник вопрос, что надо знать по С и С++ что бы перейти к изучению WinApi. Я по С++ изучил процедурное...

Изучение WINAPI
Подскажите, как лучше всего и по каким книгам можно выучить WINAPI? Взял Щупак'а,учил по MSDN но ничего хорошо не лезет в голову как...

Изучение WinAPI на С++
Всем Здравствуйте. Я новичок на этом форуме. Занимаюсь С++ около двух лет и возникла необходимость в изучению WinAPI, чтобы создавать...

14
Заблокирован
07.06.2014, 08:51 2
1. Именно он и есть самое трудное в изучении WinAPI. Все остальное намного легче.
Начните лучше с такого проекта (это его код целиком)
C++
1
2
3
4
5
#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(0,L"Аллах акбар",L"Аллах акбар",MB_OK);
return 0;}
2. Есть два способа справиться с кодом простого окна.
Первый - старинное шаманское средство))))) просто сохраните его в такое место, где он будет под рукой, и копипастите оттуда, как заклинание, не разбираясь, и будет вам счастье))))))))
А второй - разобрать, что все это означает))))))
Объяснения есть тут
http://netcode.ru/cpp/?artID=3920
http://softcraft.ru/coding/winapi/generic.shtml
- на последнем сайте несколько статей по вашей теме, смотрите все
а если они вам не нравятся, именно для этого и существует гугл
2
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
07.06.2014, 10:04 3
Цитата Сообщение от kirill1059 Посмотреть сообщение
Вот простой код окна с Hello World
Меня он как то пугает) Или всё же с опытом придёт?)
Придет. Точнее, пройдет.
С опытом Вы поймете, что в этой "портянке" все составляющие нужны.
И стартовый код, и регистрация класса, и цикл выборки оконных
сообщений, и сама оконная процедура с обработчиками.
Просто в серьезных приложениях такие вещи пишутся, как правило, на
базе различных GUI-библиотек, которые скрывают всю эту "кашу" за
простыми и приятными фасадиками. Но знать, как оно там, внутри,
устроено, все равно нужно.
2
Программист
 Аватар для prZzZ
119 / 97 / 11
Регистрация: 22.03.2011
Сообщений: 244
10.06.2014, 20:45 4
Доброго времени суток. Есть очень хорошая книжечка: "Юрий Щупак Win32 API Эффективная разработка приложений". Там всё разжевано. В Интернете найти не проблема.
1
 Аватар для oxyfat
68 / 65 / 21
Регистрация: 01.05.2014
Сообщений: 247
11.06.2014, 10:23 5
Приветствую - ВСЕХ!
Ни надо ничего учить.
Нужно знать - где точку с запятой установить, ну и ещё "пару" мелочей.
Просто: нужно грамотно знать структуру, функции "WndProc".
Вот ОНА - пожалуй самая Важная и Интересная, т.к. неверный "return" - "завалит" всю программу.
Также. Программы создаются ни для того, чтобы показать - вот я , мол программист, для того чтобы Это пользу приносило - непосредственно ВАМ.
0
Неэпический
 Аватар для Croessmah
18124 / 10709 / 2063
Регистрация: 27.09.2012
Сообщений: 26,997
Записей в блоге: 1
11.06.2014, 13:31 6
Цитата Сообщение от kirill1059 Посмотреть сообщение
это же сколько нужно всего запомнить.
не запоминайте всё, это бесполезно:
Цитата Сообщение от Рихтер
Microsoft Windows — сложная операционная система. Она включает в себя столько всего и делает так много, что одному человеку просто не под силу полностью разобраться в этой системе. Более того, из-за такой сложности и комплексности Windows трудно решить, с чего начать ее изучение. Лично я всегда начинаю с самого низкого уровня, стремясь получить четкое представление о базовых сервисах операционной системы. Разобравшись в основах, дальше двигаться проще. С этого момента я шаг за шагом, по мере необходимости, изучаю сервисы более высокого уровня, построенные именно на этом базисе.
0
 Аватар для kirill1059
14 / 14 / 3
Регистрация: 16.04.2013
Сообщений: 404
12.06.2014, 13:05  [ТС] 7
Спасибо, учу по этой книге)
0
Заблокирован
13.08.2014, 20:50 8
Ритуал некродлиннопостирования в честь вопросов вокруг кода с MSDN и его копий и пародий разной степени перевранности.

Код этот кажется чрезмерно сложным, потому что, во-первых, в нем много лишнего, во вторых, он плохо структурирован.

Лишнее в коде:
1) стили CS_HREDRAW | CS_VREDRAW. Они вызывают перерисовку окна при растягивании. Что нужна далеко не всегда и иногда лишь приводит к мерцанию содержимого. Достаточно вместо них писать 0.
2) почему используется WNDCLASSEX и RegisterClassEx, а не WNDCLASS и RegisterClass соответственно?
Из-за этого приходится заполнять свойство wc.hIconSm. Может при каких-то условиях это и имеет смысл: hIcon -это большая иконка для панели задач, hIconSm - маленькая для заголовка окна. Но здесь все равно в обоих случаях используется одна и та же иконка!
Да и она, если уж на то пошло, в хелловорлде необязательна. Достаточно поставить hIcon в NULL и все будет нормально.
3) что может такого случиться, что не получится зарегистрировать класс окна хелловорлда (!) и создать это окно?
C++
1
if(!RegisterClassEx(&wc)) {
C++
1
if(!hMainWnd) {
Зачем эти условия?
А вызывать MessageBox, если не получилось создать основное окно - это, должно быть, что-то в стиле "Не найдена клавиатура, нажмите клавишу F2". Если почему-то не создалось окно, то и MessageBox может не появиться.
Вообще, параноики и прочие индусы часто фаршируют учебные коды трукатчами и прочей защитой-от-фиг-пойми-чего, чем их удлинняют.
4) Зачем (HWND)NULL, зачем (HINSTANCE)hInstance?
Кто-то передает параметром hWnd или hInstance что-то другое, что не является дескриптором окна или экземпляра приложения? Да еще и в хелловорлде.
5) Зачем это?
C++
1
2
3
case WM_CLOSE:
        DestroyWindow(hWnd);
        break;
WM_DESTROY и без него вызывается при закрытии, не?

Плохая структурированность кода:
1)
C++
1
MSG msg;
Это надо объявить там, где оно нужно - перед GetMessage().
2)
C++
1
2
HWND hMainWnd;
    char szClassName[] = "MyClass";
Это объявляется глобально.

Достаточно переделать код в соответствии со всеми этими пунктами - и разобраться в нем станет во много раз легче.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
13.08.2014, 21:22 9
Со всеми пунктами согласен, кроме этого:

Цитата Сообщение от Водяной Змей Посмотреть сообщение
Вообще, параноики и прочие индусы часто фаршируют учебные коды трукатчами и прочей защитой-от-фиг-пойми-чего, чем их удлинняют.
Чаще приходится видеть код, где на проверки просто забили.
Качество такого кода, разумеется, "на высоте" - он хорошо читается и
так же "хорошо" предсказуем. А какие занятные ошибки порой в таком
коде можно найти, м-м !..
0
Заблокирован
13.08.2014, 21:33 10
Убежденный,
Чаще приходится видеть код, где на проверки просто забили.
Чаще приходится видеть код, где забили на реально нужные проверки и возможные ошибки, но зато есть куча бесполезных трукатчей и проверок.
Например, в этом коде есть никому не нужная проверка, зарегистрировался ли класс окна и создался ли дескриптор окна, но зато не учтено, что вот такая конструкция
C++
1
2
3
char szClassName[] = "MyClass";
...
wc.lpszClassName = szClassName;
при определенных настройках компилятора просто не скомпилируется. И более того, для многих весьма знатных компиляторов эти настройки - дефолтные.
И что им мешало дописать десяток-другой лишних букаф и сделать вот так?
C++
1
2
3
4
5
#include <tchar.h>
...
TCHAR szClassName[] = _T("MyClass");
...
wc.lpszClassName = szClassName;
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
13.08.2014, 23:21 11
Цитата Сообщение от Водяной Змей Посмотреть сообщение
Чаще приходится видеть код, где забили на реально нужные проверки и возможные ошибки, но зато есть куча бесполезных трукатчей и проверок.
Не проверять ошибки - это беспечность, независимо от того, "нужные"
проверки или нет. Если функция/метод бросает исключение - его нужно ловить.
Если функция/метод возвращают bool или код ошибки - его нужно проверять.
Всегда и везде. Код, который не следует этому правилу, не может считаться
корректным по определению. IMHO.

Добавлено через 17 минут
Да, и я хотел бы добавить, что "зашумление" кода проверками на каждом шагу -
это не приговор. Если сделать грамотное разделение на бизнес-слой и слой
обработки ошибок, "шума" не будет. Например, можно спрятать все проверки
внутри оберток, кидающих исключения. А исключения ловить на верхних уровнях.
В итоге бизнес-уровень останется компактным и выразительным.
0
Заблокирован
13.08.2014, 23:30 12
Убежденный,
Если функция/метод возвращают bool или код ошибки - его нужно проверять.
Всегда и везде. Код, который не следует этому правилу, не может считаться
корректным по определению.
Индусами - да, не может. Чтобы, если начальник будет укорять в такой вот беспечности, можно было ему сказать "нет, Иван Петрович, Вы не правы: пусть мой код и не компилируется в VS по дефолту, зато в нем вот тут 10 трукатчей и вот тут еще 10 проверок. И вот тут я не просто так "_s" дописал - это я опасную функцию безопасной заменил! Теперь все безопасно!". И дурак Иван Петрович скажет: "Оооо, вот это другое дело! Тогда Вам не только снижать зарплату нельзя - так еще и повысить срочно надо!" - и повысит.
А до того, что покупателям куда важнее чтобы код компилировался в VS как надо, ибо это платный набор GUIшных свистоперделок за штуку баксов, и покупателям его в своих проектах в VS использовать, - дурак начальник просто не допетрит.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
13.08.2014, 23:40 13
Водяной Змей, что Вы по существу можете возразить против проверки всего и вся ?
Только давайте не будем про индусов и то, что код, обложенный проверками, вдруг почему-то
должен перестать компилироваться. Эти вещи никак друг с другом не связаны: от того, что я
лишний раз проверю возвращаемое RegisterClassExW значение, код компилироваться не перестанет.

Да, и оговорюсь сразу, что не ставлю никаких "холиварных" целей, боже упаси.
Свою позицию по этому вопросу, если интересно, я могу расписать в более подробной форме, но
сначала хотел бы услышать Ваш ответ.
0
Заблокирован
14.08.2014, 00:47 14
Убежденный,
что Вы по существу можете возразить против проверки всего и вся ?
Снижает читабельность кода, делает его менее понятным программисту с более низкой квалификацией.
Для всяких платных контролов и прочих средств разработки это особо важно: новичок попробует триал - ничего не поймет - полную версию не купит - да еще и отзыв плохой в инете напишет, так что и профи выберет лучше продукт конкурентов.

от того, что я лишний раз проверю возвращаемое RegisterClassExW значение, код компилироваться не перестанет
Чем больше сил тратишь на хрень, от лишних трукатчей и свистоперделок, тем меньше их остается на нужное дело.
0
14.08.2014, 06:17 15
 Комментарий модератора 
Достаточно обсуждений. Это уже не имеет к вопросу ТС никакого отношения
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.08.2014, 06:17
Помогаю со студенческими работами здесь

С чего начать изучение WinAPI?
Дело в том ,что изучаю программирование на C++, и вот я подошел к такой теме как GUI в C++. Консольные приложения - это конечно хорошо, но...

Посоветуйте с чего начать изучение WinAPI
Знаю плюсы довольно не плохо долго уже программирую в консоли хочу графику посоветуйте книгу или статьи в интернете или видео буду...

winApi изучение
прошу посоветтовать литературу или статьи для изучения WinAPI . Скачал книгу Щупака что-то не очень доганяю. Нужно что-то для новичков....

изучение C#
Скажите пожалуйста, как лучше освоить теорию по С#, заучить, что бы помнить или больше практики и теория сама усвоится?

изучение с++
#include &lt;iostream&gt; using namespace std; void main() { cout&lt;&lt;&quot;hello ,world!&quot;; return 0; } он его не компилирует и...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Неблокируемый стек в C++26: реализуем простой сборщик мусора
stackOverflow 02.03.2025
Многопоточные приложения требуют надежных и производительных структур данных, способных эффективно работать в условиях конкурентного доступа. Неблокируемые структуры данных представляют собой особый. . .
Шаблон REQ/REP в ZeroMQ: сверхбыстрый обмен сообщениями в C++ и Python
stackOverflow 02.03.2025
Построение высоконагруженных распределенных систем требует надежного и производительного механизма обмена сообщениями. ZeroMQ выделяется среди прочих решений своей невероятной скоростью работы и. . .
Нестандартные приемы работы с итераторами в C++
stackOverflow 02.03.2025
Итераторы - один из краеугольных камней C++, предоставляющий универсальный механизм обхода и манипуляции данными в контейнерах. Появившись как замена небезопасным указателям, они эволюционировали от. . .
Лексический анализ и регулярные выражения в C++26
stackOverflow 02.03.2025
Лексический анализ - ядро любого компилятора и инструмента обработки текста. Каждый программист сталкивается с задачами парсинга строк, обработки файлов конфигурации или анализа пользовательского. . .
Подробно о std::mdspan в C++23
stackOverflow 02.03.2025
Работа с многомерными массивами данных традиционно была одной из сложных задач в C++. Программистам приходилось создавать собственные абстракции или использовать сторонние библиотеки для эффективной. . .
Колмогоровская сложность в C++: Путь к совершенному коду
stackOverflow 02.03.2025
Абстрактная математическая теория Колмогорова стала мощным средством оценки и улучшения программного кода. Сложность алгоритма - не только в его вычислительной эффективности, но и в том, насколько. . .
Изменения в C# 14
stackOverflow 02.03.2025
Одно из самых значимых изменений в C# 14 - поддержка коллекционных выражений, которые позволяют создавать и инициализировать коллекции с помощью нового лаконичного синтаксиса. Это нововведение. . .
Разработка кроссплатформен­­­­ного мобильного приложения для iOS/Android на C++
bytestream 02.03.2025
C++ как язык программирования высокого уровня с прямым доступом к аппаратным ресурсам позволяет создавать приложения, работающие одинаково быстро как на iOS, так и на Android устройствах. Ни для кого. . .
Аутентификация/авторизация на Golang
bytestream 02.03.2025
Go предлагает множество возможностей для создания надежных систем аутентификации. Встроенные криптографические пакеты, высокая производительность и простота параллельной обработки запросов делают его. . .
Нововведения TypeScript 5.8
bytestream 02.03.2025
TypeScript 5. 8 приносит много возможностей и оптимизаций, которые существенно расширяют границы типобезопасного программирования на JavaScript. Эта версия включает ряд значительных улучшений в работе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru