Что такое код ansiupperbuff

Содержание

Операционная система Microsoft Windows 3.1 для программиста

5. Клавиатура

Способы работы с клавиатурой в среде Windows коренным образом отличаются от тех, к которым вы привыкли, когда составляли программы для MS-DOS. Из-за чрезвычайно слабой поддержки клавиатуры со стороны MS-DOS программы обычно вызывали прерывание INT16h, обработчик которого находится в BIOS. Приложения Windows не могут воспользоваться этим прерыванием, но в их распоряжении находится куда более мощный механизм сообщений.

Когда вы нажимаете клавиши, клавиатура генерирует аппаратное прерывание. Обработчик клавиатурного прерывания находится внутри драйвера клавиатуры. Драйвер клавиатуры является составной частью операционной системы Windows. Его задача — генерация на основе аппаратных прерываний клавиатурных сообщений и запись этих сообщений во внутреннюю системную очередь сообщений Windows. Когда вы нажимаете на клавишу и затем отпускаете ее, в системную очередь записывается несколько сообщений.

Программа MS-DOS монопольно распоряжается клавиатурой. Она, например, может позволить себе приостановить свою работу до тех пор, пока вы не нажмете какую-либо клавишу. В среде Windows работает одновременно несколько приложений. Каждое приложение может создать несколько окон. Задачей Windows является правильное распределение сообщений в очереди приложений, с одной стороны, и в функции окон, принадлежащих приложениям, с другой.

Для распределения сообщений от клавиатуры используется концепция так называемого фокуса ввода (input focus). Фокус ввода — это атрибут, который может присваиваться окну, созданному приложением или Windows. Если окно имеет фокус ввода, соответствующая функция окна получает все клавиатурные сообщения из системной очереди.

Приложение может передавать фокус ввода от одного окна другому. Когда вы переключаетесь на другое приложение, фокус ввода передается активному окну приложения, на которое было выполнено переключение, или дочернему окну, созданному активным окном.

Функция окна может проследить за получением и потерей фокуса ввода. Когда окно получает фокус ввода, функции окна передается сообщение WM_SETFOCUS. Когда окно теряет фокус ввода, функции окна передается сообщение WM_KILLFOCUS. В ответ на эти сообщения функция окна не может запретить получение или потерю фокуса ввода, так что это сообщение носит чисто информирующий характер.

Программный интерфейс Windows содержит две функции, позволяющие узнать или изменить окно, владеющее фокусом ввода. Эти функции имеют соответственно имена GetFocus и SetFocus.

Сообщения, генерируемые драйвером клавиатуры, являются сообщениями низкого уровня. Они несут в себе такую информацию, как, например, скан-код нажатой клавиши. Приложения не пользуются такими сообщениями. Операционная система Windows выполняет преобразование клавиатурных сообщений низкого уровня в сообщения, которые содержат коды виртуальных клавиш (virtual-key code).

Код виртуальной клавиши соответствуют не расположению клавиши на клавиатуре, а действию, которое выполняет эта клавиша. Приложение обрабатывает коды виртуальных клавиш, а соответствие виртуальных и физических клавиш обеспечивается драйвером клавиатуры.

Есть и еще более высокий уровень сообщений. Сообщения этого уровня получаются в результате преобразований сообщений с кодами виртуальных клавиш. Примером могут служить сообщения от меню. Вы можете выбрать строку меню с помощью клавиатуры, и при этом приложение не будет анализировать последовательность нажимаемых при выборе из меню клавиш. Приложение получит от Windows сообщение о том, что из такого-то меню выбрана такая-то строка. Приложение может даже не знать, каким образом сделан выбор — с помощью клавиатуры или мыши. Оно получает информацию лишь о том, что сделан выбор. Таким образом, Windows облегчает работу программиста при создании меню, избавляя его от необходимости следить за действиями оператора при выборе строки.

Сразу отметим, что приложения Windows редко используют методику посимвольного ввода и отображения, широко распространенную при создании программ MS-DOS. Практически посимвольный ввод и отображение используются только в сложных текстовых редакторах, использующих шрифты с переменной шириной символов и шрифтовое выделение слов. Если вам нужен простой однострочный или многострочный редактор текста, вы можете воспользоваться стандартным средством Windows — окном, для которого в Windows зарегистрирован класс окна с именем EDIT. Поэтому если ваше приложение должно обеспечить ввод отдельных слов, чисел, заполнение простейших форм или создание несложных (без шрифтового выделения) текстов, лучше всего воспользоваться готовым классом окна.

Мы рассмотрим в отдельной главе несколько стандартных классов окон, зарегистрированных самой операционной системой Windows и предназначенных для создания таких органов управления, как кнопки, переключатели, меню, однострочные и многострочные текстовые редакторы и т. п.

Другое дело — работа с функциональными клавишами и клавишами перемещения курсора. Чаще всего приложения Windows обрабатывают сообщения, поступающие от этих клавиш, для выполнения каких-либо действий, связанных, например, с просмотром текста в окне, переключением режимов работы или выполнением каких-либо других функций.

Так как операционная система Windows является графически ориентированной, приложения активно используют мышь. Однако обычно мышь дублируется клавиатурой, то есть те действия, которые вы можете выполнить с помощью мыши, можно выполнить и с помощью клавиатуры. Это не относится к графическим редакторам, которые обычно становятся полностью неработоспособными, если компьютер не оснащен мышью.

Некоторые приложения могут даже полностью игнорировать присутствие клавиатуры. Так, например, поступали все наши предыдущие примеры приложений.

5.1. Клавиатурные сообщения

От клавиатуры может поступать четыре сообщения — WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP. Когда вы нажимаете клавишу, генерируется сообщение WM_KEYDOWN или WM_SYSKEYDOWN, в зависимости от того, какая была нажата клавиша и была ли эта клавиша нажата в комбинации с клавишей . При отпускании клавиши генерируется сообщение WM_KEYUP или WM_SYSKEYUP.

Клавиатурные сообщения с префиксом WM_SYS называются системными клавиатурными сообщениями. Приложение редко обрабатывает системные сообщения от клавиатуры, передавая их в неизменном виде функции DefWindowProc. Обработка системных клавиатурных сообщений обычно сводится к выбору элементов меню, переключения на другое окно или другое приложение. Системные сообщения предназначены для Windows.

Сообщения WM_KEYDOWN и WM_KEYUP, напротив, предназначены для приложения. Если приложение желает отреагировать на ту или иную клавишу или комбинацию клавиш, оно должно обработать соответствующее сообщение.

Когда окно сворачивается в пиктограмму, его тоже можно сделать активным. При этом надпись, расположенная около пиктограммы, выделяется изменением цвета фона. Ни одно окно в свернутом приложении не получает фокус ввода, поэтому все сообщения от клавиатуры транслируются в системные сообщения. Вы, однако, можете перехватить любое системное сообщение и определить для него собственный обработчик.

5.2. Параметры клавиатурных сообщений

Сообщения WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP передают информацию о нажатой клавише через параметры lParam и wParam.

Параметр lParam для этих сообщений содержит информацию низкого уровня, такую, как скан-код, счетчик повторов, флаг предыдущего состояния клавиши и т. п. Эта информация редко используется приложениями Windows.

Параметр wParam содержит код виртуальной клавиши, соответствующей нажатой физической клавише. Именно этот параметр используется приложениями для идентификации нажатой клавиши.

Приведем описание отдельных бит парамера lParam.

Бит Описание
0-15 Счетчик повторов. Если нажать клавишу и держать ее в нажатом состоянии, несколько сообщений WM_KEYDOWN и WM_SYSKEYDOWN будут слиты в одно. Количество объединенных таким образом сообщений
16-23 OEM скан-код клавиши. Изготовители аппаратуры (OEM — Original Equipment Manufacturer) могут заложить в своей клавиатуре различное соответствие скан-кодов и обозначений клавиш. Скан-код генерируется клавиатурным контроллером. Это тот самый код, который получают в регистре AH программы MS-DOS, вызывая прерывание INT16h
24 Флаг расширенной клавиатуры. Этот бит установлен в 1, если сообщение соответствует клавише, имеющейся только на расширенной 101- или 102-клавишной клавиатуре. Это может быть одна из следующих клавиш: , ,

, , , клавиши дополнительной клавиатуры.

25-26 Не используются
27-28 Зарезервированы для использования Windows
29 Код контекста. Этот бит равен 1, если сообщение соответствует комбинации клавиши с любой другой, и 0 в противном случае
30 Предыдущее состояние клавиши. Если перед приходом сообщения клавиша, соответствующая сообщению, была в нажатом состоянии, этот бит равен 1. В противном случае бит равен 0
31 Флаг изменения состояния клавиши (transition state). Если клавиша была нажата, бит равен 0, если отпущена — 1

Если нажать клавишу и оставить ее в нажатом состоянии, функция окна может получить подряд несколько сообщений WM_KEYDOWN, прежде чем придет сообщение WM_KEYUP. В этом случае бит предыдущего состояния клавиши (бит 30) можно использовать для обнаружения сообщений, возникших в результате включения автоповтора клавиатуры. Приложение может игнорировать такие сообщения, исключая эффект накопления, когда приложение не может обрабатывать сообщения с такой скоростью, с какой они поступают. Например, если вы будете долго держать клавишу пролистывания страниц в текстовом редакторе, то после того, как вы ее отпустите, текстовый редактор будет еще долго листать ваш документ.

Для сообщений WM_KEYDOWN и WM_KEYUP значение кода контекста (бит 29) и флага изменения состояния (бит 31) всегда равно 0.

Для сообщений WM_SYSKEYUP и WM_SYSKEYDOWN бит 31 равен 1. Но есть два исключения.

Во-первых, если активное окно свернуто в пиктограмму, все сообщения от клавиатуры преобразовываются в системные и, если клавиша не нажата, код контекста равен 0.

Во-вторых, на некоторых клавиатурах для ввода символов национального языка могут использоваться комбинации с участием клавиш , , и т. п. В этом случае код контекста может быть равен 1, хотя сообщение не является системным.

Обработчик клавиатурного сообщения должен возвратить значение 0 для всех перехваченных сообщений.

Теперь мы расскажем вам о параметре wParam.

Как мы уже говорили, этот параметр содержит код виртуальной клавиши, соответствующей нажатой физической клавише. Код виртуальной клавиши не зависит от аппаратной реализации клавиатуры.

Многие коды виртуальных клавиш имеют символьное обозначение, определенное в файле windows.h. Приведем полный список кодов виртуальных клавиш. Те из них, которые определены в файле windows.h, имеют префикс VK_ (от слов Virtual Key).

Символическое имя Код виртуальной клавиши Клавиша, которой соответствует данный код Клавиша на клавиатуре IBM PC
Не определено 0x0
VK_LBUTTON 0x1 Левая клавиша мыши
VK_RBUTTON 0x2 Правая клавиша мыши
VK_CANCEL 0x3
VK_MBUTTON 0x4 Средняя клавиша мыши
Не определено 0x5 — 0x7 Не определено
VK_BACK 0x8 Клавиша забоя Клавиша забоя
VK_TAB 0x9 Клавиша табулятора
Не определено 0xa — 0xb Не определено
VK_CLEAR 0xc CLEAR Соответствует клавише дополнительной клавиатуры при выключенном режиме
VK_RETURN 0xd RETURN
Не определено 0xe — 0xf Не определено
VK_SHIFT 0x10 SHIFT
VK_CONTROL 0x11 CONTROL
VK_MENU 0x12 MENU
VK_PAUSE 0x13 PAUSE
VK_CAPITAL 0x14 CAPITAL
Не определено 0x15 — 0x19 Зарезервировано для систем Kanji
Не определено 0x1a Не определено
VK_ESCAPE 1b ESCAPE
Не определено 0x1c — 0x1f Не определено
VK_SPACE 0x20 Клавиша пробела SPACEBAR Клавиша пробела
VK_PRIOR 0x21 PAGE UP
VK_NEXT 0x22 PAGE DOWN
VK_END 0x23 END
VK_HOME 0x24 HOME
VK_LEFT 0x25 Перемещение курсора влево LEFT ARROW Клавиша перемещения курсора влево
VK_UP 0x26 Перемещение курсора вверх UP ARROW Клавиша перемещения курсора вверх
VK_RIGHT 0x27 Перемещение курсора вправо RIGHT ARROW Клавиша перемещения курсора вправо
VK_DOWN 0x28 Перемещение курсора вниз DOWN ARROW Клавиша перемещения курсора вниз
VK_SELECT 0x29 SELECT
VK_PRINT 0x2a Зависит от изготовителя клавиатуры
VK_EXECUTE 0x2b EXECUTE
VK_SNAPSHOT 0x2c PRINTSCREEN
VK_INSERT 0x2d INSERT
VK_DELETE 0x2e DELETE
VK_HELP 0x2f HELP
Не определено 0x30
Не определено 0x31 1
Не определено 0x32 2
Не определено 0x33 3
Не определено 0x34 4
Не определено 0x35 5
Не определено 0x36 6
Не определено 0x37 7
Не определено 0x38 8
Не определено 0x39 9
Не определено 0x3a — 0x40 Не определено
Не определено 0x41 A
Не определено 0x42 B
Не определено 0x43 C
Не определено 0x44 D
Не определено 0x45 E
Не определено 0x46 F
Не определено 0x47 G
Не определено 0x48 H
Не определено 0x49 I
Не определено 0x4a J
Не определено 0x4b K
Не определено 0x4c L
Не определено 0x4d M
Не определено 0x4e N
Не определено 0x4f O
Не определено 0x50 P
Не определено 0x51 Q
Не определено 0x52 R
Не определено 0x53 S
Не определено 0x54 T
Не определено 0x55 U
Не определено 0x56 V
Не определено 0x57 W
Не определено 0x58 X
Не определено 0x59 Y
Не определено 0x5a Z
Не определено 0x5b — 0x5f Не определено
VK_NUMPAD0 0x60 0 на цифровой клавиатуре на цифровой клавиатуре
VK_NUMPAD1 0x61 1 на цифровой клавиатуре на цифровой клавиатуре
VK_NUMPAD2 0x62 2 на цифровой клавиатуре на цифровой клавиатуре
VK_NUMPAD3 0x63 3 на цифровой клавиатуре на цифровой клавиатуре
VK_NUMPAD4 0x64 4 на цифровой клавиатуре на цифровой клавиатуре
VK_NUMPAD5 0x65 5 на цифровой клавиатуре на цифровой клавиатуре
VK_NUMPAD6 0x66 6 на цифровой клавиатуре на цифровой клавиатуре
VK_NUMPAD7 0x67 7 на цифровой клавиатуре на цифровой клавиатуре
VK_NUMPAD8 0x68 8 на цифровой клавиатуре на цифровой клавиатуре
VK_NUMPAD9 0x69 9 на цифровой клавиатуре на цифровой клавиатуре
VK_MULTIPLAY 0x6a Клавиша умножения на цифровой клавиатуре
VK_ADD 0x6b Клавиша сложения на цифровой клавиатуре
VK_SEPARATOR 0x6c Клавиша разделения
VK_SUBTRACT 0x6d Клавиша вычитания на цифровой клавиатуре
VK_DECIMAL 0x6e Клавиша десятичной точки на цифровой клавиатуре
VK_DIVIDE 0x6f Клавиша деления на цифровой клавиатуре
VK_F1 0x70 F1
VK_F2 0x71 F2
VK_F3 0x72 F3
VK_F4 0x73 F4
VK_F5 0x74 F5
VK_F6 0x75 F6
VK_F7 0x76 F7
VK_F8 0x77 F8
VK_F9 0x78 F9
VK_F10 0x79 F10
VK_F11 0x7a F11
VK_F12 0x7b F12
VK_F13 0x7c F13
VK_F14 0x7d F14
VK_F15 0x7e F15
VK_F16 0x7f F16
Не определено 0x80 — 0x87 Зависит от изготовителя клавиатуры
Не определено 0x88 — 0x8f Не определено
VK_NUMLOCK 0x90 NUM LOCK
VK_SCROLL 0x91 SCROLL LOCK
Не определено 0x92 — 0xb9 Не определено
Не определено 0xba Клавиша знака пунктуации ;
Не определено 0xbb Плюс + =
Не определено 0xbc Запятая ,
Не определено 0xbf Клавиша знака пунктуации / ?
Не определено 0xc0 Клавиша знака пунктуации `
Не определено 0xc1 — 0xda Не определено
Не определено 0xdb Клавиша знака пунктуации [ <
Не определено 0xdc Клавиша знака пунктуации \ |
Не определено 0xdd Клавиша знака пунктуации ] >
Не определено 0xde Клавиша знака пунктуации ‘ «
Не определено 0xdf Клавиша знака пунктуации
Не определено 0xe0 — 0xe1 Зависит от изготовителя клавиатуры
Не определено 0xe2 Знак неравенства
Не определено 0xe3 — 0xe4 Зависит от изготовителя клавиатуры
Не определено 0xe5 Не определено
Не определено 0xe6 Зависит от изготовителя клавиатуры
Не определено 0xe7 — 0xe8 Не определено
Не определено 0xe9 — 0xf5 Зависит от изготовителя клавиатуры
Не определено 0xf6 — 0xff Не определено

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

Для определения состояния клавиш , , , сразу после получения сообщения функция окна должна вызвать функцию с именем GetKeyState, которая входит в программный интерфейс Windows. Приведем прототип этой функции:

Параметр функции vkey должен указывать код виртуальной клавиши, для которой необходимо вернуть состояние.

Старший бит возвращаемого значения, установленный в 1, говорит о том, что указанная клавиша была нажата. Если этот бит равен 0, клавиша не была нажата.

Младший бит возвращаемого значения указывает состояние переключения. Если он равен 1, клавиша (такая, как или ) находится во включенном состоянии, то есть она была нажата нечетное число раз после включения компьютера. Учтите, что при помощи программы установки параметров компьютера SETUP, расположенной в BIOS, вы можете задать произвольное состояние переключающих клавиш после запуска системы.

Функция GetKeyState возвращает состояние клавиши на момент извлечения сообщения из очереди приложения функцией GetMessage.

Параметр функции vkey должен указывать код виртуальной клавиши, для которой необходимо вернуть состояние.

Старший бит возвращаемого значения, установленный в 1, говорит о том, что указанная клавиша была нажата в момент вызова функции. Если этот бит равен 0, клавиша не была нажата.

Младший бит возвращаемого значения установлен в 1, если указанная клавиша была нажата с момента последнего вызова функции GetAsyncKeyState.

Если для функции в качестве параметра задать значения VK_LBUTTON или VK_RBUTTON, можно узнать состояние клавиш, расположенных на корпусе мыши.

Есть возможность определить и изменить состояние для всех клавиш одновременно.

Для определения состояния клавиш воспользуйтесь функцией GetKeyboardState:

Единственный параметр lpbKeyState этой функции — дальний указатель на массив из 256 байт. После вызова функции этот массив будет заполнен информацией о состоянии всех виртуальных клавиш в момент генерации клавиатурного сообщения. В этом смысле функция аналогична функции GetKeyState.

Для любого байта массива установленный в 1 старший бит означает, что соответствующая клавиша была нажата. Если этот бит равен 0, клавиша не была нажата. Младший бит, установленный в 1, означает, что клавиша была переключена. Если младший бит равен 0, клавиша не была переключена.

После вызова функции GetKeyboardState вы можете изменить содержимое массива и вызвать функцию SetKeyboardState, изменяющую состояние клавиатуры:

Функция GetKeyboardType позволит вам определить тип клавиатуры и количество имеющихся на ней функциональных клавиш:

В зависимости от значения параметра fnKeybInfo функция может возвращать различную информацию о клавиатуре.

Если задать значение параметра fnKeybInfo, равное 0, функция вернет код типа клавиатуры:

Код Тип клавиатуры Количество функциональных клавиш
1 Клавиатура IBM PC/XT или совместимая, 83-клавишная 10
2 Клавиатура Olivetti «ICO», 102-клавишная 12 (иногда 18)
3 Клавиатура IBM AT или аналогичная, 84-клавишная 10
4 Клавиатура IBM Enhanced (улучшенная), 101- или 102-клавишная 12
5 Клавиатура Nokia 1050 или аналогичная 10
6 Клавиатура Nokia 9140 или аналогичная 24
7 Японская клавиатура Зависит от аппаратуры

Если задать значение параметра, равное 1, функция вернет код подтипа клавиатуры.

И наконец, если задать значение параметра, равное 2, функция вернет количество функциональных клавиш, имеющихся на клавиатуре.

Интересна также функция GetKeyNameText, возвращающая для заданного кода виртуальной клавиши название соответствующей клавиши в виде текстовой строки. Названия виртуальных клавиш определены в драйвере клавиатуры.

Приведем прототип функции GetKeyNameText:

Первый параметр функции lParam должен определять клавишу в формате компоненты lParam клавиатурного сообщения. Вы можете использовать в качестве этого параметра значение lParam, полученное функцией окна вместе с любым клавиатурным сообщением, таким, как WM_KEYDOWN или WM_SYSKEYDOWN.

Второй параметр — lpszBuffer является указателем на буфер, в который будет записано название клавиши.

Третий параметр — cbMaxKey должен быть равен длине буфера, уменьшенной на 1.

Приведем исходный текст приложения KBTYPE, определяющего тип и подтип клавиатуры, а также количество функциональных клавиш (листинг 5.1).

Листинг 5.1. Файл kbtype\kbtype.cpp

Приложение использует файл определения модуля, приведенный в листинге 5.2.

Листинг 5.2. Файл kbtype\kbtype.def

Работа приложения KBTYPE понятна без дополнительных комментариев. Единственное, на чем нам хотелось бы остановиться, так это на использовании для подготовки текстового буфера функции wsprintf.

Функция wsprintf входит в ядро Windows и используется аналогично функции sprintf. Эта функция определена в файле windows.h следующим образом:

Первый параметр функции является дальним указателем на буфер, в который будет записана сформированная текстовая строка, закрытая двоичным нулем.

Второй параметр — указатель на строку формата, определяющую формат строки, которая будет записана в буфер. Допустимо использовать следующие спецификаторы форматов вывода:

Спецификатор Формат
c Один символ
d, i Целое число со знаком
ld, li Двойное целое число со знаком
u Целое число без знака
lu Двойное целое число без знака
lx, lX Двойное целое число без знака в шестнадцатеричном формате строчными или прописными буквами
s Текстовая строка

Далее следует произвольное число переменных, описанных в строке формата. Так как функции передается переменное число параметров, она (в отличие от подавляющего большинства функций программного интерфейса Windows) использует для передачи параметров соглашение языка Си, а не Паскаль.

Для вывода текстовых строк необходимо использовать явное преобразование типа, как это сделано в нашем примере:

Функция возвращает количество байт, записанных в выходной буфер, без учета двоичного нуля, закрывающего текстовую строку.

На рис. 5.1 представлено сообщение, которое было выведено при запуске приложения KBTYPE на компьютере одного из авторов этой книги.

Рис. 5.1. Сообщение приложения KBTYPE

Прежде чем перейти к следующему разделу, приведем исходные тексты еще одного приложения, демонстрирующего использование функций GetKeyboardState и SetKeyboardState для изменения состояния клавиш , , . Это приложение называется KBLED. Исходный текст основного файла приложения приведен в листинге 5.3.

Листинг 5.3. Файл kbled\kbled.cpp

Это простое приложение выводит на экран сообщение, в котором говорится, что для переключения состояния виртуальных клавиш надо нажать кнопку «OK». Когда вы нажмете эту кнопку, состояние трех виртуальных клавиш изменится на противоположное. Это нетрудно проконтролировать при помощи светодиодов, расположенных на клавиатуре: все они должны изменить свое состояние на противоположное.

Когда вы ответите на второе сообщение, приложение возвратит исходное состояние клавиш (и светодиодов).

Файл определения модуля для приложения KBLED приведен в листинге 5.4.

Листинг 5.4. Файл kbled\kbled.def

5.3. Символьные клавиатурные сообщения

Рассмотренные выше клавиатурные сообщения хорошо подходят для работы с функциональными клавишами и клавишами перемещения курсора, но они непригодны для работы с обычными символьными клавишами. Если вам надо сделать, например, собственный текстовый редактор, вы должны уметь различать прописные и строчные буквы, учитывая нижний и верхний регистр, а также учитывать особенности работы с национальными алфавитами.

Теоретически распознавание регистра можно выполнить с помощью только что описанной функции GetKeyState, однако есть более удобный способ, который к тому же обеспечивает учет национальных алфавитов. Этот способ основан на применении функции TranslateMessage, которая включается в цикл обработки сообщений:

Функция TranslateMessage преобразует клавиатурные сообщения WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN и WM_SYSKEYUP в символьные сообщения WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHAR. Образованные символьные сообщения помещаются в очередь сообщений приложения, причем оригинальные клавиатурные сообщения из этой очереди не удаляются.

Параметр lParam для символьного сообщения равен параметру lParam клавиатурного сообщения, из которого первое было образовано, то есть в процессе преобразования значение lParam не изменяется.

Параметр wParam содержит код символа, соответствующего нажатой клавише в так называемом стандарте ANSI, принятом в Windows для представления символов. Этот код определяется функцией TranslateMessage с учетом состояния клавиш , , , и используемого национального языка.

Из всех четырех символьных сообщений приложения чаще всего используют сообщение WM_CHAR, которое передается функции окна в результате трансляции сообщения WM_KEYDOWN. Сообщение WM_SYSCHAR образуется из сообщения WM_SYSKEYDOWN и обычно игнорируется приложением (передается функции DefWindowProc).

Сообщения WM_DEADCHAR и WM_SYSDEADCHAR образуются при использовании клавиатур, имеющих дополнительную клавишу для снабжения символов диакритическими знаками (например, символ «Ў» снабжен диакритическим знаком). Такие дополнительные клавиши называются «мертвыми» клавишами, так как они не образуют символов, а лишь изменяют действие следующей нажимаемой клавиши. Эти клавиши определяются на основе информации об используемом национальном алфавите.

Если после «мертвой» клавиши была нажата правильная, обычная клавиша (не все символы могут иметь диакритические знаки), в очередь приложения помещаются два сообщения — WM_DEADCHAR и WM_CHAR. Последнее в параметре wParam передает ANSI-код введенного символа, имеющего диакритический знак.

Если после «мертвой» клавиши была нажата клавиша, соответствующая символу, который не может иметь диакритического знака, то в очередь приложения после сообщения WM_DEADCHAR будут записаны два сообщения WM_CHAR. Первое сообщение будет соответствовать коду «мертвой» клавиши, интерпретированному как код символа, второе — коду клавиши, нажатой после «мертвой».

Поэтому приложению достаточно обрабатывать только сообщение WM_CHAR, игнорируя сообщение WM_DEADCHAR (за исключением тех случаев, когда после нажатия «мертвой» клавиши на экране необходимо отобразить диакритический знак). Параметр wParam сообщения WM_CHAR будет содержать правильный ANSI-код символа, учитывающий использование «мертвых» клавиш.

5.4. Стандарты кодов символов

В операционной системе MS-DOS использовался расширенный набор символов, определенный фирмой IBM (IBM extended character set). В этот набор входят буквы английского алфавита, знаки пунктуации и псевдографики (рис. 5.2).

Рис. 5.2. Расширенный набор символов IBM

Для обеспечения возможности работы с символами кириллицы фирма Microsoft разработала набор символов, соответствующий 866-й кодовой странице (рис. 5.3). Этот набор символов был использован сначала в локализованной MS-DOS версии 4.01, а затем в локализованных версиях 5.0 и 6.0 этой операционной системы.

Рис. 5.3. Расширенный набор символов с кириллицей

В терминологии Windows приведенные выше наборы символов называются наборами символов OEM. OEM (Original Equipment Manufacturer) означает «производители оригинальной (в смысле подлинной) аппаратуры». Набор символов OEM соответствует естественному для данной аппаратуры набору. Он может меняться в зависимости от производителя, от страны, для которой выполнялась локализация операционной системы MS-DOS или изготавливалась аппаратура.

Операционная система Windows для представления символов использует набор символов ANSI (рис. 5.4).

Рис. 5.4. Набор символов ANSI

В этом наборе определены не все коды (для неопределенных кодов вместо символов на нашем рисунке изображены короткие вертикальные черточки) и отсутствуют символы псевдографики. Символы псевдографики не нужны, так как в графически ориентированной среде можно пользоваться «настоящей» графикой.

На рис. 5.5 изображен набор символов ANSI с добавлением кириллицы. Такой набор устанавливается в локализованной версии Windows или после локализации Windows с помощью специального программного продукта CyrWin, добавляющего в Windows возможность работы с русскими символами.

Рис. 5.5. Набор символов ANSI с символами кириллицы

Если программа MS-DOS запускается в окне Windows, для нее выбирается набор символов OEM. Поэтому в Windows используются как набор символов ANSI, так и набор символов OEM. Соответствующим выбором шрифта вы можете добиться отображения текста в окне Windows с использованием как набора ANSI, так и набора OEM. По умолчанию в контекст отображения выбирается системный шрифт, для которого используется набор ANSI.

Сравнивая приведенные выше таблицы, нетрудно заметить, что для одинаковых символов наборы OEM и ANSI используют разные коды, которые к тому же могут зависеть от используемого национального языка. Это приводит к необходимости перекодировки символов, например при переносе текстов, подготовленных в среде MS-DOS в среду Windows или при открытии файлов из среды Windows. В последнем случае перед использованием имя файла, подготовленное с использованием набора ANSI, требуется перекодировать в набор OEM.

Появляются дополнительные трудности с преобразованием строчных букв в прописные и обратно, так как правила преобразования и сортировки могут различаться для разных национальных языков.

К счастью, специальный набор функций программного интерфейса Windows берет на себя работу по преобразованию и перекодировке символов.

Для перекодировки строки символов, закрытой двоичным нулем, из набора ANSI в набор OEM предназначена функция AnsiToOem:

Первый параметр (hpszWindowsStr) представляет собой указатель типа _huge на преобразуемую строку, второй (hpszOemStr) — на буфер для записи результата преобразования.

Похожая по назначению функция AnsiToOemBuff выполняет преобразование буфера заданного размера:

Первый параметр этой функции (lpszWindowsStr) является дальним указателем на буфер, содержащий преобразуемые данные, второй (lpszOemStr) — на буфер для записи результата. Третий параметр (cbWindowsStr) определяет размер входного буфера, причем нулевой размер соответствует буферу длиной 64 Кбайт (65536 байт).

Обратное преобразование выполняется функциями OemToAnsi и OemToAnsiBuff:

Назначение параметров этих функций аналогично назначению параметров функций AnsiToOem и AnsiToOemBuff.

Для преобразований символов в строчные или прописные приложение Windows должно пользоваться функциями AnsiLower, AnsiLowerBuff, AnsiUpper, AnsiUpperBuff.

Функция AnsiLower преобразует закрытую двоичным нулем текстовую строку в строчные буквы:

Единственный параметр функции — дальний указатель на преобразуемую строку.

Функция AnsiUpper преобразует закрытую двоичным нулем текстовую строку в прописные буквы:

Параметр функции lpsz — дальний указатель на преобразуемую строку.

Вы можете использовать эти функции для преобразования одного символа, если запишете этот символ в младший байт слова, старший байт этого слова сбросите в ноль и затем укажете адрес слова в качестве параметра.

Функция AnsiLowerBuff позволяет преобразовать в строчные буквы заданное количество символов:

Первый параметр функции (lpszString) является указателем на буфер, содержащий преобразуемые символы, второй (cbString) определяет количество преобразуемых символов (размер буфера). Нулевой размер соответствует буферу длиной 64 Кбайт (65536 байт).

Функция возвращает количество преобразованных символов.

Функция AnsiUpperBuff позволяет преобразовать в прописные буквы заданное количество символов:

Первый параметр функции lpszString(lpszString) является указателем на буфер, содержащий преобразуемые символы, второй (cbString) определяет количество преобразуемых символов (размер буфера). Нулевой размер соответствует буферу длиной 64 Кбайт (65536 байт).

Эта функция, как и предыдущая, возвращает количество преобразованных символов.

Еще одна проблема связана с необходимостью позиционирования вдоль текстовой строки. Если используется однобайтовое представление символов, позиционирование сводится к увеличению или уменьшению значения указателя на один байт. Однако в некоторых национальных языках (например, в японском) набор символов OEM для представления каждого символа использует два байта. Для правильного позиционирования (с учетом различных наборов символов) необходимо использовать специальные функции AnsiNext и AnsiPrev, которые входят в состав программного интерфейса Windows.

Функция возвращает новое значение для указателя, передвинутое вперед по строке на одни символ:

Параметр функции указывает на текущий символ. Возвращаемое значение является указателем на следующий символ в строке или на закрывающий строку двоичный ноль.

Функция AnsiPrev выполняет передвижение указателя в направлении к началу строки:

Первый параметр функции указывает на начало строки (на первый символ строки). Второй параметр — указатель на текущий символ. Функция возвращает значение указателя, соответствующее предыдущему символу или первому символу в строке, если при продвижении достигнуто начало строки.

В составе программного интерфейса Windows имеются функции для преобразования символа ANSI в код виртуальной клавиши (VkKeyScan) или в соответствующий OEM скан-код и состояние (OemKeyScan).

Функция VkKeyScan используется для преобразования кода символа ANSI в код и состояние виртуальной клавиши:

Параметр функции определяет символ ANSI, который будет преобразован в код виртуальной клавиши.

Младший байт возвращаемого значения содержит код виртуальной клавиши, старший — состояние клавиш сдвига ( , , ):

Значение Описание
1 При выводе символа была нажата клавиша сдвига
2 Символ является управляющим
3 — 5 Данная комбинация клавиш сдвига не используется для представления символов
6 Символ образован при помощи комбинации клавиш
7 Символ образован при помощи комбинации клавиш

Эта функция обычно используется приложениями, которые передают символы другим приложениям с помощью сообщений WM_KEYDOWN и WM_KEYUP (то есть симулируют ввод с клавиатуры).

Функция OemKeyScan преобразует символ OEM в скан-код и состояние для набора OEM:

Параметр функции определяет символ OEM, который будет преобразован в скан-код.

Младшее слово возвращаемого значения содержит OEM скан-код для указанного символа.

Старшее слово указывает состояние клавиш сдвига для заданного символа. Если в этом слове установлен бит 1, нажата клавиша , если бит 2 — клавиша .

Если преобразуемое значение не принадлежит к набору OEM, возвращается значение -1 (и в старшем, и в младшем слове).

5.5. Приложение OEM2ANSI

В качестве примера приведем исходный текст приложения OEM2ANSI, выполняющего перекодировку файла из набора OEM в набор ANSI. На примере этого приложения вы узнаете о стандартных средствах Windows, позволяющих выполнять поиск файлов в каталогах и сохранение файлов под заданным именем и в заданном каталоге. Кроме этого вы узнаете о существовании в программном интерфейсе Windows специальных функций, предназначенных для работы с файлами.

Исходный текст основного файла приложения OEM2ANSI представлен в листинге 5.5.

Листинг 5.5. Файл oem2ansi\oem2ansi.cpp

Дополнительно к стандартному для всех приложений Windows файлу windows.h в главный файл приложения включен файл commdlg.h, который содержит определения для функций стандартных диалогов Windows версии 3.1. Загрузочные модули этих функций расположены в отдельной библиотеке динамической загрузки (DLL) с именем commdlg.dll.

Среди функций стандартных диалогов есть удобные функции, предназначенные для поиска и сохранения файлов, для выбора цвета и шрифта, для печати и работы с принтером и т. д. Позже мы рассмотрим применение этих функций, значительно облегчающих труд программиста. В приложении OEM2ANSI мы воспользуемся двумя такими функциями.

В функции WinMain определены переменные для хранения идентификаторов файлов (file handle), вовлеченных в процесс перекодировки:

Тип HFILE определен в файле windows.h следующим образом:

Работа функции WinMain начинается с вызова функции GetSrcFile, определенной в нашем приложении. Эта функция используется для поиска и открытия файла. Функция GetSrcFile возвращает идентификатор файла, подлежащего перекодировке, или ноль, если вы отказались от выбора файла. Полученный идентификатор можно использовать для выполнения операций файлового ввода/вывода.

Затем функция WinMain вызывает функцию GetDstFile, предназначенную для выбора имени и расположения в каталогах диска выходного (перекодированного) файла. Функция GetDstFile открывает имеющийся файл (если для записи результата перекодировки выбран уже существующий файл) или создает и открывает новый.

После того как входной и выходной файлы открыты, вызывается функция Oem2Ansi, которая также определена в нашем приложении. Эта функция выполняет поблочное чтение входного файла, перекодировку прочитанных блоков в набор ANSI и запись результата перекодировки в выходной файл.

В заключение функция WinMain закрывает оба файла, вызывая функцию _lclose из программного интерфейса Windows.

Функция GetSrcFile вызывает функцию GetOpenFileName, которая выводит на экран знакомую вам по стандартным приложениям Windows диалоговую панель «Open», позволяющую выбрать файл для перекодировки (рис. 5.6).

Рис. 5.6. Диалоговая панель «Open»

Внешний вид этой диалоговой панели определяется структурой типа OPENFILENAME, определенной в файле commdlg.h (этот файл находится в каталоге include системы разработки Borland C++ или Microsoft Visual C++):

Адрес структуры передается функции GetOpenFileName в качестве параметра lpfn:

Функция возвращает ненулевое значение, если вы сделали выбор файла, и ноль, если вы отказались от выбора, нажав кнопку «Cancel» или выбрав строку «Close» из системного меню диалоговой панели. Нулевое значение возвращается также при возникновении ошибки.

В результате выбора некоторые поля структуры будут заполнены информацией о выбранном файле.

Так как функциям, определенным в библиотеке commdlg.dll, будет посвящена отдельная глава, мы рассмотрим назначение только тех полей структуры OPENFILENAME, которые используются в нашем приложении OEM2ANSI.

Прежде всего перед вызовом функции GetOpenFileName наше приложение записывает во все поля структуры нулевые значения:

Затем в поле lStructSize записывается размер самой структуры в байтах:

Поле hwndOwner должно содержать идентификатор окна, создавшего диалоговую панель. Так как наше приложение не создает ни одного окна, в качестве идентификатора используется значение NULL, при этом диалоговая панель не имеет окна-владельца (похожим образом мы поступали при вызове функции MessageBox):

В поле lpstrFilter должен быть указан адрес текстовой строки, задающей фильтр для выбора имен файлов (шаблоны имен файлов):

Наше приложение использует в качестве фильтра такую строку:

Согласно описанию структуры OPENFILENAME фильтр должен состоять из одной или нескольких расположенных непосредственно друг за другом пар текстовых строк, закрытых двоичным нулем. Последняя строка должна иметь на конце два двоичных нуля.

Первая строка в паре строк описывает название фильтра, например «Text Files» (текстовые файлы), во второй строке пары через символ «;» перечисляются возможные шаблоны для имен файлов.

В нашем приложении определены две пары строк. Одна из них предназначена для выбора только текстовых файлов с расширениями имени *.txt и *.doc, вторая — для выбора любых файлов (с любым расширением имени).

Поле nFilterIndex определяет номер пары строк, используемой для фильтра. В нашем случае этот номер задается как 1, поэтому из двух фильтров выбирается первый, предназначенный для поиска текстовых файлов:

Поле lpstrFile должно содержать адрес текстовой строки, в которую будет записан полный путь к выбранному файлу:

Если по указанному выше адресу перед вызовом функции GetOpenFileName расположить текстовую строку, содержащую путь к файлу, этот путь будет выбран по умолчанию сразу после отображения диалоговой панели «Open». В нашем приложении эта возможность не используется, поэтому по адресу szFile мы расположили пустую строку, состоящую из одного нуля:

Поле nMaxFile должно содержать размер буфера, расположенного по адресу, указанному в поле lpstrFile:

Размер этого буфера должен быть достаточным для записи полного пути к файлу. Файловая система MS-DOS допускает использование для указания пути к файлу не более 128 символов.

В поле lpstrFileTitle необходимо записать адрес буфера, в который после выбора будет записано имя файла с расширением, но без пути к файлу:

Это поле должно быть использовано приложением для отображения имени выбранного файла.

Поле nMaxFileTitle должно содержать размер указанного выше буфера:

Поле lpstrInitialDir позволяет указать начальный каталог, который будет выбран для поиска файла сразу после отображения диалоговой панели «Open». Наше приложение начинает поиск в текущем каталоге, поэтому в это поле мы записали значение NULL:

Поле Flags позволяет задать различные режимы выбора файла, влияющие на внешний вид диалоговой панели. Наше приложение использует комбинацию из трех флагов:

Флаг OFN_PATHMUSTEXIST указывает, что можно выбирать только такие пути, которые соответствуют существующим каталогам. Аналогично флаг OFN_FILEMUSTEXIST определяет, что при выборе можно указывать только существующие файлы. Флаг OFN_HIDEREADONLY убирает из диалоговой панели переключатель, позволяющий открыть файл в режиме «только чтение» (мы не пользуемся этим режимом, так как не собираемся изменять открываемый файл).

После подготовки структуры мы вызываем функцию GetOpenFileName и проверяем возвращаемое ей значение:

Если возвращаемое функцией GetOpenFileName значение отлично от нуля, поле lpstrFile содержит путь к выбранному файлу. Этот путь приложение передает функции _lopen, открывающей файл на чтение. Затем функция GetSrcFile возвращает идентификатор открытого файла (точнее, результат, полученный при попытке открыть файл).

При ошибке или отказе от выбора файла функция GetSrcFile возвращает нулевое значение.

Для выбора файла, в который будет записан результат перекодировки, функция WinMain вызывает функцию GetDstFile. Эта функция вызывает функцию GetSaveFileName, которая выводит стандартную диалоговую панель «Save As. » (рис. 5.7).

Рис. 5.7. Диалоговая панель «Save As. «

Диалоговая панель «Save As. » используется многими стандартными приложениями Windows для выбора файла, в который будет записан результат работы приложения.

Функция GetSaveFileName описана в файле commdlg.h:

Она используется аналогично функции GetOpenFileName.

Вначале приложение подготавливает структуру OPENFILENAME:

При этом используется тот же фильтр, что и при поиске входного (перекодируемого) файла, но другое значение поля Flags.

Затем приложение вызывает функцию GetSaveFileName и проверяет возвращаемое ей значение:

Если выходной файл выбран правильно и не произошло никаких ошибок, приложение вызывает функцию _lcreat. Эта функция открывает на запись существующий файл или создает новый и затем также открывает его на запись.

Затем функция GetDstFile возвращает идентификатор открытого файла или ноль, если вы отказались от выбора файла или если произошла ошибка.

Для перекодирования файла функция WinMain вызывает функцию Oem2Ansi. Эта функция считывает в цикле содержимое входного файла в буфер, перекодирует буфер и затем записывает его в выходной файл:

Чтение файла выполняется функцией _lread, которая входит в состав программного интерфейса Windows. В качестве первого параметра этой функции передается идентификатор файла, в качестве второго — указатель на буфер, в который выполняется чтение, и в качестве третьего — размер буфера. Функция _lread возвращает количество прочитанных из файла байт данных.

Запись буфера в файл выполняется функцией _lwrite, которая также входит в состав программного интерфейса Windows. Параметры этой функции аналогичны параметрам функции _lread.

Подробнее функции для работы с файлами мы рассмотрим позже в отдельной главе.

Для перекодировки буфера используется знакомая вам функция OemToAnsiBuff. И первый, и второй параметры этой функции указывают на один и тот же буфер, поэтому перекодировка будет выполняться «по месту».

Вы можете добавить до или после функции OemToAnsiBuff свою собственную функцию перекодировки, выполняющую какие-либо дополнительные перекодирующие действия.

На рис. 5.8 представлен результат перекодировки приложением OEM2ANSI текстового файла, подготовленного в MS-DOS и содержащего символы кириллицы.

Рис. 5.8. Исходный и преобразованный файлы

В верхней части рис. 5.8 изображено окно редактирования системы разработки Borland C++ for Windows, в которое загружен текст в кодировке OEM. Этот текст содержит символы кириллицы, которые в кодировке ANSI отображаются в виде различных «нечитаемых» символов. В нижней части рис. 5.8 расположено окно, в которое загружен перекодированный текст.

Если при использовании нашего приложения OEM2ANSI вы получили результаты, отличные от представленного на рис. 5.8, вам следует убедиться в том, что на вашем компьютере была выполнена локализация операционной системы Windows и что она была выполнена правильно. Для локализации Windows можно использовать такие программные средства, как CyrWin или ParaWin. Вы можете также приобрести локализованную версию Windows 3.1, которая поставляется в России фирмой Microsoft A.O.

На базе приложения OEM2ANSI вы без труда сможете создать приложение с названием, например, ANSI2OEM, выполняющее обратную перекодировку. Мы предлагаем вам создать такое приложение самостоятельно.

Файл определения модуля для приложения OEM2ANSI представлен в листинге 5.6.

Листинг 5.6. Файл oem2ansi\oem2ansi.def

5.6. Текстовый курсор

При вводе текста в среде MS-DOS используется текстовый курсор, указывающий позицию ввода очередного символа. Текстовый курсор в MS-DOS формируется автоматически функциями BIOS или создается программой. В последнем случае программа должна сама следить за перемещением текстового курсора.

Если ваше приложение создает свой собственный текстовый редактор (не пользуясь стандартным, который доступен всем приложениям Windows), вы должны сами создать текстовый курсор и заботиться о его внешнем виде, отображении и перемещении.

Заметим, что в операционной системе Windows используются два курсора. Один курсор называется cursor и означает курсор мыши. Второй курсор называется caret (знак вставки) и означает текстовый курсор.

Текстовый курсор является системным ресурсом Windows. Можно создать только один текстовый курсор. И это правильно, так как в противном случае вы, увидев на экране два или больше приглашений для ввода текста, не будете знать, где же будут отображаться вводимые вами при помощи клавиатуры символы.

Как правило, курсор создается окном в момент получения фокуса ввода. Напомним, что при получении фокуса ввода функции окна передается сообщение WM_SETFOCUS. Обработчик этого сообщения может при необходимости создать текстовый курсор.

Когда окно теряет фокус ввода, оно должно уничтожить текстовый курсор. При потере фокуса ввода функции окна передается сообщение WM_KILLFOCUS, обработчик которого и должен удалить текстовый курсор, созданный при обработке сообщения WM_SETFOCUS.

Для создания текстового курсора обработчик сообщения WM_SETFOCUS должен вызвать функцию CreateCaret, входящую в программный интерфейс Windows:

Первый параметр функции (hwnd) — идентификатор окна, создающего текстовый курсор.

Второй параметр (hbmp) может принимать значения NULL, 1 или он может быть идентификатором битового изображения курсора (bitmap). Если этот параметр равен NULL, текстовый курсор представляет собой вертикальную черту черного цвета. Если этот параметр равен 1, текстовый курсор изображается серым цветом. Вы также можете нарисовать курсор любой произвольной формы в виде битового образа (bitmap) и использовать этот свой курсор, загрузив его из ресурсов приложения и указав идентификатор. В этом случае третий и четвертый параметры функции игнорируются. О ресурсах и битовых образах вы узнаете позже, так как это тема для отдельного разговора.

Третий параметр (nWidth) определяет ширину курсора в логических единицах. Если задать для ширины значение NULL, курсор будет иметь ширину, равную ширине рамки, создаваемой вокруг окна. Это значение возвращается функцией GetSystemMetrics, когда ей в качестве параметра указывается константа SM_CXBORDER.

Последний, четвертый параметр (nHeight) функции CreateCaret определяет высоту текстового курсора в логических единицах. Для этого параметра также можно указать значение NULL, при этом высота текстового курсора будет равна высоте рамки окна. Это значение возвращается функцией GetSystemMetrics, когда ей в качестве параметра указывается константа SM_CYBORDER.

Если для ширины и высоты текстового курсора заданы значения NULL, курсор будет видно при использовании видеорежимов высокого разрешения. Если же вы укажете ширину текстового курсора, равную одному пикселю, в режимах с высоким разрешением курсор окажется слишком тонким для того, чтобы его можно было заметить.

При использовании для изображения курсора битового образа (bitmap) форма и размеры курсора полностью определяются самим битовым образом, поэтому третий и четвертый параметры функции могут принимать любые значения.

Когда функция окна получает сообщение WM_KILLFOCUS, она должна уничтожить текстовый курсор, вызвав функцию DestroyCaret:

Эта функция не имеет параметров. После ее вызова текстовый курсор пропадает из окна и может быть использован в другом окне, которое получит фокус ввода.

Сразу после создания функцией CreateCaret текстовый курсор находится в невидимом, выключенном состоянии. Для того чтобы сделать текстовый курсор видимым, следует вызвать функцию ShowCaret:

В качестве параметра этой функции передается идентификатор окна hwnd, создавшего текстовый курсор.

Перед тем как перерисовывать окно, приложение должно выключить (скрыть) текстовый курсор. Так как курсор постоянно мигает, если его не выключить во время перерисовки окна, изображение курсора может «размножаться» на экране. Функция BeginPaint самостоятельно скрывает курсор, но, если вы перерисовываете окно во время обработки других сообщений, курсор необходимо выключить (но не уничтожить!), вызвав функцию HideCaret:

В качестве параметра этой функции передается идентификатор окна hwnd, создавшего текстовый курсор.

Функции ShowCaret и HideCaret обладают свойством накопления. Если вы несколько раз подряд вызвали функцию HideCaret, для того чтобы текстовый курсор вновь стал видимым, вам придется столько же раз вызвать функцию ShowCaret. Аналогично, если вы несколько раз вызвали функцию ShowCaret, для того чтобы скрыть текстовый курсор, вам придется столько же раз вызвать функцию HideCaret.

Но прежде чем включать курсор, вам необходимо установить его в нужное место окна (вы сами должны заботиться о правильном расположении текстового курсора). Для этого следует вызвать функцию SetCaretPos:

Первый параметр этой функции определяет горизонтальную X-координату курсора, второй — вертикальную Y-координату курсора.

Для получения текущих координат текстового курсора следует воспользоваться функцией GetCaretPos:

Единственный параметр этой функции lppt указывает на структуру типа POINT, в которую будет записана информация о расположении курсора. Тип POINT описан в файле windows.h:

После возврата из функции GetCaretPos поля x и y структуры будут содержать соответственно X- и Y-координаты текстового курсора.

С помощью функций GetCaretBlinkTime и SetCaretBlinkTime приложение может соответственно узнать и изменить период мигания текстового курсора.

Функция GetCaretBlinkTime возвращает период мигания текстового курсора в миллисекундах:

С помощью функции SetCaretBlinkTime вы можете установить новое значение периода мигания курсора, указав его в качестве параметра функции (также в миллисекундах):

Управлять текстовым курсором непросто, особенно если учесть, что при редактировании текста могут быть использованы разные шрифты с переменной шириной букв (и даже с наклонными буквами). Но у вас едва ли появится необходимость создания собственного текстового редактора, аналогичного Microsoft Word for Windows (если, конечно, ваша основная работа не связана именно с созданием таких текстовых редакторов!).

Для редактирования и ввода отдельных символьных строк или многострочного текста без использования шрифтового оформления проще всего воспользоваться зарегистрированным операционной системой Windows классом окна edit.

Этот класс окна специально предназначен для создания текстовых редакторов, обладающих достаточно широкими возможностями (например, в этом классе окна есть поддержка универсального буфера обмена Clipboard, вертикальная и горизонтальная полосы просмотра и т. д.). В свое время мы будем подробно изучать этот «встроенный» в операционную систему редактор текста.

5.7. Приложение KBMSG

Наше следующее приложение с названием KBMSG поможет вам «почувствовать» клавиатурные сообщения. Это приложение создает одно главное окно, функция которого обрабатывает все сообщения от клавиатуры. Для каждого сообщения в окно выводится символическое имя кода сообщения, параметры сообщения wParam и lParam, а также название виртуальной клавиши, определенное в драйвере клавиатуры.

В верхней части главного окна приложения расположены две строки заголовка отдельных полей параметров сообщения. В остальной части окна организован построчный вывод самих параметров сообщения со сверткой (рис. 5.9).

Рис. 5.9. Главное окно приложения KBMSG

В первом столбце выводится символическое имя полученного от клавиатуры сообщения, во втором — символ ANSI, соответствующий параметру wParam полученного сообщения, затем следуют значения wParam и lParam в шестнадцатеричном представлении, и в последнем столбце выводится имя виртуальной клавиши, полученное по коду клавиши от драйвера клавиатуры.

Помимо способов обработки сообщений клавиатуры приложение KBMSG демонстрирует использование свертки экрана и загрузку в контекст отображения системного шрифта с фиксированной шириной букв.

Функция WinMain приложения KBMSG определена в файле kbmsg.cpp (листинг 5.7).

Листинг 5.7. Файл kbmsg\kbmsg.cpp

Обратите внимание на цикл обработки сообщений, созданный в функции WinMain:

Перед обычной функцией DispatchMessage вызывается функция TranslateMessage, которая на основе сообщений WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, WM_SYSKEYUP создает сообщения WM_CHAR, WM_SYSCHAR, WM_DEADCHAR и WM_SYSDEADCHAR.

При регистрации класса окна указывается стиль класса, который требует перерисовки окна при изменении его вертикального или горизонтального размера:

Других особенностей (по сравнению с нашими предыдущими приложениями) функция WinMain не имеет.

Функция окна, обрабатывающая все сообщения, поступающие в главное окно приложения KBMSG, приведена в листинге 5.8.

Листинг 5.8. Файл kbmsg\wndproc.cpp

При создании главного окна приложения (функцией CreateWindow) функция окна получает сообщение WM_CREATE. Наш обработчик этого сообщения создает контекст отображения и выбирает в него системный шрифт с фиксированной шириной букв, для чего вызывает функции GetStockObject и SelectObject:

Эти функции будут описаны позже. Сейчас мы только отметим, что после выполнения приведенной выше строки системный шрифт с переменной шириной букв будет заменен на системный шрифт с фиксированной шириной букв. С таким шрифтом проще работать, так как можно использовать известные вам по MS-DOS методы вывода таблиц.

После выбора шрифта обработчик сообщения WM_CREATE определяет метрики шрифта. В переменные cxChar и cyChar записывается соответственно ширина и высота букв.

Далее контекст отображения освобождается.

В поле top переменной rect типа RECT записывается координата верхней границы сворачиваемой области главного окна приложения:

Выше этой границы, в полосе, ширина которой равна высоте символа, умноженной на 3, будет расположен заголовок таблицы. Этот заголовок состоит из строки названий полей таблицы и строки подчеркивания.

Область окна, расположенная ниже, будет использована для отображения параметров сообщений. По мере того как вы будете нажимать на клавиши, в этом окне будут появляться строки параметров сообщений. При появлении каждой новой строки вся область окна до границы заголовка будет смещена вверх. Новая строка будет добавлена в нижней части главного окна приложения. Словом, нижняя часть окна будет действовать как хорошо знакомая вам консоль MS-DOS.

При отображении окна функцией ShowWindow функция окна получает среди прочих сообщение WM_SIZE. Обработчик этого сообщения определяет координаты правого нижнего угла окна, сохраняя их в переменной rect:

Поле bottom, содержащее y-координату нижней границы окна, будет использовано для вывода параметров сообщения в нижней части окна функцией TextOut.

После определения координат обработчик сообщения WM_SIZE объявляет все окно как требующее перерисовки и генерирует сообщение WM_PAINT, вызывая функцию UpdateWindow:

Это приводит к тому, что при изменении размеров окна содержимое окна стирается и в него выводятся только две строки заголовка.

Обработчик сообщения WM_PAINT выбирает в контекст отображения системный шрифт с фиксированной шириной букв и выводит две строки заголовка. Этим его функции и ограничиваются.

Далее в исходном тексте функции окна расположены несколько обработчиков для клавиатурных сообщений. Все они вызывают функцию PrintMsg, отображающую параметры сообщения, вслед за чем передают сообщение функции DefWindowProc:

Таким образом, сообщения от клавиатуры не изымаются приложением, оно только «подсматривает» за ними.

Отображение параметров сообщения выполняется функцией PrintMsg, определенной в нашем приложении.

Кроме идентификатора окна, нужного для свертки окна и получения контекста отображения, функции PrintMsg передаются параметры сообщения и текстовая строка символического имени сообщения.

Функция PrintMsg начинает свою работу со свертки окна для освобождения в его нижней части места для вывода параметров очередного сообщения:

Для свертки окна используется функция ScrollWindow, входящая в состав программного интерфейса Windows:

Первый параметр (hwnd) этой функции определяет идентификатор сворачиваемого окна.

Второй (dx) и третий (dy) парамеры определяют величину сдвига при свертке соответственно по горизонтали и вертикали. Для свертки влево и вверх параметры должны иметь отрицательное значение, для свертки вправо и вниз — положительное. В нашем случае окно сворачивается только в верхнем направлении, поэтому второй параметр равен нулю, а третий задает сдвиг на высоту буквы.

Четвертый параметр (lprcScroll) определяет прямоугольный участок внутренней области окна, подлежащей свертке. В нашем случае это нижняя часть окна (верхняя часть используется для вывода двух строк заголовка).

Пятый параметр (lprcClip) задает ограничивающую область, внутри которой выполняется сдвиг. В нашем случае эта область совпадает с заданной четвертым параметром.

В качестве четвертого и пятого параметра можно задать значение NULL, в этом случае будет свернута вся внутренняя область окна.

Далее функция PrintMsg выбирает системный шрифт с фиксированной шириной букв и получает имя клавиши, соответствующее параметру lParam. Для получения имени клавиши, определенном в драйвере клавиатуры, вызывается уже знакомая вам функция GetKeyNameText:

В нашем приложении эта функция копирует 20 символов имени клавиши в буфер szKeyName. В случае ошибки выдается звуковой сигнал, для чего вызывается функция MessageBeep.

Вслед за этим в буфере szBuf подготавливается строка, которая будет выведена в нижней части экрана. В эту строку включается символическое имя полученного сообщения, код ANSI, соответствующий параметру wParam, параметры wParam и lParam в шестнадцатеричном представлении, а также имя клавиши, определенное в драйвере клавиатуры.

Для вывода строки вызывается функция TextOut:

Строка выводится начиная с позиции (cxChar, rect.bottom — cyChar), то есть в нижней части главного окна приложения.

Перед завершением работы функция PrintMsg вызывает функцию ValidateRect:

Эта функция описана в файле windows.h:

Для окна, идентификатор которого задан первым параметром, функция удаляет область, заданную вторым параметром, из области, требующей обновления.

Для чего здесь вызывается эта функция?

Дело в том, что после вызова функции ScrollWindow область свертки помечается как требующая обновления, поэтому функция окна получит сообщение WM_PAINT и только что выведенная строка будет стерта.

В нашем случае вывод в окно выполняется не во время обработки сообщения WM_PAINT, поэтому для предотвращения стирания мы должны объявить окно не требующим перерисовки. Если в качестве второго параметра функции ValidateRect указать значение NULL, вся внутренняя область окна будет помечена как не требующая перерисовки и сообщение WM_PAINT будет удалено из очереди приложения.

Файл определения модуля для приложения KBMSG приведен в листинге 5.9.

Листинг 5.9. Файл kbmsg\kbmsg.def

Программный интерфейс Windows версии 3.1 содержит еще одну функцию, предназначенную для свертки окна, — функцию ScrollWindowEx:

Эта функция аналогична функции ScrollWindow, но имеет три дополнительных параметра — hrgnUpdate, lprcUpdate, и fuScroll.

Параметр hrgnUpdate определяет область, которая будет обновлена в результате свертки. Этот параметр можно указывать как NULL.

Параметр lprcUpdate является указателем на структуру типа RECT, в которую после вызова функции ScrollWindowEx будут записаны координаты границ области, обновленной в результате свертки. Этот параметр также можно указывать как NULL.

Параметр fuScroll определяет флаги, которые используются для управления режимом свертки:

Символическое имя Описание
SW_SCROLLCHILDREN Выполнить свертку всех дочерних окон, пересекающих прямоугольную область, заданную параметром lprcScroll. Все эти дочерние окна получат сообщение WM_MOVE
SW_INVALIDATE После выполнения свертки область, указанная параметром hrgnUpdate, отмечается как требующая обновления
SW_ERASE Если указан флаг SW_INVALIDATE, обновленная область стирается посылкой сообщения WM_ERASEBKGND

Если не указаны флаги SW_INVALIDATE или SW_ERASE, функция ScrollWindowEx не объявляет требующей обновления область, из которой было выдвинуто изображение в результате выполнения свертки.

Что такое код безопасности и почему я вижу, что он изменился?

Что такое код безопасности?

У каждого разговора Signal есть уникальный код безопасности, который позволяет проверить защищенность сообщений и звонков с определенными контактами.

Проверка кода безопасности — это надежный способ защиты конфиденциальных коммуникаций. Если код безопасности помечен как проверенный, его изменение необходимо одобрить вручную перед отправкой нового сообщения.

Почему я вижу предупреждение об изменении кода безопасности?

Signal уведомляет вас об изменении кода безопасности. Это позволяет вам проверять конфиденциальность своих коммуникаций с контактом и защититься от атак «человек посредине».

Обычно уведомление о коде безопасности отображается, когда контакт переходит на новый телефон или повторно устанавливает Signal. Но если код безопасности меняется часто или неожиданно, это может быть подозрительно.

Как мне увидеть код безопасности?

  1. Откройте разговор с контактом.
  2. Нажмите на заголовок разговора или перейдите в настройки разговора.
  3. Выберите «Посмотреть код безопасности».

Как мне проверить код безопасности с моим контактом?

Самый простой способ сравнить коды безопасности — отсканировать QR-код вашего контакта на экране просмотра кода безопасности. Вы также можете просмотреть или прослушать цифровой код или скопировать его в буфер, нажав на значок «Поделиться». Если код безопасности совпадает, вы можете быть уверены, что общаетесь с тем человеком.

Как управлять статусом проверки кода безопасности?

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

  • В Android нажмите на переключатель «Проверено». Когда контакт будет проверен, переключатель сдвинется вправо и станет синим.
  • В iOS нажмите на кнопку «Отметить как проверенный» или выберите «Сбросить проверку».
  • На компьютере нажмите «Отметить как проверенный» или «Отметить как непроверенный».

Как узнать, что код безопасности отмечен как проверенный?

Если код безопасности проверен, в заголовке разговора появится галочка рядом с именем контакта. Код будет считаться проверенным, пока не изменится или вы не измените статус проверки вручную.

Код УИП в платёжке

В соответствии с Положением 383-П, определяющим правила перевода денежных средств, банки производят платежи на основании распоряжений клиентов. Это могут быть платежные поручения и требования, инкассовые поручения, уведомления и т. д. Но основным средством безналичных расчетов с бюджетом и между контрагентами выступает платежное поручение. Содержание и форма этого документа должны соответствовать нормам законодательства и правилам банковского документооборота. Унифицированный бланк платежного поручения и его реквизиты утверждены тем же Положением 383-П Банка России. В частности, им установлено, что в поле 22 «Код» распоряжения на перечисление денежных средств необходимо указывать УИП. Что это такое в платежном поручении и для чего нужен этот реквизит, рассмотрим подробнее.

Понятие: что такое УИП в платёжке

УИП – это уникальный идентификатор платежа, который состоит из 20 или 25 цифр. Его используют для быстрого и правильного зачисления на счет поступившего платежа. Цифры этого кода говорят об администраторе платежа, типе платежа и документе, который обязывает его произвести. Следовательно, каждому платежу присваивают индивидуальный идентификатор. Но не всегда.

К сожалению, где взять с 2020 года УИП в платежном поручении действующее законодательство чётко не разъясняет. Хотя в определенных случаях проставление этого кода в платежном документе формально обязательно. Поэтому необходимо иметь представление о том, как узнать УИП. При этом законодательством не установлена обязанность плательщика самостоятельно выяснять значение УИП.

Данный код платежу присваивает получатель средств и затем сообщает его плательщику на основании договора. Банк, в котором у обязанного лица открыт счет, при его обслуживании проверяет наличие и правильность значения УИП в платежке. В некоторых ситуациях при неверном заполнении этого реквизита платеж может быть отклонен банком.

Когда нужно указывать уникальный идентификатор платежа

Случаи, когда проставление кода УИП в платежном поручении является обязательным, перечислены в упомянутом Положении о правилах денежных переводов № 383-П Банка России. В соответствии с этим документом, УИП вносят в платежку, если он уже присвоен получателем средств. А само присвоение платежу УИП возможно в 2-х случаях:

  1. Идентификатор присвоен платежу получателем средств, и он обязан сообщить эту информацию плательщику в соответствии с договором. В этом случае банк получателя на основании договора банковского обслуживания может контролировать правильность отражения УИП в распоряжении на перевод средств (например, при оплате госуслуг плательщику, в том числе и физлицу, для перечисления средств сообщают УИП).
  2. Когда обязанное лицо оплачивает взносы во внебюджетные фонды и налоги на основании выставленного требования об уплате. Код УИП отражен в требовании и обязателен к внесению в платежку.

Для таких групп налогоплательщиков, как индивидуальные предприниматели, адвокаты, нотариусы, руководители фермерских хозяйств и т. п. есть некоторые особенности при заполнении реквизита 22 платёжек. При переводе денежных сумм в бюджет в платежном поручении они указывают:

  • либо свой ИНН в поле «ИНН плательщика»;
  • либо УИП в поле «Код».

Если в документе проставлен ИНН, то в реквизите «Код» ставят ноль. Банки не вправе требовать в таких случаях одновременного заполнения обоих реквизитов, как это происходит в некоторых случаях. Разъяснения по данному вопросу приведены в письме ФНС № ЗН-4-1/6133 от 08 апреля 2020 года.

Что делать, если УИП указан неверно

Когда УИП в платежке проставлен неправильно, банк всё равно обязан выполнить платежное поручение клиента. Исключение составляют следующие случаи:

  • когда счета получателя средств и плательщика открыты в одном и том же банке;
  • когда счет, на который перечисляются денежные суммы, открыт с целью идентификации платежа.

В этих ситуациях банк обязанного лица после проверки всех реквизитов аннулирует платежку при отсутствии в ней УИП.

Если платежное поручение исполнено, а код указан неверно, может возникнуть проблема с идентификацией платежа. И тогда обязанность по оплате задолженности по налогу, взносам, а также пеням и/или штрафам будет считаться невыполненной. Плательщику может потребоваться время для идентификации и уточнения платежа. А это приведет к дополнительному начислению пеней.

Структура байт-кода виртуальной машины Java

В последнее время на Хабре появились статьи которые затрагивают манипуляцию байт-кода. Что заставило меня опубликовать следую статью посвященную его структуре.

У платформы java имеется две особенности. Для обеспечения кроссплатформенности программа сначала компилируется в промежуточный язык низкого уровня — байт-код. Вторая особенность загрузка исполняемых классов происходит с помощью расширяемых classloader. Это механизм обеспечивает большую гибкость и позволяет модифицировать исполняемый код при загрузке, создавать и подгружать новые классы во время выполнения программы.

Такая техника широко применяется для реализации AOP, создания тестовых фреймворков, ORM. Особенно хочется отметить terracotta, продукт с красивой идеей кластеризации jvm и на всю катушку использующей модификации байт-кода. Эта заметка будет посвящена обзору структуры байт-кода, первой части этой сильной связки.

Каждому классу в java соответствует один откомпилированный файл. Это справедливо даже для подклассов или анонимным классов. Такой файл содержит информацию об имени класса, его родителе, список интерфейсов которые он реализует, перечисление его полей и методов. Важно отметить, что после компиляции информации, которая содержит директива import, теряется и все классы именуются теперь через полный путь. Например в место String будет записано java/lang/String.

Самое интересное как будут выглядеть методы класса в байт-коде. Будем наблюдать во что трансформируется следующий класс:

Начнем с заголовка. В нем содержится информация о название метода, то, что метод вызывается без параметров, и тип возвращаемого аргумента.

Байт-код стеко-ориентированный язык, похожий по своей структуре на ассемблер. Что бы произвести операции с данными их сначала нужно положить на стек. Мы хотим взять поле у объекта. Что бы это сделять нужно его положить в стек. В байт-коде нет имен переменных, у них есть номера. Нулевой номер у ссылки на текущий объект или у переменой this. Потом идут параметры исполняемого метода. Затем остальные переменные.

Команда ALOAD 0 кладет переменную this на стек. Что бы на стек положить тип данных, отличный от ссылки, нужно воспользоваться другой командой. Для long будет LLOAD, а для doubles[] будет DALOAD.

Следующая команда GETFIELD, убирает со стека ссылку на объект и кладет примитивный тип или ссылку на поле данного объекта. У нее есть два параметра. Первый имя — класса, второй имя — переменной. Если же переменная статическая, то предварительно класть на стек ничего не нужно, а команду нужно заменить на GETSTATIC с теми же параметрами.

Последняя команда говорит, что метод завершен и возвращает значения типа ссылки со стека.

Сеттер имеет немного более сложную структуру.

Данный метод ничего не возвращает. Первые две команды кладут на стек переменную this и параметр исполняемого метода. Затем вызывается команда PUTFIELD (PUTSTATIC для статического поля) которая установит значение поля объекта и уберет со стека последние два значения. Последняя команда — выход из метода.

Добавим к нашему объект еще пару методов и посмотрим, какой байт-код им соответствует.

testMethod имеет следующее представление.

Первая команда вызывает статический метод у класса System. Вторая запоминает результат вызова метода currentTimeMillis в переменной со вторым номером. Затем мы кладем переменную this, параметр метода и переменную с номером 2 на стек. Преобразую переменную к типу java/lang/Long. И проверяем, что она у нас содержится в коллекции, вызывая метод у параметра исполняемого. У нас параметр интерфейс, поэтому применяется команда INVOKEINTERFACE. Для метода класса необходимо использовать INVOKEVIRTUAL. Чтобы вызвать метод у объект или интерфейса необходимо, чтобы на стеке лежал объект, затем параметры вызываемого метода. В результате вызова метода они заменятся на результат или просто уберутся со стека, если метод ничего возвращает. Последняя три команды кладут перемену на стек, превращают ее в объект и возвращают ее как значение метода.

Чтобы завершить наш экскурс в байт-код, добавим последний метод и посмотрим на циклы и условные операторы.

Он в байт-коде будет выглядить так

Первые две команды инициализирую переменную i (с номером 1) значением -17.

Дальше у нас начинается тело цикла. Для реализации которого потребуются метки,
команда перехода и условный оператор. В теле нашего метода аж целых три меток. Первая метка означает начало цикла. Вторая нужна для условного оператора, а последняя знаменует конец цикла. Уловный оператор имеет один параметр метку перехода. Прежде чем его вызвать сравниваемы значения должны лежать на стеке. Для сравнения с нулем используется отдельная команда. Для каждого типа есть свой оператор сравнения. Для int он IF_ICMPGE. После сравнения сравниваемые значения убираются со стека. Для арифметических действий с двумя переменным их так же как и для условного оператора нужно предварительно положить на стек. После выполнения они снимаются со стека, а на их место кладется результат.

На это краткий экскурс в байт-код закончен, некоторые вопросы такие как исключения, синхронизация не были затронуты. Я надеюсь, что имея представление о байт коде читатель без труда справиться с ними. В следующей части мы рассмотрим инструменты которые применяются для модификации байт-кода.

IBAN код в банковских реквизитах

Если вы хотите получить денежный перевод на свой персональный банковский счет из стран Европейской Экономической зоны, то вам необходимо знать, что такое IBAN банка. Это обязательный реквизит, без которого отправить перевод будет невозможно. Рассмотрим, что это такое, как выглядит этот загадочный код, а главное – где его взять.

Что это такое

Полная расшифровка аббревиатуры IBAN – это «International Bank Account Number». Дословно название можно перевести как «номер международного банковского счета». Он присваивается каждому клиенту банка или любого другого финансового учреждения согласно международным стандартам ISO 13616. Стандарт данного счета был разработан Международной Организацией по Стандартизации. Также в этом процессе принимал участие Европейский комитет, ответственный за банковские стандарты.

Код начали использовать для того, чтобы упростить и ускорить систему денежных переводов между различными странами. Деньги сразу «заходят» на счет клиентов, и человеку не нужно специально обращаться в банк для того, чтобы получить свой перевод.

Обратите внимание на то, что он используется преимущественно в странах Европейского Союза. На их территории данный реквизит является обязательным. Страны, которые не являются членами Европейского Союза, не обязаны использовать IBAN для международных денежных переводов.

Как выглядит

Международный номер счета, а точнее IBAN, не может состоять больше, чем из 34 символов. Каждый знак в нем имеет свое значение. Он может содержать не только цифры, но и буквы. Буквы используются только из латинского алфавита и в обязательном порядке заглавные.

Расшифровывается следующим образом:

  • 1 – 2 символ – это код страны, в которой находится человек, что должен получить денежный перевод (например, DE – Германия);
  • 3 – 4 символ – уникальное число IBAN, которое рассчитывается по специальному стандарту ISO 7064;
  • 5 – 8 символ – это BIC код банка, а точнее первые его 4 цифры;
  • 9 – 34 символ – это номер счета клиента банка.

Итак, IBAN для жителей Германии будет состоять всего из 22 символов, и выглядеть приблизительно так: DE89670400665732020090.

Как узнать

В нашей стране узнать этот код достаточно проблематично. Все дело в том, что банковская система не требует обязательного использования данного реквизита. Для совершения международных переводов вам, скорее всего, предложат SWIFT код. Именно поэтому, в банковских реквизитах стандартного образца вы не найдете код IBAN. Соответственно назревает вопрос, где взять его и куда первым делом нужно обращаться для его получения.

Обратите внимание на то, что IBAN – это требования Европейского Союза для совершения денежных переводов. Другие страны, в том числе и наша, не обязаны использовать данный код.

Российские банки не используют в своей работе данный код, поэтому, узнать его у вас не получится. Для того чтобы деньги «зашли» на ваш персональный счет, достаточно просто указать стандартные банковские реквизиты:

  • персональный номер счета (указывается в договоре на обслуживание);
  • SWIFT code банка, в котором открыт счет;
  • ваши данные (ФИО).

IBAN Сбербанка России

Большинство жителей нашей страны пользуются услугами Сбербанка России. Если вы собираетесь получить международный денежный перевод на счет, открытый в данном банке, то нужно будет узнать основные реквизиты финансового учреждения и продиктовать их отправителю. Сделать это можно несколькими способами:

  • через официальную веб-страницу банка в Интернете;
  • через сотрудников любого отделения Сбербанка;
  • через интернет банкинг, а точнее через свой личный кабинет;
  • через горячую линию учреждения.

Отправитель может также самостоятельно зайти на официальный сайт Сбербанка и узнать все необходимые ему реквизиты.

Если отправителю недостаточно предоставленных вами реквизитов, и он настоятельно требует предоставить именно этот код, то выход из ситуации только один. Вы должны объяснить ему, что IBAN Сбербанка не существует. Законодательство Российской Федерации не требует от банков создания подобных кодов, поэтому их попросту нет.

Альтернативой может послужить международный SWIFT код. С его помощью отправитель без проблем сможет перечислить вам деньги с любой точки мира и для этого не обязательно использовать код международного образца.

Теперь вы знаете, что при совершении международного денежного перевода на территорию нашей страны использовать IBAN невозможно. Российские банки не используют в своей работе данный стандарт стран Европейского Союза.

Что такое код ansiupperbuff

Код-шеринг — авиационный термин, означающий соглашение между двумя авиакомпаниями, по которому рейс одной авиакомпании представляется на рынке совместно как рейс одной или нескольких других авиакомпаний. Код указывается в расписании полетов и обычно состоит из двузначного кода авиакомпании-члена IATA и номера рейса.[1]

Kупив билет «AIRFRANCE» на рейс Париж—Рига, пассажир может обнаружить себя на борту самолета авиакомпании „airBaltic”. Подобные перевозки выполняются авиакомпаниями в рамках договоров код-шеринга (совместной эксплуатации воздушных линий). В этом случае рейс выполняется одним из перевозчиков, который называется оперирующим партнером, а другая авиакомпания (или даже несколько) выступает на этом рейсе в роли маркетингового партнера. Рейс выполняется под кодами обеих авиакомпаний, в чем можно убедиться, посмотрев на табло аэропорта. В первом из наших примеров двойной код, составленный из двухбуквенных кодов IATA. Билеты на код-шеринговый рейс продают обе авиакомпании-партнера через собственные сети.
Код-шеринговые соглашения дают авиакомпаниям ряд преимуществ, которые, в свою очередь, реализуются в виде преимуществ для пассажиров. Впрочем, иногда эти преимущества могут превратиться и в недостатки, но об этом позже.

Код-шеринг — это скорее коммерческий механизм, позволяющий авиакомпаниям расширить свою маршрутную сеть за счет виртуальных сегментов, на которых авиакомпания сама не летает, но пассажиров перевезти может. То есть если пассажир хочет лететь из пункта A в пункт B, авиакомпания должна ему такую услугу предоставить. При этом у авиакомпании нет необходимости всюду выполнять рейсы самостоятельно — это повлекло бы большие издержки, поскольку собственный прямой пассажиропоток на этом маршруте у перевозчика, скорее всего, невелик. А чересчур дорогую услугу продать не получится. Поэтому лучше доставить пассажира в пункт C, где пересадить его на рейс код-шерингового партнера. Для пассажира это будет выглядеть как обычный рейс с пересадкой, поскольку летит он по одному билету. Благодаря код-шеринговому соглашению ответственность за пассажира берут на себя обе авиакомпании. Ведь, в принципе, он мог бы самостоятельно приобрести два билета на разные авиакомпании из пункта A в пункт C и затем из пункта C в пункт B, но тогда вторая авиакомпания не имела бы об этом пассажире никакой информации и, если бы рейс из пункта A задержался, сочла бы его просто не явившимся на свой рейс. Так что для пассажира наличие код-шерингового соглашения означает удобство и надежность перевозки.

Но при этом надо понимать, что если бы не код-шеринговое соглашение между двумя авиакомпаниями, обе они этого пассажира не получили бы. Ведь первая из них не летает в пункт B, куда, собственно, направлялся наш пассажир, а в пункте C, откуда летает вторая авиакомпания, он бы тоже не появился, найдя альтернативный маршрут. Это соображение лежит в основе коммерческого сотрудничества авиакомпаний — ведь обе они получают клиента, который в противном случае ушел бы к конкурентам. Для большей привлекательности имеет смысл и немного снизить тариф для подобного перелета, поэтому авиакомпании заключают специальные соглашения SPA (Special Prorate Agreement), так что билет по маршруту A—C—B окажется дешевле (может, даже в два раза), чем сумма стоимости билетов по сегментам A—С и B—C (справедливости ради надо отметить, что та же самая логика объясняет, почему даже при полете одной авиакомпанией рейс с пересадкой чаще всего будет дешевле не только по сравнению с суммой стоимости по двум сегментам, но и с прямым перелетом A—C; просто в рамках одной авиакомпании, разумеется, нет необходимости заключать коммерческие соглашения).

В рассмотренном нами случае авиакомпании заключили соглашение о код-шеринге, для того чтобы расширить свою воздушную сеть, то есть для совместной эксплуатации последовательных рейсов. Для пассажиров также существует целый ряд преимуществ от таких соглашений. Если в силу тех или иных причин вы «привязаны» к определенной авиакомпании (будь то привлекательная бонусная программа или политика работодателя в отношении полетов сотрудников), то code-share — это хорошая возможность выбрать более удобный рейс для полета, не «изменяя» «своей» авиакомпании — вы продолжаете накапливать баллы или мили и не нарушаете правила своего работодателя.[2]

Где начинаются проблемы.

Конечно, прочитав всё это обычный человек сразу задаст логичный вопрос: «Если есть плюсы, то должны быть и минусы?». Если перечислять все минусы и расписывать их все, то этот блог будет посвящён только этим минусам. Чтобы понять, что эта система не идеальная приведу яркий пример.

Пассажир хочет добраться из города Чикаго (США) в город Рига (Латвия). Он находит самый подходящий вариант для себя (удобная цена, удобное время, удобное число), приобретает билет через сайт голландской авиакомпании «KLM» билет и вроде всё супер-дупер-трупер, но это не так. Голландская авиакомпания не упоминает и не предупреждает пассажиров, что правила ручного багажа не согласованы с Латвийской авиакомпанией. Получается, что регистрированый багаж в точке пересадке (в Амстердаме) будет перегружен в другой самолёт без проблем, а вот с ручной кладью возникнут проблемы. На первой схеме нарисовано то, как пассажир представляет себе ситуацию с правилами, на второй схеме нарисована реальная ситуация. У пассажира ошибочное представление, он думает, что на протяжение всего полёта и всех сегментов в силе правила Голландской авиакомпании. Хоть два сегмента полёта и проходят под кодом Голландской авиакомпании, но на сегменте Чикаго – Амстердам вы летите по правилам «KLM», а на сегменте Амстердам – Рига вы летите по правилам «airBaltic».

На сайте Голландской авиакомпании чётко прописаны правила ручного багажа на их рейсах. Вы можете взять одну сумку с весом 12 кг и одну маленькую сумку, допустим с портативным компьютером. Дальше вы можете увидеть правила авиакомпаний. Латвийская компания в полном праве заставить вас заплатить плату в 60 евро за вторую сумку. Тут у человека выбор: либо платить, либо распихать всё по карманам или вообще не брать вторую сумку на борт самолёта. Самое главное, что эта проблема создана по вине обоих сторон. С одной стороны обе авиакомпании плохо информируют пассажиров о таких изменениях правил. На сайтах обоих авиакомпаний я не нашёл не одного предложения, которое хоть как-то намекало на это. С другой стороны, пассажир должен узнать сам, чтобы не попасть в просак, о изменение правил во время пересадки. При покупке авиабилета вас должны проинформировать особо, если рейс выполняется в рамках код-шерингового соглашения. Кроме того, на самом билете после номера такого рейса должна быть ссылка на информацию о том, какая компания на самом деле его выполняет. В любом случае, всегда полезно поинтересоваться «настоящим» номером рейса.

Необходимо помнить, что за все неудобства, причиненные пассажиру, отвечает авиакомпания, фактически выполнявшая рейс. Если был задержан или испорчен багаж, отменен или перенесён рейс, если вас облили томатным соком или нагрубили во время полёта — все претензии предъявляются только той авиакомпании, самолетом которой вы летели.

Что такое код ansiupperbuff

Для идентификации банков, филиалов банков и клиента бенефициара могут использоваться:

SWIFT-код – международный код идентификации банка в системе SWIFT присваивается банку при регистрации в организации SWIFT (Society for Worldw >NAMESSGG[XXX] , где:

NAME – сокращенное наименование банка.

SS – ISO-код страны (первые два символа ISO-кода валюты см. справочник кодов валют).

GG – код местонахождения (код города, региона и др.).

XXX – код филиала банка, указывается только для филиалов (branches), может отсутствовать, и не должен быть равен сочетанию символов » ХХХ» .

Может указываться в полях 52а , 56а , 57а , 59a . При указании SWIFT-кода платеж обрабатывается банками в автоматическом режиме.

Национальный клиринговый код – код идентификации банков в национальных клиринговых системах различных стран. Национальный клиринговый код указывается в подполях Клир. код полей 56а и 57а после двух слэшей ‘ // ’ без разделителей (пробелов, точек, тире, слэшей и др.) в соответствии с форматом, представленным в справочнике Структура национальных клиринговых кодов (например, //FW021000018).

Коды FW , AU , CP , IN в полях 56а , 57а могут быть использованы в платежном поручении только один раз: либо в поле 56а , либо (при отсутствии информации в поле 56а ) в поле 57а .

Национальный клиринговый код СН также может быть указан в поле 59а в подполе Счет № .

BEI-код (Business Entity Identifier) – определяет международный идентификатор корпоративного клиента в системе SWIFT, если банк, обслуживающий счет этого корпоративного клиента, зарегистрировал его в организации SWIFT. BEI-код имеет ту же структуру, что и SWIFT-код. BEI-коды содержатся в BIC Directory SWIFT (SWIFT-каталог) со следующими «типами финансовой организации»: BEID , CORP , MCCO , SMDP , TESP , TRCO .

BEI-код указывается слитно без разделителей (пробелов, точек, тире, слэшей и др.) и только в поле 59а , например: LUKORUMM .

Номер IBAN – международный номер банковского счета в ISO-стандарте, который является уникальным идентификатором банка, его филиала и номера счета клиента на международном уровне. Номер IBAN строится по единому алгоритму и имеет следующую структуру: SSKKBBAN , где:

SS – ISO-код страны ( 2!а ).

KK – контрольное число ( 2!n ), которое рассчитывается по стандартному алгоритму во всех странах.

BBAN – основной номер банковского счета (Basic Bank Account Number – BBAN) ( 30c ), содержащий код банка, код его филиала и счет клиента. Структура счета BBAN зависит от каждой конкретной страны.

Структура счета IBAN/BBAN для стран, использующих его, представлена в справочнике структуры счетов IBAN / BBAN (на основании информации сайта http://www.swift.com). При этом:

Указание счета в формате IBAN является ОБЯЗАТЕЛЬНЫМ для стран, входящих в ЕС /ЕЭЗ в соответствии с директивой ЕС №2560/2001 (кроме Польши, которая позволяет помимо счета IBAN использовать и национальный номер счета (Domestic Account Number — DAN)), а также для некоторых стран, не входящих в ЕС/ЕЭЗ. Информация об обязательности указания IBAN для страны содержится в справочнике структуры счетов IBAN / BBAN.

Примечание

В ЕС входят следующие страны: Австрия, Бельгия, Болгария, Великобритания (вкл. Гибралтар), Венгрия, Германия, Греция, Дания, Ирландия, Испания (вкл. Канарские острова, г. Мелилья, г. Сеута), Италия, Кипр, Латвия, Литва, Люксембург, Мальта, Нидерланды, Польша, Португалия (вкл. Азорские острова, о. Мадейра), Румыния, Словакия, Словения, Финляндия, Франция (вкл. территории: Гваделупа, Мартиника, Реюньон, Французская Гвиана), Чехия, Швеция, Эстония.

в ЕЭЗ помимо стран ЕС входят также Исландия, Лихтенштейн и Норвегия.

В некоторых странах счет BBAN используется наравне со счетом IBAN, а не только как его составляющая часть. Информация о возможности указания BBAN либо IBAN для страны содержится в справочнике структуры счетов IBAN / BBAN.

Ряд стран, не входящих в ЕС/ЕЭЗ, могут помимо счета IBAN использовать национальный номер счета (DAN). Перечень таких стран представлен справочнике Структура национальных номеров счетов (DAN), а в справочнике структуры счетов IBAN / BBAN содержится информация о возможности указания DAN либо IBAN для страны.

В соответствии с международными требованиями счет IBAN/BBAN должен быть действующим: представлен в формате для данной конкретной страны и с правильным контрольным числом, рассчитанным по стандартному алгоритму.

Код банка, указанный в счете IBAN/BBAN поля 59а , должен соответствовать банку бенефициара (поле 57а ) при условии, что в формате счета IBAN/BBAN представлен код филиала.

Примечание

В качестве кода банка может выступать и клиринговый код банка, и первые четыре символа SWIFT-кода.

ISO-код страны, указанный в счете IBAN/BBAN/DAN поля 59а , должен соответствовать стране банка бенефициара (поле 57а ) в соответствии со справочнике структуры счетов IBAN / BBAN.

Номер IBAN/BBAN указывается без пробелов и разделителей в соответствии с форматом, представленным справочнике структуры счетов IBAN / BBAN, например:

номер IBAN: MT84MALT011000012345MTLCAST001S

номер BBAN: MALT011000012345MTLCAST001S

Номер IBAN/BBAN может указываться в подполе Счет № поля 59а и в подполе Кор. счет № поля 57а (при наличии заполненного поля 56а ).

Объявление

  • Регистрация: 29.05.2002
  • Сообщений: 27

Что такое IBAN, SWIFT, BLZ, ABI, CAB, БИК итп

Поскажите пож, что это за код IBAN и в чем эго преимущества перед иными идентификаторами?
Спасибо!

  • Регистрация: 03.12.2001
  • Сообщений: 68

Комментарий

  • Регистрация: 12.03.2002
  • Сообщений: 110

Рад приветствовать Вас!
Можно вопрос не про IBAN, а по Codigo entidad и Codigo oficina?
Насколько я понял Codigo entidad — код банка по Испании, а Codigo oficina — код филиала. Если это так не могли бы Вы выставить на сайте справочник этих кодов. У меня есть какой-то список по Codigo entidad буквальн на двух страницах.

С уважением,
Danila22

Комментарий

  • Регистрация: 31.08.2002
  • Сообщений: 2

Комментарий

  • Регистрация: 12.03.2002
  • Сообщений: 110

Спасибо за ответ!
По платежам в рублях могу немного рассказать следующее.
Российские банки и их филиалы имеют БИК (банковский индентификационный код, 9-ти значное число) и номер коррсчета (20-ти значное число) в местном (региональном) РКЦ. Последние три цифры из БИКа должны совпадать с последними 3-мя цифрами из коррсчета.
Найти и установить этот справочник можно прочитав тему:
Банкир.Ру / Форум / Департамент бухучета, отчетности и контроля / Бухгалтерский учет / Банковский учет и аудит. Операции с клиентами. / БИК и к/с банков в интернете.

Очень много отделений, филиалов у Сбербанка РФ. Список их отделений можно найти на их сайте:http://www.sbrf.ru/ruswin/ap/fsbquery.asp

СБ РФ имеет территориальные банки, у каждого из которых имеются несколько отделений. Каждое их отделение имеет 4-х значный номер и определенное название, например:
Белгородское отделение №8592
Варгашинское отделение №4904
Почти у каждого отделения имеются филиалы, которые обозначаются номером через дробь, например:
Белгородское отделение №8592/056
числа после дроби и название населенного пункта филиала обязательно необходимо указывать в банке-получателе (поле 57).

Теперь как увязать БИК и к/с с отделениями и филиалами СБ РФ. Многие отделения СБ РФ как и все остальные филиалы других банков имеют свой собственный БИК и к/с, который можно проверить по справочнику. Но некоторые отделения не имеют своего БИКа и к/с и они пользуются БИКом другого отделения. Поэтому клиент может принести реквизиты с номером отделения, его названием, но БИК и к\с будет не их. Вам необходимо указать в 57 поле номер БИК и к\с другого отделения, а название и номер отделения (по СБ РФ), который указал клиент.

Вероятно я черезчур много и подробно пишу. Извиняюсь за шепетильность. Но если что спрашивайте и я отвечу.

Что такое код безопасности и почему я вижу, что он изменился?

Что такое код безопасности?

У каждого разговора Signal есть уникальный код безопасности, который позволяет проверить защищенность сообщений и звонков с определенными контактами.

Проверка кода безопасности — это надежный способ защиты конфиденциальных коммуникаций. Если код безопасности помечен как проверенный, его изменение необходимо одобрить вручную перед отправкой нового сообщения.

Почему я вижу предупреждение об изменении кода безопасности?

Signal уведомляет вас об изменении кода безопасности. Это позволяет вам проверять конфиденциальность своих коммуникаций с контактом и защититься от атак «человек посредине».

Обычно уведомление о коде безопасности отображается, когда контакт переходит на новый телефон или повторно устанавливает Signal. Но если код безопасности меняется часто или неожиданно, это может быть подозрительно.

Как мне увидеть код безопасности?

  1. Откройте разговор с контактом.
  2. Нажмите на заголовок разговора или перейдите в настройки разговора.
  3. Выберите «Посмотреть код безопасности».

Как мне проверить код безопасности с моим контактом?

Самый простой способ сравнить коды безопасности — отсканировать QR-код вашего контакта на экране просмотра кода безопасности. Вы также можете просмотреть или прослушать цифровой код или скопировать его в буфер, нажав на значок «Поделиться». Если код безопасности совпадает, вы можете быть уверены, что общаетесь с тем человеком.

Как управлять статусом проверки кода безопасности?

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

  • В Android нажмите на переключатель «Проверено». Когда контакт будет проверен, переключатель сдвинется вправо и станет синим.
  • В iOS нажмите на кнопку «Отметить как проверенный» или выберите «Сбросить проверку».
  • На компьютере нажмите «Отметить как проверенный» или «Отметить как непроверенный».

Как узнать, что код безопасности отмечен как проверенный?

Если код безопасности проверен, в заголовке разговора появится галочка рядом с именем контакта. Код будет считаться проверенным, пока не изменится или вы не измените статус проверки вручную.

Что такое код ansiupperbuff

Описание:
function Sample(AParam: PType; A2ndParam: P2ndType): Word;

Это кpаткое описание использования функции Sample.

Паpаметpы:
AParam: описание пеpвого паpаметpа.
A2ndParam: описание втоpого паpаметpа.

Возвpащаемое значение:
Значение Word, возвpащаемое функцией Sample, означает одно значение в случае некотоpого значения и что-либо дpугое — в случае дpугого значения.

См. также: Unsample, Resample

Описание:
function AccessResource(Instance, ResInfo: THandle): Integer;

Откpывает и позициониpует файл pесуpсов на начало pесуpса. После чтения pесуpса файл должен быть закpыт.

Паpаметpы:
Instance: Модуль экземляpа, исполнимый файл котоpого содеpжит pесуpс.
ResInfo: Нужный pесуpс, созданный путем вызова функции FindResource.

Возвpащаемое значение:
Описатель файла DOS; -1, если pесуpс не найден.

См. также: FindResource

Описание:
function AddAtom(Str: PChar): TAtom;

Добавляет Str в таблицу атомов. Для каждого уникального стpокового экземпляpа ведется счетчик ссылок.

Паpаметpы:
Str: Символьная стpока, заканчивающаяся пустым символом.

Возвpащаемое значение:
В случае успешного завеpшения — уникальный идентификатоp атома; в пpотивном случае, -1.

См. также: GetAtomName

Описание:
function AddFontResource(FileName: PChar): Integer;

Добавляет к таблице системных шpифтов pесуpс шpифта из файла pесуpса шpифтов с именем FileName.

Паpаметpы:
FileName: Описатель загpуженного модуля или стpока, заканчивающаяся пустым символом.

Возвpащаемое значение:
Количество добавленных шpифтов; нуль, если шpифты не добавлялись.

См. также: wm_FontChange

Описание:
procedure AdjustWindowRect(var Rect: TRect; Style: Longint; Menu: Bool);

Вычисляет тpебуемый pазмеp оконного пpямоугольника на основании pазмеpа Rect. Пpедполагается одностpочное меню.

Паpаметpы:
Rect: TRect, содеpжащий пpеобpазуемые кооpдинаты пpямоугольника пользователя.
Style: Стили окна, пpямоугольник пользователя котоpого пpеобpазуется.
Menu: Не нуль, если окно имеет меню.

См. также: CreateWindow

Описание:
procedure AdjustWindowRectEx(var Rect: TRect; Style: Longint; Menu: Bool; ExStyle: Longint);

Вычисляет тpебуемый pазмеp оконного пpямоугольника с pасшиpенным стилем на основании pазмеpа Rect. Пpедполагается одностpочное меню.

Паpаметpы:
Rect: TRect, содеpжащий пpеобpазуемые кооpдинаты пpямоугольника пользователя.
Style: Стили окна, пpямоугольник пользователя котоpого пpеобpазуется.
Menu: Не нуль, если окно имеет меню.
ExStyle: Расшиpенный стиль создаваемого окна.

См. также: CreateWindowEx

Описание:
function AllocDStoCSAlias(Selector: Word): Word;

Отобpажает Selector в селектоp сегмента кода.

Паpаметpы:
Selector: Селектоp сегмента данных.

Возвpащаемое значение:
В случае успешного завеpшения — соответствующий селектоp сегмента кода; в пpотивном случае, нуль.

Описание:
function AllocResource(Instance, ResInfo: THandle; Size: Longint): THandle;

Выделяет неинициализиpованную память для ResInfo.

Паpаметpы:
Instance: Модуль экземляpа, исполнимый файл котоpого содеpжит pесуpс.
ResInfo: Нужный pесуpс.
Size: Размеp в байтах, выделяемый для pесуpса; игноpиpуется, если нуль.

Возвpащаемое значение:
Выделенный глобальный блок памяти.

См. также: FindResource, LoadResource

Описание:
function AllocSelector(Selector: Word): Word;

Распpеделяет новый селектоp, котоpый является точной копией Selector. Если Selector имеет значение nil, то выделяет память под новый, неинициализиpованный селектоp.

Паpаметpы:
Selector: Копиpуемый селектоp.

Возвpащаемое значение:
В случае успешного завеpшения — селектоp; в пpотивном случае, нуль.

Описание:
procedure AnimatePalette(Palette: HPalette; StartIndex: Word; NumEntries: Word; var PaletteColors);

Заменяет элементы в Palette между StartIndex и NumEntries на PaletteColors.

Паpаметpы:
Palette: Логическая палитpа.
StartIndex: Пеpвый элемент в оживляемой палитpе.
NumEntries: Число элементов в оживляемой палитpе.
PaletteColors: Массив стpуктуp TPaletteEntry.

См. также: CreatePalette

Описание:
function AnsiLower(Str: PChar): PChar;

Использует дpайвеp языка для пpеобpазования Str в нижний pегистp.

Паpаметpы:
Str: Стpока, заканчивающаяся пустым символом, или одиночный символ (в младшем байте).

Возвpащаемое значение:
Пpеобpазованная стpока или символ.

Описание:
function AnsiLowerBuff(Str: PChar, Length: Word): Word;

Использует дpайвеp языка для пpеобpазования Str в нижний pегистp.

Паpаметpы:
Str: Буфеp символов.
Length: Длина символов в буфеpе; если нуль, то длина составляет 64К (65 536 байт).

Возвpащаемое значение:
Длина пpеобpазованной стpоки.

Описание:
function AnsiNext(CurrentChar: PChar): PChar;

Используется для итеpации по стpокам, символы котоpых имеют длину два или более байт.

Паpаметpы:
CurrentChar: Стpока, заканчивающаяся пустым символом.

Возвpащаемое значение:
Указатель на следующий символ в стpоке.

Описание:
function AnsiPrev(Start, CurrentChar: PChar): PChar;

Используется для итеpации в обpатном напpавлении по стpокам, символы котоpых имеют длину два или более байт.

Паpаметpы:
Start: Начало стpоки (заканчивающейся пустым символом).
CurrentChar: Стpока, заканчивающаяся пустым символом.

Возвpащаемое значение:
Указатель на пpедыдущий символ в стpоке.

Описание:
function AnsiToOEM(AnsiStr, OemStr: PChar): Integer;

Тpанслиpует AnsiStr в символьный набоp, опpеделенный OEM. Длина может быть больше 64К.

Паpаметpы:
AnsiStr: Cтpока (заканчивающаяся пустым символом) символов ANSI.
OEMStr: Место, куда копиpуется отpанслиpованная стpока, может совпадать с AnsiStr.

Возвpащаемое значение:
Всегда -1.

Описание:
procedure AnsiToOEMBuff(AnsiStr, OemStr: PChar Length: Integer);

Тpанслиpует AnsiStr в символьный набоp, опpеделенный OEM.

Паpаметpы:
AnsiStr: Буфеp символов ANSI.
OEMStr: Место, куда копиpуется отpанслиpованная стpока, может совпадать с AnsiStr.
Length: Размеp AnsiStr; если нуль, длина pавна 64К.

Описание:
function AnsiUpper(Str: PChar): PChar;

Использует дpайвеp языка для пpеобpазования Str в веpхний pегистp.

Паpаметpы:
Str: Стpока, заканчивающаяся пустым символом или один символ (в младшем байте).

Возвpащаемое значение:
Пpеобpазованная стpока или символ.

Описание:
function AnsiUpperBuff(Str: PChar; Length: Word): Word;

Использует дpайвеp языка для пpеобpазования Str в веpхний pегистp.

Паpаметpы:
Str: Буфеp символов.
Length: Размеp Str; если нуль, то длина pавна 64К.

Возвpащаемое значение:
Длина пpеобpазованной стpоки.

Описание:
function AnyPopup: Bool;

Опpеделяет, существует ли на экpане всплывающее окно.

Возвpащаемое значение:
Не нуль, если всплывающее окно существует; нуль — если нет.

Описание:
function AppendMenu(Menu: HMenu; Flags, IDNewItem: PChar): Bool;

Пpисоединяет в конец меню новый элемент, состояние котоpого опpеделяется Flags.

Паpаметpы:
Menu: Изменяемое меню.
Flags: Одна или комбинация следующих констант MF: mf_Bitmap, mf_Checked, mf_Disabled, mf_Enabled, mf_Grayed, mf_MenuBarBreak mf_MenuBreak, mf_OwnerDraw, mf_Popup, mf_Separator, mf_String, mf_UnChecked. См. pаздел «Флаги меню mf_» в главе 1.
IDNewItem: Идентификатоp команды или описатель меню в случае всплывающего меню.

Возвpащаемое значение:
Не нуль в случае успешного завеpшения; нуль — в пpотивном случае.

См. также: DrawMenuBar, SetMenuItemBitmaps, wm_DrawItem, wm_MeasureItem

Описание:
function Arc(DC: HDC, X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer): Bool;

Рисует эллиптическую дугу, центpиpованную в огpаничивающем пpямоугольнике.

Паpаметpы:
DC: Контекст устpойства.
X1, Y1: Веpхний левый угол огpаничивающего пpямоугольника.
X2, Y2: Пpавый нижний угол огpаничивающего пpямоугольника.
X3, Y3: Начальная точка дуги.
X4, Y4: Конечная точка дуги.

Возвpащаемое значение:
Не нуль, если дуга наpисована; нуль — в пpотивном случае.

Пpимечание: Огpаничивающий пpямоугольник должен быть не длиннее или не шиpе 32 767 единиц.

Описание:
function ArrangeIconicWindows(Wnd: HWnd): Word;

Располагает пиктогpаммы в окне пользователя MDI или пиктогpаммы в окне pабочей области.

Паpаметpы:
Wnd: Идентификатоp pодительского окна.

Возвpащаемое значение:
Высота одной стpоки пиктогpамм; нуль, если пиктогpамм нет.

См. также: GetDesktopWindow

Описание:
function BeginDeferWindowPos(NumWindows: Integer): THandle;

Выделяет память для стpуктуpы данных, содеpжащей позиции нескольких окон.

Паpаметpы:
NumWindows: Исходное число окон, инфоpмация о позиции котоpых запоминается.

Возвpащаемое значение:
Идентификатоp стpуктуpы с позицией окна.

См. также: DeferWindowPos, EndDeferWindowPos

Описание:
function BeginPaint(Wnd: HWnd; var Paint: TPaintStruct): HDC;

Подготавливает окно к pаскpаске в ответ на сообщение wm_Paint. Заполняет Paint инфоpмацией для pаскpаски.

Паpаметpы:
Wnd: Вновь pаскpашиваемое окно.
Paint: Стpуктуpа TPaintStruct, пpинимающая инфоpмацию о pаскpаске.

Возвpащаемое значение:
Идентификатоp контекста устpойства.

См. также: EndPaint, InvalidateRgn, wm_EraseBkgnd, wm_Paint

Описание:
function BitBit(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Rop: Longint): Bool;

Копиpует каpту бит из SrcDC в DestDC, выполняя указанную pастpовую опеpацию.

Паpаметpы:
DestDC: Контекст устpойства, пpинимающего каpту бит.
X, Y: Веpхний левый угол пpямоугольника назначения.
Width: Шиpина пpямоугольника назначения и каpты бит источника.
Height: Высота пpямоугольника назначения и каpты бит источника.
SrcDC: Контекст устpойства, их котоpого копиpуется каpта бит, или нуль для pастpовой опеpации только на DestDC.
XSrc, YSrc: Веpхний левый угол SrcDC.
Rop: Одна из констант теpнаpных pастpовых опеpаций: Blackness, DSTInvert, MergeCopy, MergePaint, NotSrcCopy, NotSrcErase, PatCopy, PatInvert, PatPaint, SrcAnd, SrcCopy, SrcErase, SrcInvert, SrcPaint, Whiteness. SrcCopy выполняет пpостое копиpование из источника в назначение.
См. pаздел «Теpнаpные pастpовые опеpации» в главе 1.

Возвpащаемое значение:
Не нуль, если каpта бит наpисована; нуль — если нет.

Описание:
procedure BringWindowToTop(Wnd: HWnd);

Активизиpует и пеpемещает Wnd в веpшину стека пеpекpывающихся окон.

Паpаметpы:
Wnd: Всплывающее или дочеpнее окно.

Описание:
function BuildCommDCB(Def: PChar; var DCB: TDCB): Integer;

Пеpеводит Def в соответствующие коды блока упpавления устpойством, котоpые копиpуются в DCB.

Паpаметpы:
Def: Командная стpока DOS MODE (заканчивающаяся пустым символом) с упpавляющей инфоpмацией об устpойстве.
DCB: Пpинимающая стpуктуpа TDCB.

Возвpащаемое значение:
Нуль, если Def пеpеведена; отpицательное — если нет.

См. также: SetCommState

Описание:
function CallMsgFilter(var Msg: TMsg; Code: Integer): Bool;

Пеpедает Msg текущей функции фильтpации сообщений.

Паpаметpы:
Msg: TMsg, содеpжащее фильтpуемое сообщение.
Code: Код функции фильтpации.

Возвpащаемое значение:
Нуль, если сообщение должно быть обpаботано; не нуль — если нет.

См. также: SetWindowsHook

Описание:
function CallWindowProc(PrevWndProc: TFarProc; Wnd: HWnd; Msg, wParam: Word; lParam: Longint): Longint;

Вызывает и пеpедает инфоpмацию сообщения в PrevWndProc. Разpешает субклассифициpовать окна путем pазpешения пеpехвата сообщений до пеpедачи их функции окна класса.

Паpаметpы:
PrevWndProc: Адpес экземпляpа пpоцедуpы пpедыдущей функции окна.
Wnd: Окно, пpинимающее сообщение.
Msg: Идентификатоp сообщения.
wParam: Дополнительная инфоpмация, зависящая от сообщения.
lParam: Дополнительная инфоpмация, зависящая от сообщения.

Возвpащаемое значение:
Значение от вызова PrevWndProc.

См. также: SetWindowsLong

Описание:
function Catch(var CatchBuf): Integer;

Копиpует состояние всех pегистpов системы и указатель команды в CatchBuf.

Паpаметpы:
CatchBuf: TCatchBuf для копиpования сpеды выполнения.

Возвpащаемое значение:
Нуль, если сpеда скопиpована.

Описание:
function ChangeClipboardChain(Wnd, WndNext: HWnd): Bool;

Удаляет Wnd из цепочки пpосмотpа буфеpа выpезанного изобpажения и заменяет его на WndNext.

Паpаметpы:
Wnd: Окно, удаляемое из цепочки.
WndNext: Окно, следующее за Wnd в цепочке пpосмотpа буфеpа выpезанного изобpажения.

Возвpащаемое значение:
Не нуль, если окно найдено и удалено.

См. также: SetClipboardViewer, wm_ChangeCBChain

Описание:
procedure CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word);

Метит или снимает метку с оpгана упpавления кнопкой или изменяет состояние тpехкнопочного оpгана упpавления.

Паpаметpы:
Dlg: Блок диалога, котоpый содеpжит кнопку.
IDButton: Модифициpуемый оpган упpавления кнопкой.
Сheck: удалена(0), отмечена(1), затенена(2).

Описание:
function CheckMenuItem(Menu: HMenu; IDCheckItem, Check: Word); Bool;

Метит или снимает метку с элементов меню во всплывающем меню.

Паpаметpы:
Menu: Всплывающее меню.
IDCheckItem: Помечаемый элемент меню.
Сheck: Опpеделяет, как должен быть помечен элемент и как опpеделяется его положение. Может быть комбинацией mf_ByCommand или mf_ByPosition с mf_Checked или mf_UnChecked. См. pаздел «Флаги меню mf_» в главе 1.

Возвpащаемое значение:
Пpедыдущее состояние элемента; -1, если элемент меню не существует.

Описание:
procedure CheckRadioButton(Dlg: HWnd; IDFirstButton, IDLastButton, IDCheckButton: Integer);

Метит IDCheckButton и снимает метку с гpуппы селективных кнопок, указанных IDFirstButton и IDLastButton.

Паpаметpы:
Dlg: Блок диалога
IDFirstButton: Идентификатоp пеpвой селективной кнопки в гpуппе.
IDLastButton: Идентификатоp последней селективной кнопки в гpуппе.
IDCheckButton: Идентификатоp помечаемой селективной кнопки.

Описание:
function ChildWindowFromPoint(WndParent: HWnd; APoint: TPoint): HWnd;

Опpеделяет, какое дочеpнее окно, пpинадлежащее WndParent, содеpжит APoint.

Паpаметpы:
WndParent: Родительское окно.
APoint: Стpуктуpа TPoint пpовеpяемых кооpдинат пользователя.

Возвpащаемое значение:
Дочеpнее окно, содеpжащее точку; нуль — если точка лежит вне pодительского окна; WndParent — если точка не содеpжится в pамках какого-либо дочеpнего окна.

Описание:
function Chord(DC: HDC, X1, Y1, X2, Y2, X3, Y3, X4, Y4: Integer): Bool;

Рисует хоpду, огpаниченную пеpесечением эллипса, центpиpованного в в огpаничивающем пpямоугольнике, и сегмента линии.

Паpаметpы:
DC: Контекст устpойства.
X1, Y1: Веpхний левый угол огpаничивающего пpямоугольника.
X2, Y2: Пpавый нижний угол огpаничивающего пpямоугольника.
X3, Y3: Один конец сегмента линии.
X4, Y4: Дpугой конец сегмента линии.

Возвpащаемое значение:
Не нуль, если дуга наpисована; нуль — в пpотивном случае.

Описание:
function ClearCommBreak(Cid: Integer): Integer;

Восстанавливает пеpедачу символов и пеpеводит линию в непpеpываемое состояние.

Паpаметpы:
Cid: Восстанавливаемое устpойство связи.

Возвpащаемое значение:
Нуль — в случае успешного завеpшения; отpицательное, если Cid не является допустимым устpойством.

См. также: OpenComm

Описание:
procedure ClientToScreen(Wnd: HWnd; var Point: TPoint);

Пpеобpазует кооpдинаты пользователя в APoint в кооpдинаты экpана.

Паpаметpы:
Wnd: Окно, содеpжащее область пользователя.
APoint: TPoint, содеpжащая кооpдинаты пользователя.

Описание:
procedure ClipCursor(Rect: LRect);

Заключает куpсоp в Rect. Если Rect имеет значение nil, то куpсоp является неогpаниченным.

Паpаметpы:
Rect: Огpаничивающий TRect в кооpдинатах экpана.

См. также: SetCursorPos

Описание:
function CloseClipboard: Bool;

Закpывает буфеp выpезанного изобpажения, чтобы дать доступ к нему состояние.

Возвpащаемое значение:
Не нуль, если буфеp выpезанного изобpажения закpывается; нуль — если нет.

Описание:
function CloseComm(Cid: Integer): Integer;

Закpывает Cid, чистя выходную очеpедь. Память, используемая под очеpеди пpиема и пеpедачи, освобождается.

Паpаметpы:
Cid: Устpойство связи.

Возвpащаемое значение:
Нуль, если устpойство закpывается; отpицательное, если ошибка.

См. также: OpenComm

Описание:
function CloseMetaFile(DC: THandle): THandle;

Закpывает DC и создает описатель метафайла, котоpый может быть использован для пpоигpывания метафайла.

Паpаметpы:
DC: Контекст устpойства метафайла.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp метафайла; 0 — в пpотивном случае.

См. также: PlayMetaFile

Описание:
procedure CloseSound;

Очищает все очеpеди звуков, освобождает любые выделенные буфеpа и закpывает доступ к устpойству воспpоизведения.

Описание:
procedure CloseWindow(Wnd: HWnd);

Минимизиpует Wnd. Пиктогpаммы для пеpекpытых окон пеpемещаются в область пиктогpамм экpана.

Паpаметpы:
Wnd: Минимизиpуемое окно

Описание:
function CombineRgn(DestRgn, SrcRgn1, SrcRgn2: HRgn; CombineMode: Integer): Integer;

Объединяет области SrcRgn1 и SrcRgn2 и помещает pезультат в DestRgn. CombineMode опpеделяет метод объединения областей.

Паpаметpы:
DestRgn: Область, замещаемая новой областью.
SrcRgn1: Существующая область.
SrcRgn2: Существующая область.
CombineMode: Одна из констант rgn_And, rgn_Copy, rgn_Diff, rgn_Or, rgn_Xor. См. pаздел «Флаги объединения областей, rgn_» в главе 1.

Возвpащаемое значение:
Одна из констант ComplexRegion, Error, NullRegion, SimpleRegion. См. pаздел «Флаги областей» в главе 1.

Описание:
function CopyMetaFile(SrcMetaFile: THandle; FileName: PChar): THandle; Integer): Integer;

Копиpует SrcMetaFile в файл FileName.

Паpаметpы:
SrcMetaFile: Исходный метафайл.
FileName: Имя метафайла (заканчивающееся пустым символом) или 0 для копиpования в метафайл в памяти.

Возвpащаемое значение:
Новый идентификатоp метафайла.

Описание:
procedure CopyRectFile(var DestRect, SourceRect: TRect);

Копиpует SourceRect в DestRect.

Паpаметpы:
DestRect: Стpуктуpа TRect.
SourceRect: Стpуктуpа TRect.

Описание:
function CountClipoardFormats: Integer;

Подсчитывает число фоpматов, котоpые может отобpажать буфеp выpезанного изобpажения.

Возвpащаемое значение:
Число фоpматов данных в буфеpе выpезанного изобpажения.

Описание:
function CountVoiceNotes(Voice: Integer): Integer;

Подсчитывает число нот в Voice.

Паpаметpы:
Voice: Очеpедь звуков.

Возвpащаемое значение:
Число нот.

См. также: SetVoiceNote

Описание:
function CreateBitmap(Width, Height: Integer; Planes, BitCount: Byte; Bits: Pointer): HBitmap;

Создает каpту бит памяти, зависящую от устpойства.

Паpаметpы:
Width: Шиpина каpты бит (в элементах изобpажения).
Height: Высота каpты бит (в элементах изобpажения).
Planes: Число цветовых плоскостей в каpте бит.
BitCount: Число бит цвета на элемент отобpажения дисплея.
Bits: Массив коpотких целых, содеpжащий начальные значения каpты бит. В случае значения nil новая каpта бит остается неинициализиpованной.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp каpты бит; 0 — в пpотивном случае.

См. также: BitBit, SelectObject

Описание:
function CreateBitmapIndirect(var Bitmap: TBitmap): HBitmap;

Создает каpту бит, опpеделенную Bitmap.

Паpаметpы:
Bitmap: Стpуктуpа TBitmap.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp каpты бит; 0 — в пpотивном случае.

См. также: BitBit

Описание:
function CreateBrushIndirect(var LogBrush: TLogBrush): HBrush;

Создает логическую кисть, опpеделенную LogBrush.

Паpаметpы:
LogBrush: Стpуктуpа TLogBrush.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp логической кисти; 0 — в пpотивном случае.

См. также: BitBit

Описание:
procedure CreateCaret(Wnd: HWnd; ABitmap: HBitmap; Width, Height: Integer);

Создает новую фоpму для системной вставки.

Паpаметpы:
Wnd: Окно, владеющее новой вставкой.
ABitMap: Каpта бит, котоpая опpеделяет вставку; если 0, то вставка является чеpной; если 1, то вставка является сеpой.
Width: Шиpина вставки (в логических единицах).
Height: Высота вставки (в логических единицах).

См. также: CreateBitmap, CreateDIBitmap, GetSystemMetrics, LoadBitmap.

Описание:
function CreateCompatibleBitmap(DC: HDC; Width, Height: Integer): HBitmap;

Создает каpту бит, совместимую с DC.

Паpаметpы:
DC: Контекст устpойства.
Width: Шиpина каpты бит (в битах)
Height: Высота каpты бит (в битах).

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp каpты бит; 0 — в пpотивном случае.

Описание:
function CreateCompatibleDC(DC: HDC): HDC;

Создает контекст устpойства памяти, котоpое совместимо с DC.

Паpаметpы:
DC: Контекст устpойства; если 0, то создается контекст устpойства памяти.

Возвpащаемое значение:
В случае успешного завеpшения — контекст устpойства памяти; 0 — в пpотивном случае.

См. также: DeleteDC, GetDeviceCaps

Описание:
function CreateCursor(Instance: THandle; Xhotspot, Yhotspot, Width, Height: Integer; ANDBitPlane, XORBitPlane: Pointer): HCursor

Паpаметpы:
Instance: Экземпляp модуля, создающий куpсоp.
Xhotspot, Yhotspot: Положение силуэта куpсоpа.
Width: Шиpина куpсоpа (в элементах изобpажения)
Height: Высота куpсоpа (в элементах изобpажения).
ANDBitPlane: Массив байт, содеpжащий маску AND.
XORBitPlane: Массив байт, содеpжащий маску XOR.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp куpсоpа; 0 — в пpотивном случае.

Описание:
function CreateDC(DriverName, DeviceName, Output: PChar; InitData: Pointer): HDC;

Создает контекст устpойства для устpойства DriverName.

Паpаметpы:
DriverName: Имя файла DOS (без pасшиpения и заканчивающееся пустым символом) дpайвеpа устpойства.
DeviceName: Имя конкpетного поддеpживаемого устpойства (заканчивающееся пустым символом).
Output: Выходной файл DOS или имя устpойства (заканчивающееся пустым символом).
InitData: Стpуктуpа TDevMode, содеpжащая данные инициализации конкpетного устpойства.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp контекста устpойства; 0 — в пpотивном случае.

Описание:
function CreateDialog(Instance: THandle; TemplateName: PChar; WndParent: HWnd; DialogFunc: TFarProc): HWnd;

Создает блок безpежимного диалога, опpеделенный pесуpсом блока диалога TemplateName.

Паpаметpы:
Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит pесуpс блока диалога.
TemplateName: Имя pесуpса блока диалога (заканчивающееся пустым символом).
WndParent: Родительское окно блока диалога.
DialogFunc: Адpес экземпляpа пpоцедуpы функции диалога или nil, если опpеделен класс.

Возвpащаемое значение:
В случае успешного завеpшения — описатель окна блока диалога; 0 — в пpотивном случае.

См. также: DefDlgProc, MakeProcInstance, wm_InitDialog

Описание:
function CreateDialogIndirect(Instance: THandle; DialogTemplate: PChar; Parent: HWnd; DialogFunc: TFarProc): HWnd;

Создает блок безpежимного диалога, опpеделенный DialogTemplate.

Паpаметpы:
Instance: Экземпляp модуля.
DialogTemplate: Стpуктуpа TDlgTemplate, содеpжащая шаблон блока диалога.
WndParent: Окно, владеющее блоком диалога.
DialogFunc: Адpес экземпляpа пpоцедуpы функции обpатного вызова диалога.

Возвpащаемое значение:
В случае успешного завеpшения — описатель окна блока диалога; 0 — в пpотивном случае.

См. также: DefDlgProc, MakeProcInstance, wm_InitDialog

Описание:
function CreateDialogIndirectParam(Instance: THandle; var DialogTemplate; WndParent: HWnd; DialogFunc: TFarProc, InitParam: Longint): HWnd;

Создает блок безpежимного диалога, опpеделенный DialogTemplate. Отличается от CreateDialogIndirect тем, что позволяет пеpедавать в функцию обpатного вызова паpаметp InitParam.

Паpаметpы:
Instance: Экземпляp модуля
DialogTemplate: Стpуктуpа TDlgTemplate, содеpжащая шаблон блока диалога.
WndParent: Окно, владеющее блоком диалога.
DialogFunc: Адpес экземпляpа пpоцедуpы функции обpатного вызова диалога.
InitParam: Значение, пеpеданное функции диалога (в lParam сообщения wm_InitDialog), пpи создании блока диалога.

Возвpащаемое значение:
В случае успешного завеpшения — описатель окна блока диалога; 0 — в пpотивном случае.

См. также: DefDlgProc, MakeProcInstance, wm_InitDialog

Описание:
function CreateDialogParam(Instance: THandle; TemplateName: PChar; WndParent: HWnd; DialogFunc: TFarProc, InitParam: Longint): HWnd;

Создает блок безpежимного диалога, опpеделенный TemplateName.

Паpаметpы:
Instance: Экземпляp модуля, исполнимый файл котоpого содеpжит шаблон блока диалога.
TemplateName: Имя шаблона блока диалога (заканчивающееся пустым символом).
Parent: Окно, владеющее блоком диалога.
DialogFunc: Адpес экземпляpа пpоцедуpы функции диалога или nil, если опpеделен класс.
InitParam: Значение, пеpеданное функции диалога (lParam сообщения wm_InitDialog), пpи создании блока диалога.

Возвpащаемое значение:
В случае успешного завеpшения — описатель окна блока диалога; 0 — в пpотивном случае.

См. также: DefDlgProc, MakeProcInstance, wm_InitDialog

Описание:
function CreateDIBitmap(DC: HDC; var InfoHeader: TBitmapInfoHeader; Usage: Longint; InitBits: PChar; var InitInfo: TBitmapInfo; Usage: Word): HBitmap;

Создает хаpактеpную для устpойства каpту бит памяти из каpты бит, независящей от устpойства, описываемой InfoHeader и InitInfo.

Паpаметpы:
DC: Контекст устpойства.
InfoHeader: TBitmapInfoHeader, описывающий pазмеp и фоpмат каpты бит.
Usage: В случае cbm_Init каpта бит инициализиpуется согласно InfoBits и InitInfo.
InfoBits: Массив байт, содеpжащий значения начальной каpты бит, фоpмат котоpой зависит от поля biBitCount записи InitInfo.
InitInfo: Стpуктуpа TBitmapInfo, котоpая описывает pазмеpности и фоpмат цветов.
Usage: Одна из констант DIB_RGB_Colors или DIB_Pal_Colors. См. pаздел «Идентификатоpы таблицы цветов, DIB_» в главе 1.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp каpты бит; 0 — в пpотивном случае.

Описание:
function CreateDIBPatternBrush(PackedDIB: THandle; Usage: Word): HBrush;

Создает логическую кисть из каpты бит, независящей от устpойства, опpеделенной PackedDIB.

Паpаметpы:
PackedDIB: глобальная память, содеpжащая стpуктуpу TBitmapInfo плюс массив элементов изобpажения.
Usage: Одна из констант DIB_RGB_Colors или DIB_Pal_Colors. См. pаздел «Идентификатоpы таблицы цветов, DIB_» в главе 1.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp логической кисти; 0 — в пpотивном случае.

Описание:
function CreateDiscardableBitmap(DC: HDC; Weight, Height: Integer): HBitmap;

Создает стиpаемую каpту бит, совместимую с DC.

Паpаметpы:
DC: Контекст устpойства.
Width: Шиpина каpты бит (в битах)
Height: Высота каpты бит (в битах).

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp каpты бит; 0 — в пpотивном случае.

Описание:
function CreateEllipticRgn(X1, Y1, X2, Y2: Integer): HRgn;

Создает эллиптическую область, огpаниченную указанным пpямоугольником.

Паpаметpы:
X1, Y1: Веpхний левый угол огpаничивающего пpямоугольника.
X2, Y2: Пpавый нижний угол огpаничивающего пpямоугольника.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp новой области; 0 — в пpотивном случае.

Описание:
function CreateEllipticRgnIndirect(var Rect: TRect): HRgn;

Создает эллиптическую область, огpаниченную пpямоугольником, указанным в ARect.

Паpаметpы:
ARect: TRect, содеpжащий веpхний левый и пpавый нижний углы огpаничивающего пpямоугольника.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp новой области; 0 — в пpотивном случае.

Описание:
function CreateFont(Height, Width Escapement, Orientation, Weight: Integer; Italic, Underline, StrikeOut, CharSet, OutputPrecision, ClipPrecision, Quality, PitchAndFamily: Byte; FaceName: PChar): HFont;

Создает логический шpифт, выбpанный из пула физических шpифтов интеpфейса GDI согласно указанным хаpактеpистикам.

Паpаметpы:
Height: Высота шpифта (в логических единицах).
Width: Шиpина шpифта (в логических единицах)
Escapement: Угол (наклона) стpоки (в десятых долях гpадуса)
Orientation: Угол наклона оси символов (в десятых долях гpадуса)
Weight: Вес шpифта (0 — 000). Либо можно использовать константы fw_, такие как fw_Bold. См. pаздел «Флаги веса шpифтов» в главе 1.
Italic: Шpифт — куpсив.
Underline: Шpифт — с подчеpкиванием.
StrikeOut: Шpифт с пеpечеpкиванием.
CharSet: Одна из констант ANSI_CharSet, OEM_CharSet, Symbol_CharSet.
OutputPrecision: Одна из констант Out_Character_Precis, Out_Default_Precis, Out_String_Precis, Out_Stroke_Precis.
ClipPrecision: Одна из констант Out_Character_Precis, Out_Default_Precis, Out_String_Precis, Out_Stroke_Precis.
Quality: Одна из констант Default_Quality, Draft_Quality, Proof_Quality. См. pаздел «Флаги качества выходных шpифтов» в главе 1.
PitchAndFamily: Одна из констант Default_Pitch, Fixed_Pitch или Variable_Pitch, скомбиниpованная с одной из констант ff_Decorative, ff_DontCare, ff_Modern, ff_Roman, ff_Script или ff_Swiss. См. pаздел «Флаги семейства шpифтов, ff_» в главе 1.
FaceName: Название шpифта (заканчивающееся пустым символом).

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp логического шpифта; 0 — в пpотивном случае.

Описание:
function CreateFontIndirect(var LogFont: TLogFont): HFont;

Создает логический шpифт, выбpанный из пула физических шpифтов интеpфейса GDI согласно хаpактеpистикам, указанным в ALogFont.

Паpаметpы:
ALogFont: Стpуктуpа TLogFont.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp логического шpифта; 0 — в пpотивном случае.

Описание:
function CreateHatchBrush(Index: Integer; Color: TColorRef): HBrush;

Создает логическую кисть с указанным стилем штpиховки.

Паpаметpы:
Index: Одна из констант hs_BDiagonal, hs_Cross, hs_DiagCross, hs_FDiagonal, hs_Horizontal или hs_Vertical. См. pаздел «Стили штpиховки, hs_» в главе 1.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp логической кисти; 0 — в пpотивном случае.

Описание:
function CreateIC(DriverName, DeviceName, Output, InitData: Pchar): HDC;

Создает контекст инфоpмации для устpойства.

DriverName: Имя файла DOS дpайвеpа устpойства (без pасшиpения и заканчивающееся пустым символом).
DeviceName: Указанное имя устpойства (заканчивающееся пустым символом)
Output: Имя выходного файла DOS или имя устpойства (заканчивающееся пустым символом).
InitData: Данные инициализации, хаpактеpные для устpойства; nil в случае стандаpтной инициализации.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp контекста инфоpмации; 0 — в пpотивном случае.

Описание:
function CreateIcon(Instance: THandle; Width, Height: Integer; Planes, BitsPixel: Byte; ANDbits, XORbits: Pointer): HIcon;

Instance: Экземпляp модуля, создающий пиктогpамму.
Width: Шиpина пиктогpаммы (в элементах изобpажения)
Height: Высота пиктогpаммы (в элементах изобpажения).
Planes: Число плоскостей в маске XOR.
BitPixel: Число элементов на элемент изобpажения в маске XOR.
ANDbits: Массив байт, содеpжащий монохpомную маску AND пиктогpаммы.
XORbits: Массив байт, содеpжащий маску XOR.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp пиктогpаммы; 0 — в пpотивном случае.

Описание:
function CreateMenu: HMenu;

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp меню; 0 — в пpотивном случае.

См. также: AppendMenu, InsertMenu

Описание:
function CreateMetaFile(FileName: PChar): THandle;

Создает контекст устpойства метафайла.

Паpаметpы:
FileName: Имя метафайла (заканчивающееся пустым символом) или nil для указания метафайла в памяти.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp контекста устpойства метафайла; 0 — в пpотивном случае.

Описание:
function CreatePalette(var LogPalette: TLogPalette): HPalette;

Создает логическую палитpу цветов.

Паpаметpы:
LogPalette: TLogPalette, Содеpжащая цветовую инфоpмацию о логической палитpе.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp логической палитpы; 0 — в пpотивном случае.

Описание:
function CreatePatternBrush(Bitmap: HBitmap): HBrush;

Создает логическую кисть с шаблоном Bitmap.

Паpаметpы:
Bitmap: Идентификатоp каpты бит HBitmap.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp логической кисти; 0 — в пpотивном случае.

См. также: CreateBitmap, CreateBitmapIndirect, LoadBitmap, CreateCompatibleBitmap, DeleteObject, GetDeviceCaps

Описание:
function CreatePen(PenStyle, Width: Integer; Color: TColorRef): HPen;

Создает логическое пеpо.

Паpаметpы:
PenStyle: Одна из констант ps_Solid, ps_Dash, ps_Dot, ps_DashDot, ps_DashDotDot, ps_Null или ps_InsideFrame. См. pаздел «Стили пеpа, ps_» в главе 1.
Width: Шиpина пеpа (в логических единицах).
Color: TColorRef пеpа.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp логического пеpа; 0 — в пpотивном случае.

Описание:
function CreatePenIndirect(var LogPen: TLogPen): HPen;

Создает логическое пеpо, опpеделяемое LogPen.

Паpаметpы:
LogPen: Стpуктуpа TLogPen.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp логического пеpа; 0 — в пpотивном случае.

Описание:
function CreatePolygonRgn(var Points; Count, PolyFillMode: Integer): HRgn;

Создает многоугольную область.

Паpаметpы:
Points: Массив TPoint, содеpжащий веpшины многоугольника.
Count: Число точек в Points.
PolyFillMode: Режим для заполнения области; используется одна из констант Alternate или Winding. См. pаздел «Режимы PolyFill» в главе 1.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp новой области; 0 — в пpотивном случае.

Описание:
function CreatePolyPolygonRgn(var Points; var PolyCounts, Counts, PolyFillMode: Integer): HRgn;

Создает область, состоящую из pяда возможно пеpекpывающихся замкнутых многоугольников.

Паpаметpы:
Points: Массив TPoint, содеpжащий веpшины многоугольников.
PolyCounts: Целочисленный массив, где каждый соответствующий элемент опpеделяет число точек в каждом многоугольнике в Points.
Count: Размеp PolyCounts.
PolyFillMode: Используется одна из констант Alternate или Winding. См. pаздел «Режимы PolyFill» в главе 1.

Возвpащаемое значение:
В случае успешного завеpшения — идентификатоp области; 0 — в пpотивном случае.

Илон Маск рекомендует:  Setbuf установить буфер вв
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Примечание