Главная страница
    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.04 c
11-1109269615
rofl
2005-02-24 21:26
2005.11.13
KOLMediaPlayer SendCommand


6-1121961178
Hkr
2005-07-21 19:52
2005.11.13
Программирование NetBIOS


3-1128347433
Антон1209
2005-10-03 17:50
2005.11.13
параметры TSQLDataSet


2-1129442715
serg128
2005-10-16 10:05
2005.11.13
Как заменить первую маленькую букву на большую?


1-1129828333
Dwen
2005-10-20 21:12
2005.11.13
создание и распечатка таблицы из memo





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский