![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 1 Всего: 23 |
Не могу понять, для чего нужны дескрипторы и что они из себя представляют, а также, как ими пользоваться. Что означает дескриптор handle
Это сообщение отредактировал(а) Baa - 11.8.2003, 17:00 |
|||
|
||||
| Sun |
|
|||
|
Account removed ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1611 Регистрация: 14.8.2002 Репутация: нет Всего: 48 |
Дескриптор - это идентфикатор ресурса в операционной ситеме. У каждого открытого файла есть файловый дескриптор - целое число. Тоже самое с окнами - каждое окно имеет свой дескриптор. Используя дескриптор можно обращаться к ресурсу и управлять им (например операции чтения/записи в файле или изменение положения/размеров окна)
Тип данных: fpos_t Это - тип объекта, который может кодировать информацию относительно файловой позиции потока, для использования функциями fgetpos и fsetpos. В системе GNU, fpos_t эквивалентен off_t или long int. В других системах, он может иметь различное внутреннее представление. -------------------- Account removed |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Смысл handle'а кроется в его переводе на русский - ручка (в смысле ручка, например, дверная). Чтоб работать с каким-либо объектом надо передавать в функции его handle. Например, хочешь показать окно пишешь ShowWindow(<handle окна>, <как показать>). Физически handle - это указатель на структуру, динамически размещенную в памяти операционной системой. В этой структуре хранится вся информация об объекте (окне, контексте устройства, пере, кисти и чего-угодно) и его состоянии. Handle формируется ОС при создании объекта и возвращается функцией, создавшей объект.
HWND hWnd = CreateWindow(.......); //создали окно, в hWnd его дескриптор HPEN hPen = CreatePen(......); //создали перо, в hPen его дескриптор HDC dc = GetDC(hWnd); //спросили у ОС: "А какой дескриптор у контекста устройства окна с дескриптром hWnd?" :-) В ответ полусили этот дескриптор и поместили его в dc HPEN hOldPen = SelectObject(dc, hPen); //Просим ОС рисовать на устройстве нашим пером. А дескриптор того пера, которое использовала ОС до этого, сохраняем в hOldPen Ellipse(dc, 10, 10, 100, 100); //Рисуем выбранным пером на устройстве с дескриптором dc круг //Теперь когда перо не нужно, можно удалить из памяти этот объект, но сначала надо вернуть устройству старое перо, иначе окно будет использовать для рисования не существующее перо SelectObject(dc, hOldPen); DeleteObject(hPen); //Windows освобождает память от структуры, описывающей наше перо. Передаём его дескриптор. //Всё, конец проги, надо удалить окно DestroyWindow(hWnd); //удалить окно с дескриптором hWnd dc удалять нельзя, потому что не мы его создали, мы просто узнали его функцией GetDC. А создала его Windows в CreateWindow, и удалять его тоже будет Windows в DestroyWindow. Для полного описания темы одного топика, конечно, мало, но суть такова. Это сообщение отредактировал(а) RAN - 11.8.2003, 18:21 |
|||
|
||||
| Kolia |
|
|||
|
Шустрый ![]() Профиль Группа: Awaiting Authorisation Сообщений: 132 Регистрация: 11.7.2003 Где: Вильнюс Репутация: нет Всего: нет |
RAN Ну, ты молодец. Все раЗжевал. Даже я все понял наконеЦ-то. Тебе бы книги писать таким понятным языком (в отличИе от некоторых книг, где читаешь предложение и два часа его перевариваешь. Успех был бы гарантирован.
Это сообщение отредактировал(а) Baa - 12.8.2003, 12:00 --------------------
Риспект |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: нет Всего: 64 |
Небольшое уточнение. В книжке "Программирование графики для Windows" Фень Юань-я, сказано следующее. Microsoft не стали возвращать указатель на обьект пользовательскому приложению. Возможно, это было сделано из тех соображений, что указатель несет слишком много информации для "умных" программистов - он выдает точное местоположение обьекта в памяти. Указатели позволяют выполнять операции чтения\записи с внутренним представлением обьектов, которые ОС предпочла бы скрыть от пользователя. Кроме того указатели затрудняют совместное использование обьектов из адресных пространств разных процессов. Чтобы скрыть эту информацию от программистов, функции создания обьектов вместо указателя обычно возвращают манипулятор (Handle) обьекта.Манипулятор представляется как число, однозначно идентифицируещее обьект и может использоваться для косвенных ссылок на него. -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |