2010-03-07 2 views
0

Я только начал изучать программирование для окон на C++. У меня было это безумное изображение, что win32-программирование основано на вызове функций Windows и отправке параметров в и из них. Например, когда вы хотите создать окно, вы вызываете некоторую функцию win32, которая обрабатывает графический интерфейс Windows и говорит «Привет, пожалуйста, создайте мне новое окно, 100 x 100 px, с двумя кнопками», и что функция GUI говорит «Привет, без проблем , когда что-то происходит, как пользователь нажимает одну кнопку, я изменю эту переменную xy, расположенную в этом месте ».C++ использование winmain()

Итак, я думал, что это будет очень похоже на консольное программирование. Но первая инструкция меня удивила. Я всегда думал, что каждая программа выполняет функцию main(). Итак, когда я запускаю приложение, окна хранят некоторые параметры поверх стека и запускают это приложение. Поэтому я предположил, что инициализация main() - это просто C++ способ сообщить компилятору, где должна быть первая инструкция.

Но в программировании win32 есть функция WinMain(), которая начинается с первого. Поэтому я немного смущен. Я думал, что правило, что компилятор должен иметь main() для начала, этот main определяет, где он начинается, например, некоторый идентификатор начальной точки.

Итак, пожалуйста, почему функция WinMain() вместо main()? Когда я думал, что программирование на С ++ логично, как ассемблер, это снова смущает меня.

+1

У вас может быть программа Win32, которая начинается с 'main()'. Консольные программы делают это. – sbi

+6

О, и вы можете сломать это море свинца в абзацы. – sbi

+1

Нет «winmain», есть «WinMain». – avakar

ответ

5

main() как произвольная точка входа, как WinMain() есть. Стандарт требует только функции с именем main для согласованности. Точка входа (независимо от того, является ли она main или WinMain) фактически вызывается скрытой функцией, которая является точкой входа real. На некоторых платформах «реальная» точка входа называется чем-то вроде _start. Именно эта функция выполняет всю начальную работу, например, инициализирует глобальные переменные, настраивает среду и т. Д., А затем вызывает main(). В Windows эта функция запуска вызывает вызов WinMain(), если он доступен.

Редактировать: выйдите this answer для получения более подробного объяснения.

2

Чтобы понять, как работает приложение Win32, требуется дополнительное усилие по сравнению с обычным консольным приложением.

«У меня был сумасшедшим образом, что программирование win32 основано на вызов функции окна и параметров отправки и из них»

моих намеков ...

1) Правда, но и окно сообщения, являются битами приложения Windows, некоторые примеры включают WM_CREATE, WM_MOUSExx, WM_KEYxx, WM_PAINT, где xx может быть DOWN UP и так далее. Сообщения отправляются в ваше приложение самой Windows, вам нужно определить определенную функцию для их улавливания («WindowFunc»). Есть сотни сообщений, к счастью, не обязательно сначала их понимать.

2) Каждый виджет, который вы можете себе представить в своем приложении, представляет собой «Окно», и вы можете создавать Windows с помощью функции CreateWindow. Каждое окно будет идентифицировано по 32-битовому целочисленному значению так называемой Window Handle (HWND)

3 Существует так много разных классов окон, которые вы можете себе представить (mainwindow, clientarea, edit, button), которые доступны из системы, а также создаются сами ... Windows отличаются друг от друга, поскольку они принадлежат к разным WindowClass. ..

Для определения WindowClass вы должны заполнить WNDCLASS гр структуру и вызвать RegisterClass Поле в структуры является указателем на WindowFunc

4 WindowFunc является функция, которая принимает 4 входных параметров (HWND, WM_XX , WPARAM, LPARAM) Эта функция будет вызываться из системы, как только что-то происходит относительно этого окна (HWND)

сказал, что позвольте мне переписать ваше заявление

«Мол, если вы хотите, чтобы создать окно, вы вызываете некоторую функцию win32, которая les windows GUI и скажите «Привет, пожалуйста, создайте мне новое окно, 100 x 100 px, с двумя кнопками», и эта функция GUI говорит: «Привет, не проблема, когда что-то происходит, как пользователь нажимает одну кнопку, ... Я пришлю вам сообщение в окноFunc, когда пользователь нажмет ..., пожалуйста, проверьте сам тип messagetype, и если это WM_MOUSEDOWN, вы ждете, а затем измените значение для xy

Что еще? я предлагаю посмотреть на какой-то простой пример в SDK, чтобы получить уверены в том, как выиграть 32 приложение потока

веселит

1

Это просто соглашение для собственных программ Win32. Вы можете легко изменить его, MSVC-компоновщик принимает /ENTRY:main command line option, чтобы изменить имя точки входа на «главное». Вы, однако, также должны изменить подпись основной функции(), она принимает различные аргументы:

int APIENTRY main(HINSTANCE hInstance, 
        HINSTANCE hPrevInstance, 
        LPTSTR lpCmdLine, 
        int  nCmdShow) 
{ 
    // etc.. 
} 

Что я думаю был смысл дать ему другое имя 20 лет назад.

+0

Фактически, точка входа не получает никаких параметров. Версия библиотеки вызывает API, например GetCommandLine и GetStartupInfo, а затем вызывает main или WinMain (или wmain или _wWinMain). Кроме того, «Win3» - это плохой способ сказать «16-битная Windows», так как Windows NT 3.x был изначально 32-разрядным. –

+0

IIRC 'hPrevInstance' является наследием Windows 1, а не 3. – MSalters

1

Вы можете проверить this article и another one от разработчика. Вкратце есть несколько причин: имя произвольное, для Windows 'WinMain требуется другая подпись, а окна предшествуют C++-стандартизации.

Смежные вопросы