Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров
0/0

Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Уважаемые читатели!
Тут можно читать бесплатно Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров. Жанр: Программирование. Так же Вы можете читать полную версию (весь текст) онлайн книги без регистрации и SMS на сайте Knigi-online.info (книги онлайн) или прочесть краткое содержание, описание, предисловие (аннотацию) от автора и ознакомиться с отзывами (комментариями) о произведении.
Описание онлайн-книги Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров:
…начиная с 1001. Смотрите другие файлы…
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать

 Dst := Rect(0, 0, OffScreen.Width, OffScreen.Height);

 OffsetRgn(ShadeRgn, 0, –RgnBox.Top);

 FillRgn(OffScreen.Canvas.Handle, ShadeRgn, Canvas.Brush.Handle);

 OffsetRgn(ShadeRgn, 0, RgnBox.Top);

 // BitBlt работает быстрее CopyRect

 BitBlt(OffScreen.Canvas.Handle, 0, 0, OffScreen.Width, OffScreen.Height, Canvas.Handle, RgnBox.Left, RgnBox.Top, SRCAND);

 Canvas.Brush.Color := clBlack;

 FillRgn(Canvas.Handle, ShadeRgn, Canvas.Brush.Handle);

 BitBlt(Canvas.Handle, RgnBox.Left, RgnBox.Top, OffScreen.Width, OffScreen.Height, OffScreen.Canvas.Handle, 0, 0, SRCPAINT);

 OffScreen.Free;

 Pattern.Free;

 OffsetRgn(ShadeRgn, –WDepth, –HDepth);

 ReleaseDC(Form1.Handle, Canvas.Handle);

 Canvas.Handle := hOldDC;

end;

Комментарии:

Функция рисует тень сложной формы на форме Form2 (извиняюсь за стиль). Для определения формы тени используется регион ShadeRgn, который был создан где-то раньше (например в OnCreate). Относительно регионов см. Win32 API. 

Как рисовать на органе управления, например, на TPanel?

Nomadic советует:

У всех компонентов, порожденных от TCustomControl, имеется свойство Canvas типа TCanvas.

Если свойство Canvas недоступно, Вы можете достучаться до него созданием потомка и переносом этого свойства в раздел Public.

{ Example. We recommend You to create this component through Component Wizard.

 In Delphi 1 it can be found as 'File|New Component…', and can be found

 as 'Component|New Component…' in Delphi 2 or above. }

type

 TcPanel = class(TPanel)

public

 property Canvas;

end;

У меня есть маленькое замечание.

Если у объекта нет свойства Canvas (у TDBEdit вроде-бы нет), то, по крайней меpе в D3, можно использовать класс TControlCanvas. Примерное использование:

var

 cc: TControlCanvas;

 …

 cc := TControlCanvas.Create;

 cc.Control := yourControl;

 …

и далее как обычно можно использовать методы Canvas.

Как мне из Handle битовой картинки, получить адрес битового изображения в памяти?

Nomadic советует:

Вот кусок одного моего класса, в котором есть две интересные вещицы — проецирование файлов в память и работа с битмэпом в памяти через указатель.

Сразу оговорюсь, что все это работает только под Win95/NT.

type

 TarrRGBTriple=array[byte] of TRGBTriple;

 ParrRGBTriple=^TarrRGBTriple;

{организует битмэп размером SX,SY;true_color}

procedure TMBitmap.Allocate(SX,SY:integer);

var DC:HDC;

begin

 if BM<>0 then DeleteObject(BM); {удаляем старый битмэп, если был}

 BM:=0;

 PB:=nil;

 fillchar(BI,sizeof(BI),0);

 with BI.bmiHeader do {заполняем структуру с параметрами битмэпа}

 begin

  biSize:=sizeof(BI.bmiHeader);

  biWidth:=SX;

  biHeight:=SY;

  biPlanes:=1;

  biBitCount:=24;

  biCompression:=BI_RGB;

  biSizeImage:=0;

  biXPelsPerMeter:=0;

  biYPelsPerMeter:=0;

  biClrUsed:=0;

  biClrImportant:=0;

  FLineSize:=(biWidth+1)*3 and (-1 shl 2); {размер строки(кратна 4 байтам)}

  if (biWidth or biHeight)<>0 then begin

   DC:=CreateDC('DISPLAY',nil,nil,nil);

   {замечательная функция (см.HELP), возвращает HBITMAP, позволяет сразу разместить выделяемый битмэп в спроецированном файле, что позволяет ускорять работу и экономить память при генерировании большого битмэпа}

   {!} BM:=CreateDIBSection(DC,BI, DIB_RGB_COLORS, pointer(PB), nil, 0);

   DeleteDC(DC); {в PB получаем указатель на битмэп-----^^}

   if BM=0 then Error('error creating DIB');

  end;

 end;

end;

{эта процедура загружает из файла true-color'ный битмэп}

procedure TMBitmap.LoadFromFile(const FileName:string);

var

 HF:integer; {file handle}

 HM:THandle; {file-mapping handle}

 PF:pchar; {pointer to file view in memory}

 i,j: integer;

 Ofs:integer;

begin

 {открываем файл}

 HF:=FileOpen(FileName,fmOpenRead or fmShareDenyWrite);

 if HF<0 then Error('open file '''+FileName+'''');

 try

  {создаем объект-проецируемый файл}

  HM:=CreateFileMapping(HF,nil,PAGE_READONLY,0,0,nil);

  if HM=0 then Error('can''t create file mapping');

  try

   {собственно проецируем объект в адресное }

   PF:=MapViewOfFile(HM,FILE_MAP_READ,0,0,0);

   {получаем указатель на область памяти, в которую спроецирован файл}

   if PF=nil then Error('can''t create map view of file');

   try

    {работаем с файлом как с областью памяти через указатель PF}

    if PBitmapFileHeader(PF)^.bfType<>$4D42 then Error('file format');

    Ofs:=PBitmapFileHeader(PF)^.bfOffBits;

    with PBitmapInfo(PF+sizeof(TBitmapFileHeader))^.bmiHeader do begin

     if (biSize<>40) or (biPlanes<>1) then Error('file format');

     if (biCompression<>BI_RGB) or (biBitCount<>24) then Error('only true-color BMP supported');

     {выделяем память под битмэп}

     Allocate(biWidth,biHeight);

    end;

    for j:=0 to BI.bmiHeader.biHeight-1 do

for i:=0 to BI.bmiHeader.biWidth-1 do

      {Pixels - это property, возвр. указатель на соотв. RGBTriple в битмэпе}

      Pixels[i,j]^.Tr:=ParrRGBTriple(PF+j*FLineSize+Ofs)^[i];

   finally

    UnmapViewOfFile(PF);

   end;

  finally

   CloseHandle(HM);

  end;

 finally

  FileClose(HF);

 end;

end;

{эта функция - реализация Pixels read}

function TMBitmap.GetPixel(X,Y:integer):PRGB;

begin

 if (X>=0) and (X<BI.bmiHeader.biWidth) and (Y>=0) and (Y<BI.bmiHeader.biHeight) then

 Result:=PRGB(PB+(Y)*FLineSize+X*3)

 else Result:=PRGB(PB);

end;

Если у вас на форме есть компонент TImage, то можно сделать так:

var BMP:TMBitmap;

B:TBitmap;

BMP.LoadFromFile();

B:=TBitmap.Create;

B.Handle:=BMP.Handle;

Image1.Picture.Bitmap:=B;

и загруженный битмэп появится на экране. 

Можно ли запустить OpenGL под Windows'95, и как поставлять его с программой?

Nomadic советует:

Надо сразу отметить, что для работы Microsoft OpenGL 1.1 требуется только наличие в системе двух динамических библиотек. Они различны для Windows 95 и для Windows NT. Они всегда инсталлируется вместе с системой, если эта система – Windows 95 OSR2 или более поздняя, или если это Windows NT. Однако, если Вы столкнулись с машиной, где OpenGL отсутствует (Windows 95 OSR1 и более ранние), то достаточно их взять из диcтpибyтива OSR2 (GLU32.DLL и OPENGL32.DLL) и записать в GetSystemDirectory – и запycкайте OpenGL-приложения на здоpовье.

Более эффективную реализацию OpenGL для Win32 от фирмы SGI я бы советовал стянуть с www.sgi.com или www.opengl.org (SGI OpenGL for Windows). Кроме того, оттуда же советую скачать дополнительную библиотеку функций-утилит, позволяющую упростить работу в OpenGL (GLUT). Возможно, что Вам понравится какой-нибудь API более высокого уровня, типа SCiTech MGL (www.scitechsoft.com). 

Как вывести на экран текст с 'красивым' обрезанием по длине (если текст не помещается на экране)?

Одной строкой 

Nomadic советует:

Используй вызов DrawTextEx, установив в параметре dwDTFormat значение DT_PATH_ELLIPSIS. 

При работе программ на Delphi 1 под Windows 95 в hicolor-режимах на иконках TBitBtn'ов обнаруживаются странные коричневые артефакты. Как от них избавиться?

Одной строкой 

Nomadic советует:

A: (AB): Залить фон битмапа синим цветом. 

Получение контекста устройства для элемента управления

Одной строкой

{Bitmap в TImage}

HDC := TImage.Picture.bitmap.canvas.handle;

DC – что нибудь с Canvas.handle 

Отладка 

Hard mode без перерыва II

Delphi 1 

ОПРЕДЕЛЕНИЕ: «hard mode» является режимом Windows, при которой не происходит никакой обработки сообщений. Это происходит при отрисовке меню или некоторых операциях ядра. Это означает, что в этом состоянии Delphi не может «заморозить» ваше приложение, не блокируя Windows. Обычно это возникает вследствие многочисленных вызовов SendMessage. В этом случае, для выхода из Hard mode, необходимо «встряхнуть» систему. Вполне достаточно, если ваш отладчик покажет вам системно-модальное окно (messagebox), говорящее вам о том, что вы находитесь в hard mode! Для этого попробуйте поставить дополнительный breakpoint (точку останова) на строчке, *предшествующей* вашему breakpoint. В этом случае вы получите предупреждение о том, что система находится в hard mode, и этот же диалог «вышибет» систему из этого состояния. При нажатии на OK, вторая точка останова сработает как положено.

На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий

Рейтинговые книги