Windows Programming/windows.h
The primary C header file for accessing the Win32 API is the <windows.h> header file. To make a Win32 executable, the first step is to include this header file in your source code. The windows.h header file should be included before any other library include, even the C standard library files such as stdio.h or stdlib.h. This is because the windows.h file includes macros and other components that may modify, extend, or replace things in these libraries. This is especially true when dealing with UNICODE, because windows.h will cause all the string functions to use UNICODE instead. Also, because many of the standard C library functions are already included in the Windows kernel, many of these functions will be available to the programmer without needing to load the standard libraries. For example, the function sprintf is included in windows.h automatically.
Child Header Files [ edit | edit source ]
There are a number of header files that are automatically included with windows.h. Many of these files cannot simply be included by themselves, because of dependencies. The windows.h header file is actually a relatively small file, that provides conditional inclusion for a number of other header files, definitions of a few important macros, etc.
For a list of child header files visit———-
Additional Header Files [ edit | edit source ]
This section will talk about some other interesting header files and libraries that can be included with your project, but which are not included by default with windows.h.
windows.h Macros [ edit | edit source ]
This section will briefly detail some of the changes that the user can make in the windows.h structure at compile time using macros.
WIN32_LEAN_AND_MEAN [ edit | edit source ]
The WIN32_LEAN_AND_MEAN macro causes several of the child headers to not be included in the build. This can help to speed up the compilation process.
UNICODE and _UNICODE [ edit | edit source ]
These macros, which we will discuss later, can generally be used interchangeably, but are frequently both defined together. These cause the program to be compiled with UTF-16 encoded strings instead of ASCII encoded strings. UTF-16 is one internationalized encoding based on the UNICODE standard and allows for more characters than the American ASCII encoding, although UTF-8 is often preferred in modern programming.
WINVER and _WIN32_WINNT [ edit | edit source ]
You must set these to a number greater or equal to 0x500 or you will not get some of the useful functions that are in Windows 2000 (and thus in any modern Windows) but were not in Windows 98.
Windows h c что это
Windows.h is the main header file for WinAPI.
WinAPI is anything and everything related to programming on Windows. Anything that involves window creation/management or communication with the OS or filesystem.
Things like:
— Creating Windows
— Basic graphical capabilities (WinGDI)
— Enumerating files in a directory
— Popping up common dialog boxes («Save As» dialog, «Pick a color» dialog, etc)
— Querying information about the system (like running processes, etc)
— etc
— etc
The list goes on and on. WinAPI is huge.
Yes. Though I only know how to handle mouse input through normal windows. not through the console. So if you’re not already using WinAPI to create your own window, then I can’t help you with that immediate problem without writing a big tutorial on WinAPI basics, which is more than I’m willing to do right now =x Sorry.
You should be able to find some ‘getting started with WinAPI’ tutorials on google. Or maybe someone else on here can field your question.
Yes, it is possible.
You should be able to find some thing here, for the console:
http://www.cplusplus.com/forum/lounge/17053/
I don’t have much time, but I’ll throw something together real quick:
Well, I could have just gotten something from the internet, instead of typing all of that out here, but oh well, too late now.
Hope this helped!
Of course, you’re using the wrong character type there.
ref: http://www.cplusplus.com/forum/windows/106683/
The correct structs/functions to use in that code would be:
WNDCLASSA (not WNDCLASS)
CreateWindowA (not CreateWindow)
MessageBoxA (not MessageBox)
Русские Блоги
Комментарий в начале — это описание заголовочного файла:
Этот документ, похоже, не претерпел серьезных изменений и все еще является первой версией. «Увеличьте это значение, если изменение имеет глобальный эффект», что, вероятно, означает «если изменение имеет глобальный эффект, добавьте изменение в этот файл заголовка». В самих словах нет двусмысленности, но вы можете подумать, что если это я, я определенно не буду делать никаких заявлений об изменении этого файла — причина очень проста, это усложнит трансплантацию кода, и есть другие недостатки. фактор. Итак, это предложение, вероятно, то, что разработчики Microsoft сказали «себе». В абстрактной части написано: «Главный включаемый файл для приложений Windows», поэтому нет необходимости объяснять это.
Этот вид макроопределения должен быть наиболее распространенным, одна из функций — предотвращение повторного включения.
Макрос WINVER связан с версией Windows, то есть, когда переменная макроса принимает разные значения, она соответствует разным версиям Windows. Соответствующие инструкции в документации Platform SDK следующие:
Windows Server 2003 WINVER>=0x0502
Windows XP WINVER>=0x0501
Windows 2000 WINVER>=0x0500
Windows NT 4.0 WINVER>=0x0400
Windows Me WINVER>=0x0500
Windows 98 WINVER>=0x0410
Windows 95 WINVER>=0x0400
(Как проверить номер версии моей операционной системы Windows? Один из способов представлен ниже: Вызов диспетчера задач -> Справка -> О диспетчере задач, сделайте то же самое в Windows XP Вы можете обнаружить, что номер версии — 5.1, в то время как это 5.2 в Windows server 2003 и 5.0 в Windows 2000. Ха-ха, действительно, это согласуется с описанием в документации Platform SDK!) Макрос _WIN32_WINNT на самом деле представляет номер версии. Следовательно, если вы определяете этот макрос одновременно, но он несовместим с определением WINVER, то компилятор выдаст ошибку «Настройка WINVER конфликтует с _WIN32_WINNT».
Если заданный WINVER> = 0x0500, минимально необходимая версия Windows — Windows NT 5.0 (Windows 2000) и Windows 98. В это время компилятор выдаст серию сообщений, определенных с помощью #pragma message, в качестве приглашения при компиляции.
Весь следующий контент используется для определения некоторых других файлов заголовков, которые необходимо включить, и, конечно, также включается другая информация.
_MSC_VER Этот макрос определяет версию компилятора, связанная информация выглядит следующим образом:
C Compiler version 6.0 600
C/C++ compiler version 7.0 700
Visual C++, Windows, version 1.0 800
Visual C++, 32-bit, version 1.0 800
Visual C++, Windows, version 2.0 900
Visual C++, 32-bit, version 2.x 900
Visual C++, 32-bit, version 4.0 1000
Visual C++, 32-bit, version 5.0 1100
Visual C++, 32-bit, version 6.0 1200
Этот макрос должен быть определен, #pragma once указывает компилятору включать этот файл заголовка не более одного раза в процессе компиляции.
Что интересно, так это следующий большой комментарий, в котором объясняется, что когда макрос _MSC_VER определен и его номер версии> = 1020, то перечисленные рядом флаги не Можно определить.
Этот раздел немного длинный, но поскольку он интегрирован, его неизбежно анализировать вместе.
Макрос RC_INVOKED, кажется, является основой этого абзаца, поэтому начните с него. RC (компилятор ресурсов) определяет этот макрос, позволяя выборочно компилировать различные части файла заголовка ресурса. Зачем нужна такая необходимость? Когда вы думаете, использовать ли компилятор C или компилятор RC для компиляции файлов заголовков ресурсов, вы должны столкнуться с этой проблемой. Поскольку оператор определения, поддерживаемый RC, является только подмножеством компилятора C, если вы выбираете компиляцию с RC, вы должны быть осторожны, чтобы не записывать файлы заголовков ресурсов с синтаксисом, который RC не поддерживает.
Макрос NO_WINRES фактически определен в файле заголовка winresrc.h, а содержимое файла winresrc.h действительно очень мало:
Ха-ха, прочитав, понять нетрудно.
Следующие определения # если! определено (68K) && !defined(MPPC) . связано с платформой.Так как большинство людей (включая меня) могут работать только на аппаратной платформе, такой как X86, эти определения не должны быть слишком небрежными.
Если RC_INVOKED не определен и _MSC_VER (номер версии компилятора)> = 800, то несколько предупреждений, связанных с версией компилятора, будут отключены. Если макрос RC_INVOKED не определен, необходимо включить два файла заголовков excpt.h и stdarg.h (excpt.h — это недокументированный файл заголовка, который содержит некоторые определения о SEH (структурированной обработке исключений); stdarg. h определяет макросы типа ANSI для функций с несколькими параметрами), так почему в этом случае должны быть включены эти два файла заголовков? Это объясняется в Platform SDK: «RC не поддерживает некоторые предопределенные макросы ANSI C-типа (например,DATE, FILE, LINE, STDC, TIME, TIMESTAMPEtc.) », а два заголовочных файла excpt.h и stdarg.h действительно определяют некоторые макросы ANSI-типа C. Поэтому, чтобы избежать ошибок компиляции, только когда RC не используется (то есть макрос RC_INVOKED не определен) Включайте только эти файлы заголовков.
windows h c описание функций
В программе используются функции, описанные в различных заголовочных файлах из стандартной библиотеки windows.h:
LoadIcon – загружает значок (Icon) для использования в программе;
LoadCursor – загружает курсор (Cursor) мыши;
GetStockObject – получает графический объект – кисть (Stock);
RegisterClassEx – регистрирует класс окна;
CreateWindow – создает окно на основе класса окна;
ShowWindow – выводит окно на экран;
UpdateWindow – заставляет окно перерисовать свое содержимое;
GetMessage – получает сообщение из очереди сообщений;
TranslateMessage – преобразует некоторые сообщения, полученные с помощью клавиатуры;
DispatchMessage – отправляет сообщение оконной процедуре;
BeginPaint – инициирует начало процесса рисования окна;
GetClientRect – получает размер рабочей области окна;
DrawText – выводит на экран строку текста;
EndPaint – прекращает рисование окна;
PostQuitMessage – вставляет сообщение «Завершить» в очередь сообщений;
DefWindowProc – выполняет обработку сообщений по умолчанию.
Идентификаторы и типы данных
При программировании в среде Windows используют соглашения по именованию переменных – идентификатор переменной составляется из букв или частей слов, отражающих смысл этой переменной.
Префиксы некоторых переменных, использующихся в дальнейшем: c – символ; by –BYTE (беззнаковый символ); n –короткое целое; i –целое; cx, cy – целое (длины x и y; с означает счет – count); b или f –BOOL (булево целое, f – флаг – flag); w – WORD (беззнаковое короткое целое); l – LONG (длинное целое); dw – DWORD (беззнаковое длинное целое); fn – функция; s – строка; sz –строка, завершаемая нулем (string terminated by zero); h –описатель (handle); p – указатель (pointer).
Идентификаторы, написанные прописными буквами, задаются в заголовочных файлах Windows. Двух- или трехбуквенный префикс, за которым следует символ подчеркивания, показывает основную категорию ее принадлежности, например: CS – опция стиля класса (Class Style); IDI – идентификационный номер иконки (ID Icon); IDC – идентификационный номер курсора; WS – стиль окна (windows style); WM – cообщение окна.
Аналогичен смысл новых типов данных, например, тип UINT – 32-разрядное беззнаковое целое (unsigned int), PSTR – указатель на строку символов (pointer string), т.е. char*; LONG – длинное целое.
WndProc возвращает значение типа LRESULT – Long RESULT. Функция WinMain получает тип WINAPI (как и любая другая функция Windows), а функция WndProc получает тип CALLBACK – эти идентификаторы являются ссылкой на особую последовательность вызовов функций, которая имеет место между ОС Windows и ее приложением.
В программе использованы структуры данных: MSG – структура сообщения (message); WNDCLASSEX – структура класса окна; PAINTSTRUCT – структура рисования; RECT – структура прямоугольника.
При обозначении переменных структуры пользуются именем самой структуры и строчными буквами, например, переменная msg – структура типа MSG; wndclass – структура типа WNDCLASSEX.
В программе используются идентификаторы, предназначенные для разных типов описателей (handles): HINSTANCE – описатель экземпляра (instance) самой программы; HWND – описатель окна (handle to a window); HDC – описатель контекста устройства.
Основная программа
Для работы программы подключен файл windows.h, содержащий заголовочные файлы с объявлениями функций, структур и числовых констант. Далее следует декларация прототипа функции WndProc – «оконная процедура» для окна программы Hello.
Основной функцией (точкой входа программы), аналогом стандартной функции main языка Си для Windows является функция WinMain:
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow);
использующая последовательность вызовов WINAPI и возвращающая ОС Windows целое значение. В ней используются четыре параметра:
hInstance – описатель экземпляра – уникальное число, идентифицирующее программу;
hPrevInstance – предыдущий (previous) экземпляр; если в данный момент не было загружено копий программы, то hPrevInstance = 0 или NULL;
szCmdLine – указатель на строку, в которой содержатся любые параметры, переданные в программу из командной строки;
iCmdShow – число, показывающее, каким должно быть выведено на экран окно в начальный момент; обычно: SW_SHOWNORMAL (1) – вывод окна нормального размера, SW_SHOWMINNOACTIVE (7) – окно должно быть изначально свернутым; префикс SW означает «показать окно» (show window).
Регистрация класса окна
Окно всегда создается на основе класса окна. Класс окна идентифицирует оконную процедуру, которая выполняет процесс обработки поступающих сообщений.
Перед созданием окна необходимо зарегистрировать класс окна, вызвав функцию RegisterClassEx, это расширенная версия функции Register-Class (Ex – extended – расширенный). Параметр функции – указатель на структуру типа WNDCLASSEX, определенную в заголовочных файлах:
typedef struct tagWNDCLASSEX WNDCLASSEX;
Префиксы LP и lp означают «длинный указатель» (long pointer), приставка lpfn – «длинный указатель на функцию» (long pointer to a function); приставка cb – «счетчик байт» (counter of bytes); префикс hbr – это «описатель кисти» (handle to a brush).
Для работы WinMain необходимо определить эту структуру:
WNDCLASSEX wndclass;
наиболее важными в ней являются второе и третье от конца поля. Второе поле – имя класса окна (обычно совпадает с именем программы), третье поле – адрес оконной процедуры, использующейся для всех окон, созданных на основе этого класса. Другие поля описывают характеристики окон, создаваемых на основе этого класса окна.
Поле cbSize равно длине структуры. Инструкция:
wndclass.style = CS_HREDRAW | CS_VREDRAW;
осуществляет объединение двух идентификаторов «стиля класса» с помощью поразрядной операции «ИЛИ» (|). В заголовочных файлах Windows, идентификаторы, начинающиеся с префикса CS, задаются в виде 32-разрядной константы, только один из разрядов которой установлен в 1. Например, CS_VREDRAW (горизонтальный) – 0x0001, а CS_HREDRAW (вертикальный) – 0x0002 показывают, что все окна должны целиком перерисовываться при изменении размеров окна. Эти идентификаторы называют «поразрядными флагами» (bit flags).
Третье поле wndclass.lpfnWndProc = WndProc; устанавливает оконную процедуру данного окна.
Следующие две инструкции:
wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0;
резервируют дополнительное пространство, которое может быть использовано программой, в данной программе эта возможность не используется – значения равны 0, иначе в этом поле было бы установлено «число байт» резервируемой памяти.
В следующем поле – описатель экземпляра программы, который является одним из параметров WinMain:
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
устанавливают значки (иконки), которые появляется на панели задач и в заголовке окна. Для получения описателя стандартного значка первый параметр устанавливается в NULL; при загрузке пользовательского значка этот параметр должен быть равен описателю экземпляра программы. Второй параметр определяется в заголовочных файлах, значок IDI_APPLICATION – это маленькое изображение окна. Функция LoadIcon возвращает описатель этого значка для полей wndclass.hIcon и wndclass.hIconSm, имеющих тип HICON («описатель значка» – handle to an icon).
Функция LoadCursorзагружает стандартный курсор IDC_ARROW и возвращает его описатель полю hCursor:
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
Поле hbrBackground задает цвет фона рабочей области окон (префикс hbr означает «описатель кисти» – handle to a brush). Кисть – графический объект, используемый для закрашивания области. В Windows имеется несколько стандартных кистей. В инструкции
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);
функция GetStockObject возвращает описатель белой кисти.
Следующее поле задает меню класса окна, т.к. в нашем случае оно отсутствует – поле установлено в NULL:
На последнем этапе классу должно быть присвоено имя, которое может совпадать с именем программы, хранящемся в переменной szAppName:
После того как инициализированы все поля структуры, регистрируем класс окна, вызывая функцию: RegisterClassEx (&wndclass);
Создание окна
Класс окна определяет основные характеристики окна, что позволяет использовать один и тот же класс для создания множества различных окон.
Функция CreateWindow создает окно, детализируя информацию о нем, которая должна передаваться функции в качестве параметров:
hwnd = CreateWindow (szAppName, – имя класса окна;
«First Example», – заголовок окна;
WS_OVERLAPPEDWINDOW, – стиль окна;
CW_USEDEFAULT, – начальное положение по x
CW_USEDEFAULT, и по y;
CW_USEDEFAULT, – начальные размеры по x
CW_USEDEFAULT, и по y;
NULL, – описатель родительского окна;
NULL, – описатель меню окна;
hInstance, – описатель экземпляра программы;
NULL); – параметры создания.
Параметр «имя класса окна» – szAppName содержит строку «Hello», являющуюся именем зарегистрированного класса окна, этот параметр связывает окно с классом окна.
Окно, созданное программой, является обычным перекрывающимся окном с заголовком, системным меню слева на строке заголовка, иконками для сворачивания, разворачивания и закрытия окна.
WS_OVERLAPPEDWINDOW – стандартный «стиль окна»; «заголовок окна» – текст, который выводится в строке заголовка.
Параметры «начальное положение по x и по y» задают начальные координаты верхнего левого угла окна относительно левого верхнего угла экрана; идентификатор CW_USEDEFAULT задает по умолчанию начальное положение для перекрывающегося окна; аналогично задаются значения параметров «начальные размеры по x и по y».
Поскольку у нашего окна отсутствует родительское окно, параметр «описатель родительского окна» – NULL; аналогично «описатель меню окна» – NULL (у окна нет меню).
В параметр «описатель экземпляра программы» помещается описатель экземпляра, переданный программе в качестве параметра функции WinMain.
Значение «параметры создания» установлено в NULL, при необходимости этот параметр используется в качестве указателя на данные, к которым программа в дальнейшем могла бы обратиться.
Функция CreateWindow возвращает описатель созданного окна, который хранится в переменной hwnd типа. У каждого окна в Windows имеется его описатель, который используется для ссылки на это окно. При создании нескольких окон каждое из них имеет свой описатель, являющийся одним из важнейших, которыми оперирует программа для Windows.
Для многих функций Windows в качестве параметра требуется hwnd, благодаря чему Windows знает, к какому окну применить эту функцию.
Отображение окна
К тому времени, когда функция CreateWindow возвращает управление программе, окно уже создано внутри Windows, однако на экране монитора оно еще не появилось. Выводит окно на экран функция
ShowWindow (hwnd, iCmdShow);
параметр hwnd – описатель созданного окна; параметр iCmdShow – задает начальный вид окна на экране: SW_SHOWNORMAL (1) – на экран выводится обычное окно, фон рабочей области закрашивается заданной в классе окна кистью; SW_SHOWMINNOACTIVE (7) – окно не выводится, а на панели задач появляются его имя и иконка.
Функция UpdateWindow (hwnd); выполняет перерисовку рабочей области окна, посылая сообщение WM_PAINT в оконную процедуру (WndProc).
Цикл обработки сообщений
Программа получает информацию от пользователя через клавиатуру и мышь. Для каждой программы, работающей в данный момент, Windows поддерживает «очередь сообщений» (message queue). Когда происходит ввод информации, она преобразуется в «сообщение», которое помещается в эту очередь.
Программа извлекает сообщения из очереди, выполняя блок соответствующих команд, известный как «цикл обработки сообщений» (message loop):