Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/27: Рейтинг темы: голосов - 27, средняя оценка - 4.78
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868

Первая программа на WINAPI

26.02.2010, 21:46. Показов 5138. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот написал первую программу с 2 кнопками. при нажатии на которые получаю диалоговые сообщения.
Так как ещё только начинаю знакомится с Айпи, возникло несколько вопросов по некоторым местам.

Вот исходник программы:

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
#include "windows.h"
 
#define ID_BUTTON1 1000
#define ID_BUTTON2 5000
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);
 
int WINAPI WinMain ( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR IpCmdLine,int nCmdShow )
{
    HWND hwnd;//Дескрипторы окон (button - это тоже окна)
    HWND button;
    HWND button2;
    MSG msg;
    WNDCLASS w;
    ///адрес этой переменной в памяти, потом значение, 
    //которым память заполнить, потом сколько байт заполнять
    memset(&w,0,sizeof(WNDCLASS));
    w.style=CS_HREDRAW|CS_VREDRAW;
    w.lpfnWndProc=WndProc;
    w.hInstance=hInstance;
    w.hbrBackground=HBRUSH(COLOR_BTNFACE + 1);
    w.lpszClassName =L"Окно Windows";
    RegisterClass(&w);
    hwnd = CreateWindow(L"Окно Windows",L" Windows", WS_OVERLAPPEDWINDOW,
    250,50,700,700,NULL,NULL,hInstance,NULL);
 
        //делаем кнопку
    button=CreateWindow(L"button",L"Кнопка №1",WS_VISIBLE|WS_CHILD,240,205,28,28,hwnd,(HMENU)ID_BUTTON1,NULL,NULL);
    button2=CreateWindow(L"button",L"Кнопка №2",WS_VISIBLE|WS_CHILD,300,300,200,25,hwnd,(HMENU)ID_BUTTON2,hInstance,NULL);
    ShowWindow(hwnd,nCmdShow);
    while(GetMessage(&msg,NULL,0,0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
//lparam - передаётся номер нажатой кнопки
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
    switch (Message){
        case WM_COMMAND:
            if(wparam==ID_BUTTON1){
MessageBox(NULL, L"Вы нажали на кнопку №1", L"Test", MB_OK|MB_ICONWARNING);
            }
            if(wparam==ID_BUTTON2){
                MessageBox(NULL,L"Вы нажали на кнопку 2",L"Тест",MB_OK|MB_ICONEXCLAMATION);
            }
    }
    
    
    if (Message == WM_DESTROY )
    {
        //Чтоб убрать эту программу с процессов windows
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd,Message,wparam,lparam);
}
 
 
 
[/CODE]Расшифруйте пожалуйста что означает вот это:
 
[CODE]
 ShowWindow(hwnd,nCmdShow);
    while(GetMessage(&msg,NULL,0,0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
и что вот это за вызов и зачем он?
C++
1
 return msg.wParam;
И ещё вот это:
C++
1
 WNDCLASS w;
Это создание переменной структруы под названием WNDCLASS ?

И последнее:
Что вот это за регистрация, зачем она нужна?
C++
1
 RegisterClass(&w);
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.02.2010, 21:46
Ответы с готовыми решениями:

Первая программа с WinApi
Вот код программы: #include <windows.h> bool RegClass(WNDPROC, LPCTSTR, UINT); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,...

Первая программа
Вот написал свою первую программу, но почему-то не работает. Писал по книге Юрий Щупак - Win32 API. Эффективная разработка приложений ...

WinAPI простая программа
main.h: #define IDC_STATIC 100 int WINAPI pr(HWND hwnd, int cmd, WPARAM wParam, LPARAM lParam); main.cpp #include <windows.h> ...

10
 Аватар для snake32
3511 / 1694 / 236
Регистрация: 26.02.2009
Сообщений: 8,472
Записей в блоге: 6
26.02.2010, 23:01
C++
1
2
3
4
5
ShowWindow(hwnd,nCmdShow);// отобразить окно hwnd 
 while(GetMessage(&msg,NULL,0,0)){ // а это запускается цикл обработки сообщений
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
C++
1
return msg.wParam;// возврат в систему результат работы программы
Цитата Сообщение от Syltan Посмотреть сообщение
Это создание переменной структруы под названием WNDCLASS ?
Угу.
Цитата Сообщение от Syltan Посмотреть сообщение
Что вот это за регистрация, зачем она нужна?
Что б система знала что есть такой класс. Но вот зачем он ей нужен я как-то не задумывался
1
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
26.02.2010, 23:23  [ТС]
Расшифруйте пожалуйста вот такие моменты. Меня интересует заголовок функции.

C++
1
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
1)LRESULT - это тоже самое ,что LONG (функция под назвыанием WndProc возвращает тип ЛОНГ) ?
2) CALLBACK - я не нашёл расшифровку вот этому в книге Петольда, ответьте зачем оно пишется после LRESULT?
3)
C++
1
HWND hwnd
HWND - описание окна, это тип HWND? Объясните пожалуйтса вот это сочетание:
HWND hwnd - тип HWND и переменная этого типа под названием hwnd????
4)
C++
1
UINT Message
UINT - это что за тип, я такое где-то у кого-то на C# видел, а на С++ не нашёл описание.
Расшифруйте пожалуйста вот это сочетание:UINT Message
5)
C++
1
WPARAM wparam,LPARAM lparam
6)
C++
1
2
TranslateMessage(&msg);
 DispatchMessage(&msg);
Вот это прокоментируйте пожалуйста
Почему имеют одинаковые названия первое слово с большой, а второй с маленькой буквы.Дайте пожалуйста расшифровку этим 2 понятиям
Заранее благодраю тому, кто даст желательно конкретное, а не расплывчатое как в книге, вокруг да около объяснение. .
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
27.02.2010, 00:10
2 Syltan: 3) 5) Я так понял вас часто смущают типы даннных, тип данных это тип данных. А переменная может называться как угодно (в пределах правил) То что тип XXX не означаем то мы не может назвать переменную xxx
4) UINT - unsigned int. Вообще если у вас Visual Studio то кнопка F12 может показывать все определения. Т.е. устанавливаем курсор на UINT - кликаем, нажимаем F12. Нам показывают
C++
1
typedef unsigned int        UINT;
и все становится понятным

2) CALLBACK это __stdcall. Вроде значит что все аргументы будут переданы в функцию через стек...

1) Именно

6) Не понял что не так)
2
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
27.02.2010, 00:31  [ТС]
Спасибо большое, открыли глаза мне.

Вот этот код расшифруйте пожалуйста:

C++
1
2
TranslateMessage(&msg);
 DispatchMessage(&msg);
Ещё пару небольших вопросов:
1)
C++
1
hInstance - это под каким номером  в процесах Windows запущенно главное окно Windows?
И вот мы видим его в коде:
C++
1
2
hwnd = CreateWindow(L"Окно Windows",L" Windows", WS_OVERLAPPEDWINDOW,
    250,50,700,700,NULL,NULL,hInstance,NULL);
2)hwnd - прочитал что это называется дескриптор окна, как это понять дескриптор окна
что такое дескриптор вообще

Вот hwnd = CreateWindow....................
3)
C++
1
w.style=CS_HREDRAW|CS_VREDRAW
Что это знак чёрточки "|"
4)
C++
1
  WNDCLASS w;
Обзятельно ли переменная структуры под названием WNDCLASS должна называтся w?
5)
C++
1
WPARAM wparam,LPARAM lparam
Вот эти парметры расшифруйте пожалуйста. Заранее благодарю.
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
27.02.2010, 11:44
Функция TranslateMessage
Описание:
Пеpеводит комбинации wm_KeyDown/Up в wm_Char или wm_DeadChar и комбинации wm_SysKeyDown/Up в wm_SysChar или wm_SysDeadChar и напpавляет символьное сообщение в очеpедь пpикладной задачи.

Функция DispatchMessage
Описание:
Пеpедает в Msg сообщение оконной функции окна.
1) hInstance - это идентификатор экземпляра приложения. Просто уникальный номер для приложения...
2) Дескриптор - это "описатель" если дословно. В общем это видимо переменная которая описывает наше окно
3) Тут мы складываем "флаги" в одну переменную. А сама операция - операция поразрядного ИЛИ (побитовое сложение). Проанализируйте этот пример:
Code
1
2
3
4
000[COLOR="Red"]1[/COLOR]0[COLOR="Red"]111[/COLOR]
|
[COLOR="Red"]1[/COLOR]0[COLOR="Red"]11[/COLOR]000[COLOR="Red"]1[/COLOR]
10110111
1 и 0 - значит запишется 1. 0 и 1 - все равно 1. Только когда 0 и 0 - 0. Но 1 и 1 это тоже 1
4) Нет. В своем коде вы можете переименовывать переменные в пределах правил
5) wParam и lParam - это переменные в которые в зависимости от типа сообщения помещается дополнительная информация к этому сообщению. Например при сообщении WM_KEYDOWN в wParam скрыт номер нажатой клавиши
1
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
27.02.2010, 11:54
Syltan, читай здесь.
http://www.cyberguru.ru/progra... ndows.html
страницы листаются в окошке СПРАВА.
1
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
27.02.2010, 18:30  [ТС]
По поводу парметров функции обработки сообщений Windows WndProc
C++
1
wparam,LPARAM lparam
Скажите, это тоже самое что написать:

C++
1
 unsigned int* wparam, long* lparam
Если да, тогда почему программа пропускает эти парметры, то есть согласана с ними, а затем
в теле функции не компилится, и застривает на строке:
C++
1
    if(unsigned int*==ID_BUTTON1){

2)
C++
1
CALLBACK
Означает, что все аргументы в функцию будут переданы через стек, а стек - это часть оперативной памяти для временного хранения данных, которые мы получаем от программы?

3) по поводу этих 2 строк не очень понял:
C++
1
2
 TranslateMessage(&msg);
        DispatchMessage(&msg);
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
27.02.2010, 18:40
Цитата Сообщение от Syltan Посмотреть сообщение
По поводу парметров функции обработки сообщений Windows WndProc
Вообще то определения такие
C++
1
2
typedef UINT_PTR            WPARAM;
typedef LONG_PTR            LPARAM;
Раскрываем далее
C++
1
2
typedef _W64 unsigned int UINT_PTR;
typedef _W64 long LONG_PTR;
Делаем выводы что
WPARAM - это unsigned int, а
LPARAM - это long
По крайне мере у меня Так что звездочек тут нет
Цитата Сообщение от Syltan Посмотреть сообщение
Скажите, это тоже самое что написать:
Как видите нет - указатель на значение это укзатель... так что уберите звездочки и будет уже лучше)

Цитата Сообщение от Syltan Посмотреть сообщение
Если да, тогда почему программа пропускает эти парметры, то есть согласана с ними, а затем
в теле функции не компилится, и застривает на строке:
А что с чем вы сравниваете? Сравнивать нужно переменные и константы, а вы сравниваете тип (unsigned int*) с константой.
Наверное верно так:
C++
1
if ( LOWORD(wparam) == ID_BUTTON1)
А вот... кстати ещё - почитайте это. Хорошая статья http://www.gamedev.ru/code/articles/?id=4219
1
241 / 9 / 7
Регистрация: 27.08.2009
Сообщений: 868
27.02.2010, 21:20  [ТС]
1)Не скажете, я вот заметил при запуске программы, колесик мышки крутится секунд 5, а затем толкьо можно нажимать на кнопки батон.Вижу, что программа не сразу запускается. В чём может быть проблемма?
2)LOWORD(wparam) - это приведение переменной wparam к какому типу?
3) Почему так код не сработает?
C++
1
2
3
4
5
6
7
8
9
10
11
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, unsigned int wparam,long lparam)
{
    switch (Message){
        case WM_COMMAND:
            if((unsigned int)wparam==ID_BUTTON1){
MessageBox(NULL, L"Вы нажали на кнопку №1", L"Test", MB_OK|MB_ICONWARNING);
            }
            if((unsigned int)wparam==ID_BUTTON2){
                MessageBox(NULL,L"Вы нажали на кнопку 2",L"Тест",MB_OK|MB_ICONEXCLAMATION);
            }
    }
4)Если lparam - это параметр в которой передаётся номер нажатой кнопки на главном окне WndProc,
тогда что означает параметр wparam

Добавлено через 25 минут
Зачем прописывается вот такое:
MSG msg;
0
0 / 0 / 0
Регистрация: 18.09.2009
Сообщений: 10
01.03.2010, 20:24
Сударь, предлагаю вам почитать книжку Джеффри Рихтера "Windows via c/c++"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.03.2010, 20:24
Помогаю со студенческими работами здесь

Программа проводник на WinApi
Здравствуйте!Мне необходимо написать программу-проводник на WinApi - это моя курсовая работа.Программа должна...

Программа проводник на WinApi
Здравствуйте!Мне необходимо написать программу-проводник на WinApi - это моя курсовая работа.Программа должна...

Консольная программа С++ по WinAPI
Не могу разобраться с данным заданием. Прошу подсказать, откуда и как вообще это начать понимать (это моя первая работа с WinAPI). 1....

Программа по пунктам на WinAPI
Окажите помощь в создании программы по пунктам: 1. В окне приложения отобразить кнопку "Клавиши отжаты". При нажатии любой...

Программа с WinAPI компилируется, но не работает
Всем привет. Я занимаюсь по книге Румянцева "Азбука программирования в Win32 API". Листинги в книге рассчитаны на компиляцию в...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru