Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Вопрос про 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 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.053 c
2-1130246477
syte_ser78
2005-10-25 17:21
2005.11.13
table.active


3-1128039182
DimonS
2005-09-30 04:13
2005.11.13
Как запретить вставку пустой строки?


2-1130156929
Alex7
2005-10-24 16:28
2005.11.13
Изменение свойств фрейма


3-1128496966
dreamse
2005-10-05 11:22
2005.11.13
Как получить результат запроса ADOQuery ?


2-1130168799
Profi
2005-10-24 19:46
2005.11.13
Зависание функции из модуля.