На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> В чём отличия GetWindowDC от GetDC?
    По описанию похожи:

    ExpandedWrap disabled
      function GetWindowDC; external user32 name 'GetWindowDC';
      function GetWindowDC(hWnd: HWND): HDC; stdcall;
       
       
      function GetDC; external user32 name 'GetDC';
      function GetDC(hWnd: HWND): HDC; stdcall;


    Если я хочу вывести, к примеру, текст на GetDesktopWindow, мне нужно пользоваться GetWindowDC. Если я пользуюсь GetDC, то для того чтобы текст появился на экране нужно или выгрузить окно FindWindow('Progman','Program Manager')(Окно с иконками и панель задач, которое распологается поверх GetDesktopWindow) или использовать GetDC(GetWindow(GetDesktopWindow, GW_OWNER))(окно с хендл 0(что за окно кстати???)).
      ExpandedWrap disabled
        // Получить DC клиентской области окна по его хэндлу
        function GetDC;
        {
        Функция GetDC извлекает дескриптор контекста дисплея для клиентской области указанного окна. Контекст дисплея может быть использован в последующих функциях GDI для рисования в клиентской области окна.
         
        Эта функция извлекает общий, классовый или частный контекст устройства в зависимости от стиля класса, указанного для заданного окна. Для общих контекстов устройства GetDC присваивает контексту атрибуты по умолчанию каждый раз при извлечении контекста   устройства. Для классовых и частных контекстов устройства GetDC оставляет ранее присвоенные атрибуты без изменений.
        }
         
         
        // Получить DC всего окна (включая его заголовок, меню, скроллбары и т.д.) по его хэндлу
        function GetWindowDC;
        {
        предназначена для получения контекста окна, включая заголовок, меню, скроллбары, т.е. получив контекст с помощью этой функции можно рисовать в НЕклиентской области окна. Функция
        }
         
        // Освободить DC, ранее полученный по GetDC или GetWindowDC
        function ReleaseDC;

      -------------------------------> GetDC(0)
      Дескриптор 0 а по техническому Windows Handle = 0 мы получаем контекст полностью всех окон как один глобальный
      другими словами Мы можем рисовать прямо на монитореб, конечно это только для GetDC.
      Тут уже от тебя зависит что тебе использовать GetDC или GetWindowDC
        Цитата NikNet_ @
        Получить DC всего окна

        Понятно. А что тогда понимается под "клиентская область окна"?
          ^D^ima, это все, что не входит в служебную (неклиентскую область). Служебная - это заголовок, бордюры, меню, скроллбары и т.д. Все что осталось предназначено для пользовательских целей и называется клиентская область.
            Цитата Rose @
            Все что осталось

            Ну тогда получается что сама область должна иметь разные разммеры? А при выводе что 1-й что 2-й функцией текст выводится в 1 месте.
              Цитата
              Ну тогда получается что сама область должна иметь разные разммеры?

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

              Цитата
              А при выводе что 1-й что 2-й функцией текст выводится в 1 месте.

              Для Desktop-а - скорее всего, так как верхний левый угол клиентской и полной области окна совпадают. А для формы, например, уже нет:

              ExpandedWrap disabled
                procedure TForm1.FormPaint(Sender: TObject);
                var
                  DC: HDC;
                begin
                  DC:=GetDC(Handle);
                  try
                    TextOut(DC,100,100,'aaa',3);
                  finally
                    ReleaseDC(Handle,DC);
                  end;
                  DC:=GetWindowDC(Handle);
                  try
                    TextOut(DC,100,100,'aaa',3);
                  finally
                    ReleaseDC(Handle,DC);
                  end;
                end;

              Текст, выведенный во втором случае, будет смещен вниз на высоту заголовка окна, и вправо - на ширину бокового бордюра.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0.0845 ]   [ 16 queries used ]   [ Generated: 24.08.26, 08:44 GMT ]