Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2010, 21:23   #1
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию Первая программа на WINAPI

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

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

Код:
#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);
}
Расшифруйте пожалуйста что означает вот это:

Код:
 ShowWindow(hwnd,nCmdShow);
    while(GetMessage(&msg,NULL,0,0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
и что вот это за вызов и зачем он?
Код:
 return msg.wParam;
И ещё вот это:
Код:
 WNDCLASS w;
Это создание переменной структруы под названием WNDCLASS ?

И последнее:
Что вот это за регистрация, зачем она нужна?
Код:
 RegisterClass(&w);

Последний раз редактировалось Syltan; 26.02.2010 в 21:27.
Syltan вне форума Ответить с цитированием
Старый 26.02.2010, 21:35   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Код:
    while(GetMessage(&msg,NULL,0,0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
Это принятие и "проталкивание" сообщений в очереди. Используется для обработки сообщений.
Код:
ShowWindow(hwnd,nCmdShow);
Выводит окно на экран.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 26.02.2010, 22:58   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

"и что вот это за вызов и зачем он?"
Это не вызов, а возврат значения (основы с/с++). WinMain должна вернуть системе "код завершения (ошибки)". Обычно возвращают 0 - все в порядке.
GetMessage дождавшись WM_QUIT вернет 0, цикл "закончиться", а в msg.wParam будет "код завершения (ошибки)" от PostQuitMessage.

П.С. Вместо GetMessage есть смысл присмотреться к PeekMessage.

"Это создание переменной структруы под названием WNDCLASS ?"
Где-то так.

"Что вот это за регистрация, зачем она нужна?"
Ну читайте документацию хоть иногда. В винде прежде. чем создать окно его класс надо зарегистрировать в системе. Есть несколько стандартных уже зарегестрированных.
p51x вне форума Ответить с цитированием
Старый 26.02.2010, 23:39   #4
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Расшифруйте пожалуйста вот такие моменты. Меня интересует заголовок функции.

Код:
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
1)LRESULT - это тоже самое ,что LONG (функция под назвыанием WndProc возвращает тип ЛОНГ) ?
2) CALLBACK - я не нашёл расшифровку вот этому в книге Петольда, ответьте зачем оно пишется после LRESULT?
3)
Код:
HWND hwnd
HWND - описание окна, это тип HWND? Объясните пожалуйтса вот это сочетание:
HWND hwnd - тип HWND и переменная этого типа под названием hwnd????
4)
Код:
UINT Message
UINT - это что за тип, я такое где-то у кого-то на C# видел, а на С++ не нашёл описание.
Расшифруйте пожалуйста вот это сочетание: - UINT Message
5)
Код:
WPARAM wparam,LPARAM lparam
Вот этот кусок также не ясен.
6)
Код:
TranslateMessage(&msg);
 DispatchMessage(&msg);
Вот это прокоментируйте пожалуйста
Почему имеют одинаковые названия первое слово с большой, а второй с маленькой буквы.Дайте пожалуйста расшифровку этим 2 понятиям
Заранее благодраю тому, кто даст желательно конкретное, а не расплывчатое как в книге, вокруг да около объяснение. .

Последний раз редактировалось Syltan; 26.02.2010 в 23:43.
Syltan вне форума Ответить с цитированием
Старый 27.02.2010, 09:19   #5
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Syltan Посмотреть сообщение
1)LRESULT - это тоже самое ,что LONG (функция под назвыанием WndProc возвращает тип ЛОНГ) ?
да


Цитата:
Сообщение от Syltan Посмотреть сообщение
2) CALLBACK - я не нашёл расшифровку вот этому в книге Петольда, ответьте зачем оно пишется после LRESULT?
это значит что функция будет __stdcall

[QUOTE=Syltan;467135]
3)
Код:
HWND hwnd
HWND - описание окна, это тип HWND? Объясните пожалуйтса вот это сочетание:
/QUOTE]
да это тип, по сути это тоже самое что и DWORD или UINT


Цитата:
Сообщение от Syltan Посмотреть сообщение
HWND hwnd - тип HWND и переменная этого типа под названием hwnd????
ты вообще язык С++ учил?
HWND это тип, а hwnd это имя переменной, это запись всё равно что
DWORD hwnd

Цитата:
Сообщение от Syltan Посмотреть сообщение
4)
Код:
UINT Message
UINT - это что за тип, я такое где-то у кого-то на C# видел, а на С++ не нашёл описание.
Расшифруйте пожалуйста вот это сочетание: - UINT Message
Message это код сообщения, обычное беззнаковое целое число

Цитата:
Сообщение от Syltan Посмотреть сообщение
5)
Код:
WPARAM wparam,LPARAM lparam
Вот этот кусок также не ясен.
два параметра wparam, lparam с типами WPARAM и LPARAM. WPARAM и LPARAM это тоже самое что и DWORD или UINT. Можно написать так
DWORD wparam, DWORD lparam будет тоже самое

Цитата:
Сообщение от Syltan Посмотреть сообщение
6)
Код:
TranslateMessage(&msg);
 DispatchMessage(&msg);
Вот это прокоментируйте пожалуйста
Почему имеют одинаковые названия первое слово с большой, а второй с маленькой буквы.Дайте пожалуйста расшифровку этим 2 понятиям
в чём вопрос? Здесь просто вызов двух функций и передача им указателей на структуру msg.

Совет на будущее: чтобы в дальнейшем не возникало подобных глупых вопросов, в Visual Studio выделяешь непонятный тебе тип вызываешь контекстное меню и выбираешь пункт "Go to definition"
например, у CALLBACK будет что-то типа
#define CALLBACK __stdcall
WPARAM или LPARAM
будет что-то типа
#define WPARAM UINT
точно не помню так как нет под рукой Visual Studio.
Да, и подучи немного язык С++
rpy3uH вне форума Ответить с цитированием
Старый 27.02.2010, 21:08   #6
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

1)Не скажете, я вот заметил при запуске программы, колесик мышки крутится секунд 5, а затем толкьо можно нажимать на кнопки батон.Вижу, что программа не сразу запускается. В чём может быть проблемма?
2)LOWORD(wparam) - это приведение переменной wparam к какому типу?
3) Почему так код не сработает?
Код:
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
5)Зачем прописывается вот такое MSG msg;

Последний раз редактировалось Syltan; 27.02.2010 в 21:21.
Syltan вне форума Ответить с цитированием
Старый 27.02.2010, 21:54   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Может вам хоть что-нибудь почитать?.. Хотя бы МСДН...
p51x вне форума Ответить с цитированием
Старый 27.02.2010, 22:29   #8
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Да нет, вроде со всем разобрался толкьо с тем последним не до конца.
Ответьте пожалуйста на последний пост.
И ещё на вот этот послдений вопрос и всё, правильно ли я понимаю:
Код:
 w.lpfnWndProc=WndProc;
lpfnWndProc - так называется поле структуры, которому присваивается указатель на функцию WndProc, верно?
Syltan вне форума Ответить с цитированием
Старый 27.02.2010, 22:38   #9
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Syltan, вот тут
counter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Первая программа, C++ Bulder edmynt Помощь студентам 2 31.01.2010 15:12
Моя первая программа (оцените) @Ri$91 Софт 15 12.03.2009 20:29
Моя первая программа igroman Софт 27 12.03.2009 20:23
Моя первая программа)) Dr.Badnezz Софт 9 06.12.2008 14:39
Моя первая программа NikLik Софт 4 20.07.2008 00:24