Delphi, Asm, C, WinAPI, PHP, ..., FAQ |
Добро пожаловать, гость ( Вход | Регистрация )
Delphi, Asm, C, WinAPI, PHP, ..., FAQ |
-=CHE@TER=- |
Jan 5 2007, 00:35
Сообщение
#1
|
Walter Sullivan Группа: Root Admin Сообщений: 1,361 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 314 раз(а) |
Delphi programs in API.
На английском. Очень подробно всё описано, плюс есть исходные коды готовых юнитов. Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял). |
-=CHE@TER=- |
May 1 2013, 11:54
Сообщение
#2
|
Walter Sullivan Группа: Root Admin Сообщений: 1,361 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 314 раз(а) |
Ну, ладно, пока никто с получением текста не помог - поделюсь другими своими интересными наработками...
1) Многие программы в Windows не работают с относительными путями. К примеру, как я уже говорил выше, чтобы функции [Get|Write]PrivateProfile*() работали как надо, а не сохраняли в %SystemRoot%, нужно либо указывать абсолютный путь, либо писать в начале ".\" перед именем файла. Однако, есть куда более серьёзные проблемы - например, при попытке открыть через OLE-объект документ Word или Excel, нужно обязательно указывать абсолютный путь до файла иначе труба. Кстати говоря, относительный путь может сыграть злую шутку - если, к примеру, имя файла для записи результата было указано как ".\filename.ext", то, когда программа сменит рабочий каталог через SetCurrentDirectory(), файл будет сохраняться не в то место где он был до этого, а в новый каталог, который только что стал текущим! И тут на выручку приходит WinAPI функция GetFullPathName(), документацию на которую рекомендую посмотреть на MSDN, а я только ограничусь примером, который из относительного пути делает абсолютный: CODE Function ExpandFullPath(FileName: String): String; Var P: PChar; Begin // get filename size (include null character) SetLength(result, GetFullPathName(PChar(FileName), 0, Nil, P)); // get full filename path GetFullPathName(PChar(FileName), Length(result), PChar(result), P); End; Сунуть в функцию можно что угодно (предоложим, что мы сейчас в C:\Folder): filename.ext => C:\Folder\filename.ext ..\..\filename.ext => C:\filename.ext C:\Folder\..\.\Folder\filename.ext => C:\Folder\filename.ext И так далее. Хочу заметить, что файл filename.ext, как и путь до него, не обязан существовать - функция работает только со входной строкой приделывая к ней текущий каталог. Чертовски удобно. 2) Не так часто меню обои на рабочем столе, последний раз делал это пару лет назад - сложно найти хорошие фото. Проблема тут в том, что часто фотографии леса, водопадов и гор красивые, но слишком яркие - белый текст ярлыков на них не видно, а тень Windows XP как-то криво отбрасывает, в результате чего текст становится абсолютно нечитаемым и приходится напрягать глаза. Включать непрозрачный фон для надписей не хочу, так как смотрится это весьма коряво. Пробовал было в PhotoShop 7 делать эфект фонарика, чтобы по краям фото яркость уменьшалась, но PS7 одновременно поднимает яркость в середине, из-за чего изображение в центре "выцветает". Попытка откалибрировать ни к чему хорошему не привела и тогда я написал свою утилиту (за 5 минут, так что она не особо оптимальна) для затемнения фото от центра к краям, где, обычно, иконки и распологаются. При этом центр не осветляется, а остаётся как прежде. Вот код - может ещё кому-нибудь пригодится. Можно сделать белый .BMP файл размером с экран и запустить: darkener white.bmp fade.bmp 0 Чтобы посмотреть как происходит затенение. Величина затенения (FadeValue) будет таковой только в самых удалённых от центра точках - т.е. в углах. CODE Program darkener; {$APPTYPE CONSOLE} Uses Windows, Graphics; Var I, J, X, Y: Integer; D, FadeVal: Longword; K, KK: Real; TB: TBitmap; Begin WriteLn('Image Darkener'); WriteLn('(c) CTPAX-X Team 2013'); WriteLn('http://www.CTPAX-X.org/'); WriteLn; If ParamCount <> 3 Then Begin WriteLn('Usage: darkener.exe input.bmp output.bmp FadeValue[0..255]'); Exit; End; J:=0; Val(ParamStr(3), I, J); If ((I < 0) Or (I > 255) Or (J <> 0)) Then Begin WriteLn('Invalid FadeValue[0..255]!'); Exit; End; Write('Working...'); FadeVal:=I; TB:=TBitmap.Create; TB.LoadFromFile(ParamStr(1)); X:=TB.Width Div 2; Y:=TB.Height Div 2; K:=(255 - FadeVal) / sqrt((X*X) + (Y*Y)); For J:=0 To TB.Height - 1 Do For I:=0 To TB.Width - 1 Do Begin D:=TB.Canvas.Pixels[I, J]; KK:=K * sqrt(((I - X)*(I - X)) + ((J - Y)*(J - Y))); KK:=255 - KK; D:=RGB( Trunc((GetRValue(D)/255)*KK), Trunc((GetGValue(D)/255)*KK), Trunc((GetBValue(D)/255)*KK) ); TB.Canvas.Pixels[I, J]:=D; End; TB.SaveToFile(ParamStr(2)); TB.Free; Write('done!'); WriteLn; End. 3) И, наконец, последнее чем хочу поделиться - файл для программ не работающих с маской из командной строки: do.bat CODE @echo off for %%a in (%2) do %1 "%%a" %3 %4 %5 %6 %7 %8 %9 Помещаем этот файл куда-нибудь в %PATH% (например в C:\Windows) и запускаем, к примеру, так: do pngout.exe *.bmp /c0 |
Упрощённая версия | Сейчас: 5th November 2024 - 17:22 |