Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > THandle :), HWND и HDC разница какая?


Автор: Teleport 11.12.2008, 14:11
я вот никак не пойму с этими типами данных:
THandle, HWND, HDC. Handle - насколько я понимаю - это дескриптор окна(integer) По этому дескриптору можно найти любое окно.  Если не прав поправьте.
Какая разница между этими типами?? 
Так вот, пример:
Код

procedure TForm1.Button1Click(Sender: TObject);
var

hd: HWND;
han: hdc;
des: THandle;
begin

  hd:= Button1.Handle;
  han:= Button1.Handle;
  des:= Button1.Handle;

Label2.Caption:=  IntToStr(han);
Label3.Caption:=  IntToStr(des);
Label4.Caption:=  IntToStr(hd);

end;



Все эти переменные - вроде разных типов и могут приравниваться к одному и тому же Button1.Handle. 
Для каких целей какой тип использовать?

Автор: Poseidon 11.12.2008, 14:20
В принципе это одно и тоже и сводится к LongWord. Разница в использовании. В справки же все есть.

Цитата
THandle is a 32-bit value that uniquely identifies a resource.


Цитата
Use HWND for Windows API calls that require a window handle. Use HWND instead of the Handle property when working with TWebBrowser controls.


Автор: Teleport 11.12.2008, 14:36
т.е.  THandle и hdc - я использую просто в приложениях своих. А HWND - когда работаю со средствами TWebBrowser. Так?

Автор: Rrader 11.12.2008, 14:54
Когда используешь WinAPI, смотри, какие типы параметров использует та или иная функция, и используй их.  В Delphi особой разницы нет, что писать (главное размер соблюдать, работать-то оно будет smile ), но тогда смысловая нагрузка типов теряется.

Эти типы из win32k.sys:

HWND - Window Handle - для оконных API
HDC - Device Context Handle - для GDI API

Просто числа (дескриптор - краткий описатель), скрывающие тонкую структуру соответственно таблиц Windowing и GDI smile 

THandle - это уже тип Delphi, с API не связан.

Автор: CodeMonkey 11.12.2008, 14:56
Teleport, это всё - ровно один и тот же тип данных. А именно - просто четырёхбайтовое число. Вообще можно использовать любой тип. 
Но. С практической точки зрения имеет смысл использовать "подходящие по смыслу". Т.е. TButton.Handle имеет тип HWND (как я это узнал? Открыл справку! Иногда Ctrl+клик помогает). Несмотря на то, что это то же самое, что тип HDC, не рекомендуется использовать для этого HDC. Просто, чтобы не запутаться. 

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

Например, пусть тебе дана переменная V: HWND. Что ты с ней сможешь сделать? В принципе, ты можешь сказать: "ага, этот описатель имеет тип HWND, значит, он, скорее всего, описывает окно. Т.е. я могу, например, передать V в SendMessage".
Или: V: HDC. Ты скажешь: "ага, этот описатель контекста устройства. Тогда, наверное, я могу передать его в ReleaseDC".

Да, поскольку все описатели - это один и тот же тип данных. Ты мог бы взять и в переменную V: HWND записать описатель контекста устройства, а вовсе не описатель окна. Да, это было бы полностью корректно (надеюсь, понятно, что описатель контекста устройства нельзя передать в SendMessage, в каком бы типе данных он ни хранился?). Но если бы ты или другой человек потом посмотрели бы код, увидели бы название HWND и, по-ошибке, передали бы в SendMessage.

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

Добавлено через 3 минуты и 43 секунды
Цитата(Rrader @  11.12.2008,  14:54 Найти цитируемый пост)
THandle - это уже тип Delphi, с API не связан.

Да ну. C TButton.Handle: HWND не спутали?
http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx.

Автор: Teleport 11.12.2008, 15:02
начинает проясняться smile
Спасибо за разъяснение smile

Автор: Rrader 11.12.2008, 15:47
Цитата(CodeMonkey @  11.12.2008,  20:56 Найти цитируемый пост)
Да ну. C TButton.Handle: HWND не спутали?

Не спутал. Но, прощу прощения, выразился не свосем корректно. smile  Я имею в виду, что THandle искусственный (префикс T дельфийский), и не в полной мере отражает тип HANDLE (я бы его по-другому дефинировал).

Автор: THandle 11.12.2008, 16:30
 smile 

Интересно знать, что значил бы смайлик после "THandle" в названии темы?

Цитата(Rrader @  11.12.2008,  15:47 Найти цитируемый пост)
 Я имею в виду, что THandle искусственный (префикс T дельфийский), и не в полной мере отражает тип HANDLE (я бы его по-другому дефинировал).


А как? И по каким причинам он не в полной мере отражает? smile Просто интересно стало, за что меня не любят ;)

Автор: Rrader 11.12.2008, 16:47
Цитата(THandle @  11.12.2008,  22:30 Найти цитируемый пост)
Просто интересно стало, за что меня не любят ;)

Шутник smile 

Мои ночные кошмары таковы:

THandle так назван, чтобы не было конфликта со свойством Handle. По мне он должен быть явно объявлен через LongWord (type LongWord) и иметь название HANDLE (а свойство Handle переименовать). Но это уже, видимо, невозможно.

Добавлено через 35 секунд
 smile 

Автор: CodeMonkey 12.12.2008, 10:21
Цитата(Rrader @  11.12.2008,  15:47 Найти цитируемый пост)
Я имею в виду, что THandle искусственный (префикс T дельфийский), и не в полной мере отражает тип HANDLE (я бы его по-другому дефинировал).

Хорошее замечание. Действительно, типу THandle следовало бы называться HANDLE, также как и HDC, HWND и HMODULE. Но в целях упрощения кода для него сделали исключение.
Вообще в Delphi принято вводить "Delphi-псевдонимы" для типов системы. Например, есть у Windows такой тип: _EXCEPTION_RECORD. Но на Паскале его написание смотрится ужасно. Поэтому в Delphi вводится для него псевдоним: TExceptionRecord = _EXCEPTION_RECORD;. TExceptionRecord - это уже совсем Паскаль. Другой пример - _RTL_CRITICAL_SECTION и TRTLCriticalSection. Она и та же сущность, но с разными стилями именования типа.

Автор: Teleport 12.12.2008, 21:08
2 THandle - смайлик? А меня просто лыба растянула в момени набора темы smile, зная что есть такой добрый челорвек на форуме - Thandle smile
И вот в вашем обсуждении я черпаю важную информацию smile Спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)