Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Название:Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание
…начиная с 1001. Смотрите другие файлы…
Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Комментарии:
Функция рисует тень сложной формы на форме 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
propertyCanvas;
end;
У меня есть маленькое замечание.
Если у объекта нет свойства Canvas (у TDBEdit вроде-бы нет), то, по крайней меpе в D3, можно использовать класс TControlCanvas. Примерное использование:
var
cc: TControlCanvas;
…
cc := TControlCanvas.Create;
cc.Control := yourControl;
…
и далее как обычно можно использовать методы Canvas.
Как мне из Handle битовой картинки, получить адрес битового изображения в памяти?
Nomadicсоветует:
Вот кусок одного моего класса, в котором есть две интересные вещицы — проецирование файлов в память и работа с битмэпом в памяти через указатель.
Сразу оговорюсь, что все это работает только под Win95/NT.
type
TarrRGBTriple= array[byte] ofTRGBTriple;
ParrRGBTriple=^TarrRGBTriple;
{организует битмэп размером SX,SY;true_color}
procedureTMBitmap.Allocate(SX,SY:integer);
varDC:HDC;
begin
ifBM<>0 thenDeleteObject(BM); {удаляем старый битмэп, если был}
BM:=0;
PB:= nil;
fillchar(BI,sizeof(BI),0);
withBI.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 shl2); {размер строки(кратна 4 байтам)}
if(biWidth orbiHeight)<>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 получаем указатель на битмэп-----^^}
ifBM=0 thenError('error creating DIB');
end;
end;
end;
{эта процедура загружает из файла true-color'ный битмэп}
procedureTMBitmap.LoadFromFile( constFileName: 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 orfmShareDenyWrite);
ifHF<0 thenError('open file '''+FileName+'''');
try
{создаем объект-проецируемый файл}
HM:=CreateFileMapping(HF, nil,PAGE_READONLY,0,0, nil);
ifHM=0 thenError('can''t create file mapping');
try
{собственно проецируем объект в адресное }
PF:=MapViewOfFile(HM,FILE_MAP_READ,0,0,0);
{получаем указатель на область памяти, в которую спроецирован файл}
ifPF= nil thenError('can''t create map view of file');
try
{работаем с файлом как с областью памяти через указатель PF}
ifPBitmapFileHeader(PF)^.bfType<>$4D42 thenError('file format');
Ofs:=PBitmapFileHeader(PF)^.bfOffBits;
withPBitmapInfo(PF+sizeof(TBitmapFileHeader))^.bmiHeader do begin
if(biSize<>40) or(biPlanes<>1) thenError('file format');
if(biCompression<>BI_RGB) or(biBitCount<>24) thenError('only true-color BMP supported');
{выделяем память под битмэп}
Allocate(biWidth,biHeight);
end;
forj:=0 toBI.bmiHeader.biHeight-1 do
fori:=0 toBI.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}
functionTMBitmap.GetPixel(X,Y:integer):PRGB;
begin
if(X>=0) and(Xand(Y>=0) and(Ythen
Result:=PRGB(PB+(Y)*FLineSize+X*3)
elseResult:=PRGB(PB);
end;
Если у вас на форме есть компонент TImage, то можно сделать так:
varBMP: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): Залить фон битмапа синим цветом.
Читать дальшеИнтервал:
Закладка: