Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про GetDC   Найти похожие ветки 

 
Суслик ©   (2005-09-02 19:01) [0]

Есть следующая подпрограмма:

function GetMaxStringsWidth(const aFont: TFont;
  const aStrs: array of String): Integer;
var
  kDC: HDC;
  kCanvas: TCanvas;
begin
  kDC := GetDC(0);
  try
     kCanvas := TCanvas.Create();
     try
        kCanvas.Handle := kDC;
        kCanvas.Font := aFont;
        Result := 0;
        for kI := 0 to High(aStrs) do
        begin
           kW := kCanvas.TextWidth(aStrs[kI]);
           if kW > Result then
              Result := kW;
        end
     finally
        kCanvas.Free();
     end;
  finally
     ReleaseDC(0, kDC);
  end;
end;


Есть ли что-то некорректное в таком использовании DC мимо VCL?


 
Турист   (2005-09-03 10:33) [1]

>Суслик ©   (02.09.05 19:01)  

В общем случае, наверно, некорректно. Пара необъявленных переменных, при уничтожении TCanvas VCL выполнит TCanvas.DeselectHandles;


   ...
   SelectObject(FHandle, StockPen);
   SelectObject(FHandle, StockBrush);
   SelectObject(FHandle, StockFont);
   ...


т.е. "испортятся" старые Pen, Brush, Font

Пример из Forms.pas,


...
             Canvas := TControlCanvas.Create;
             with Canvas do
             try
               SaveIndex := SaveDC(hDC);
               try
                 Handle := hDC;
                 Font := Screen.MenuFont;
                 Menus.DrawMenuItem(MenuItem, Canvas, rcItem,
                   TOwnerDrawState(LongRec(itemState).Lo));
               finally
                 Handle := 0;
                 RestoreDC(hDC, SaveIndex)
               end;
             finally
               Free;
             end;
...


 
MBo ©   (2005-09-03 17:41) [2]

>т.е. "испортятся" старые Pen, Brush, Font
неа...
При GetDC в полученном контексте они стоят по умолчанию, так что портить особо нечего


 
Турист   (2005-09-03 17:50) [3]

>MBo ©   (03.09.05 17:41) [2]
Думаете SaveDC, RestoreDC не нужны ?


 
Турист   (2005-09-03 18:13) [4]

>MBo ©   (03.09.05 17:41) [2]


procedure TForm1.Button1Click(Sender: TObject);
var
 kDC: HDC;
 kCanvas: TCanvas;
 CurrentBrush, CurrentPen, CurrentFont: HGDIOBJ;
 SaveIndex: Integer;
begin
 kDC := GetDC(0);
 try
//    SaveIndex := SaveDC(kDC);
   try
     CurrentBrush := GetCurrentObject(kDC, OBJ_BRUSH);
     CurrentPen   := GetCurrentObject(kDC, OBJ_PEN);
     CurrentFont  := GetCurrentObject(kDC, OBJ_FONT);
     kCanvas := TCanvas.Create();
     try
       kCanvas.Handle := kDC;
       kCanvas.Font := Font;
       ShowMessage(IntToStr(kCanvas.TextWidth("123")))
     finally
       kCanvas.Free
     end;
   finally
//      RestoreDC(kDC, SaveIndex)
   end;
   if CurrentBrush = GetCurrentObject(kDC, OBJ_BRUSH) then
     ShowMessage("Brush OK")
   else
     ShowMessage("Brush Fail");
   if CurrentPen   = GetCurrentObject(kDC, OBJ_PEN) then
     ShowMessage("Pen OK")
   else
     ShowMessage("Pen Fail");
   if CurrentFont  = GetCurrentObject(kDC, OBJ_FONT) then
     ShowMessage("Font OK")
   else
     ShowMessage("Font Fail")
 finally
   ReleaseDC(0, kDC)
 end
end;


 
Суслик ©   (2005-09-04 10:48) [5]

В действительности исходный код из моего проекта. Работает не первый год.

Сейчас я провожу модернизацию проекта (переход на runtime пакеты). В связи с этим пересматриваю все библиотеки общего назначения. В том числе и указанный код. Он достался мне в наследство еще давно-давно.

Я совсем не разбираюсь в DC на уровне WinApi, а тем более в комбинации WinApi+VCL в области DC. Поэтому весь такой код, да еще и писанный не мной, у меня вызывает опасения.

Просветите, кто точно знает :)


 
Суслик ©   (2005-09-06 14:40) [6]

up :)


 
Игорь Шевченко ©   (2005-09-08 11:14) [7]


>   finally
>         kCanvas.Free();
>      end;


  finally
    kCanvas.Handle := 0;
    kCanvas.Free();
  end;



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.042 c
2-1130174344
sam07
2005-10-24 21:19
2005.11.13
API функции


2-1129572350
eagle_ua
2005-10-17 22:05
2005.11.13
Как создать объект в Delhpi?


14-1129729148
oldman
2005-10-19 17:39
2005.11.13
Это форум глючит, или мой комп?


14-1130135274
vok
2005-10-24 10:27
2005.11.13
Пропал ребенок!


4-1126693655
Still Swamp
2005-09-14 14:27
2005.11.13
Надо в CallBack API функции передать метод TObject





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский