我想用alpha透明矩形和alpha透明图像绘制非常复杂的图像. 有来自Mitov的GDI +包装器,但它似乎不支持32位BMP文件加上它重新调整它们并且文档非常糟糕.BMP比PNG更快,所以我想使用它们. 有GDI +的SynGDI包装器,但它看起来很基本,没有它的文档.GDI还有这个技巧:
procedure DrawAlphaAPI(Source: TBitmap; Destination: TCanvas;
const X, Y: Integer; const Opacity: Byte = 255);
var BlendFunc: TBlendFunction;
begin
BlendFunc.BlendOp := AC_SRC_OVER;
BlendFunc.BlendFlags := 0;
BlendFunc.SourceConstantAlpha := Opacity;
if Source.PixelFormat = pf32bit then
BlendFunc.AlphaFormat := AC_SRC_ALPHA
else
BlendFunc.AlphaFormat := 0;
Windows.AlphaBlend(Destination.Handle, X, Y, Source.Width, Source.Height,
Source.Canvas.Handle, 0, 0, Source.Width, Source.Height, BlendFunc);
end;
Run Code Online (Sandbox Code Playgroud)
但是当我用Opacity = 255调用它时,它不能正确地绘制32位位图(就像它们应该是完全的半透明一样).我不想使用Scanline来使像素透明,因为这太复杂了,无法以这种方式绘制所有透明矩形.另外我在现代计算机上应该更快GDI +,我是对的吗?
所以问题是:如何轻松绘制alpha透明矩形和位图(没有大量的代码)?
首选Delphi:7.我也有2005和XE3,但由于7是速度恶魔,我最希望从7开始工作.
在Delphi XE3下安装组件是一场噩梦.
首先,我需要添加源文件
工具 - > 选项 - > 库
然后我需要找到一个普通的包并编译它
这非常繁琐且容易出错.有没有更好的方法来安装组件?
我找到了Delphi Package Installer.不幸的是它不支持Delphi XE3或更高版本.
我听说有类似的东西生产exe自己安装的软件包(类似于Inno Setup),但我找不到这样的东西.
我正在创建一个表格,桌面上有图标,可以自由移动.我有时甚至会显示500个或更多图标,因此需要快速工作.我的图标是:
TMyIcon = class(TGraphicControl)
所以它没有Windows句柄.图纸是:
- 1 x Canvas.Rectangle(大约64x32)
- 1 x Canvas.TextOut(比矩形小一点)
- 1 x Canvas.Draw(图片为32x32)
移动东西的代码是这样的:MyIconMouseMove:
Ico.Left := Ico.Left + X-ClickedPos.X;
Ico.Top := Ico.Top + Y-ClickedPos.Y;
Run Code Online (Sandbox Code Playgroud)
在表格上通常有50个左右的图标 - 其余的在可见区域之外.当我有100个图标时 - 我可以自由移动它并且它可以快速工作.但是,当我创建500个图标时,它会变得迟钝 - 但可见图标的数量仍然相同.如何告诉Windows完全忽略隐形图标,以便一切顺利进行?
或者也许有一个组件可以显示类似桌面的图标,能够移动它们?类似于使用AutoArrange = False的TShellListView?
我试图将hBitmap转换为字节数组,但我不想使用单位Graphics的TBitmap.我的输入图像是128x64x32bit.
var TheBits: array of array of Cardinal;
begin
with info.bmiHeader do begin
biWidth:=131;
biHeight:=64;
biSize:=SizeOf(TBITMAPINFOHEADER);
biCompression:=BI_RGB;
biBitCount:=32;
biPlanes:=1;
biSizeImage:=0;
end;
DC := CreateCompatibleDC(0);
SetLength(TheBits, 128, 64);
GetDIBits(DC, BmpHandle, 0, 64,@TheBits[0][0],Info,DIB_RGB_COLORS);
Run Code Online (Sandbox Code Playgroud)
这给了我一个很好的形象(当然是颠倒的),但我不得不把131放入biWidth,这对我来说并没有多大意义.为什么不能是128?
我有一个DLL将数据输出到流.但它添加了我不想要的后缀和前缀.我可以创建一个MemoryStream,让DLL输出数据然后修剪它,但是可以有几GB的数据,所以我只想将它直接保存到文件(FileStream).我认为最好的解决方案是创建自己的Stream类.所以我做了:
function TFileStream2.Write(const Buffer; Count: Integer): Longint;
Run Code Online (Sandbox Code Playgroud)
我检查位置,如果它是= 0,那么我从缓冲区丢弃前几个字节.这样我可以修剪文件的开头.但是,如何检测流的结束,以便从末尾丢弃一些字节?
是否可以生成一个字节数组,然后让Windows像普通代码一样执行它?假设我们有一些汇编代码:
inc ecx
Run Code Online (Sandbox Code Playgroud)
这是一个计划的一部分.在我们用Nasm编译之后,我们得到一个EXE,其中上面的行被转换成这样的东西:
00000035 41
Run Code Online (Sandbox Code Playgroud)
是否可以创建一个字节数组,用上面的字节填充它并执行 - 所以增量实际发生了?
我已经制作了超级简单的解释语言,但由于它被解释得很慢.我不想为它编写真正的编译器,但我想让它更快 - 编译并在运行中运行.
我使用ListBox.Style := lbOwnerDrawFixed有OnDrawItem:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState);
begin
with ListBox1.Canvas do begin
Brush.Color := clWhite;
Pen.Color := clWhite;
FillRect(ARect);
end;
end;
Run Code Online (Sandbox Code Playgroud)
它应该给出一个空的空间来绘制我想要的东西,但事实并非如此.当项目聚焦时,我仍然可以看到它周围的虚线矩形.
如何删除矩形?
我正在尝试使用gmail从Delphi发送电子邮件.我有Indy 10.5.9.0和Delphi XE3.
我从以下代码获得了示例代码:http: //www.andrecelestino.com/delphi-xe-envio-de-e-mail-com-componentes-indy/
我也尝试了其他示例代码,但结果相同.
我从这里有libeay32.dll和ssleay32.dll:http://www.andrecelestino.com/wp-content/files/DLLs-SSL-DelphiXE.rar 但我也尝试过:http: //indy.fulgan.com/ SSL/openssl-1.0.2d-i386-win32.zip 没有运气.
我的代码(全部):
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdMessage,
IdSMTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdText;
procedure TForm1.Button1Click(Sender: TObject);
var
// variáveis e objetos necessários para o envio
IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL;
IdSMTP: TIdSMTP;
IdMessage: TIdMessage;
IdText: TIdText;
sAnexo: string;
begin
// instanciação dos objetos
IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
IdSMTP := TIdSMTP.Create(Self);
IdMessage := …Run Code Online (Sandbox Code Playgroud) 我正在使用SoapClient获取一些数据.我从其中一个电话得到了这个结果:
stdClass Object
(
[payTransIncome] => stdClass Object
(
[item] => stdClass Object
(
[payTransId] => 141281
[payTransItId] => 630260
[payTransBuyerId] => 1311
)
)
)
Run Code Online (Sandbox Code Playgroud)
但是,这个WebAPI的文档说payTransIncome是一个数组.在我看来,SoapClient找到了一个单元素数组并将其转换为单个stdClass对象.这使得解析变得更加困难,因为有时我认为它实际上可能会返回超过1个元素.
当然,我可以把所有地方检查,if (is_array())但也许有一个简单,更优雅的方式?
在TSaveDialog中,我添加了两种具有相同扩展名的格式:
Format A|*.form
Format B|*.form
Format C|*.diff
Run Code Online (Sandbox Code Playgroud)
现在,我要确定用户选择的格式:
var Ext: String;
begin
if not SaveDialog1.Execute then Exit;
Ext := LowerCase(ExtractFileExt(SaveDialog1.FileName));
Run Code Online (Sandbox Code Playgroud)
这样我可以将“格式B”与“格式C”区分开来,但不能将“格式A”与“格式B”区分开。
delphi ×9
winapi ×2
assembly ×1
bitmap ×1
canvas ×1
compilation ×1
components ×1
delphi-xe3 ×1
eof ×1
file ×1
gdi+ ×1
gmail ×1
graphics ×1
hbitmap ×1
image ×1
indy ×1
installation ×1
interpreter ×1
listbox ×1
ownerdrawn ×1
php ×1
position ×1
save-dialog ×1
soap ×1
soap-client ×1
ssl ×1
stream ×1
tsavedialog ×1