请教用过DelphiX的兄弟(100分)

  • 主题发起人 主题发起人 Nutty
  • 开始时间 开始时间
N

Nutty

Unregistered / Unconfirmed
GUEST, unregistred user!
在下用dxdraw.surface.fill(devcolor: longint)初始化背景色,
然而这个longint的devcolor我不知该如何赋值.

现象:
查看其定义,可以用RGB颜色来表示,但当我想要背景为绿色时,
执行dxdraw.surface.fill(RGB(0,128,0))却得到紫色背景!
 
dxdraw.surface.fill(RGB(0,255,0));
 
也即是说
值域为 -7FFFFFFE----7FFFFFFF 的TColor色与
定义值域为 0----FFFFFFFF 的dev色之间如何进行转换?
 
wjiachun兄:
不是这样...
dxdraw.surface.fill(clgreen)得到的是紫色背景...faint
 
I faint too!
 
值域为 -7FFFFFFE----7FFFFFFF 的TColor色与
定义值域为 0----FFFFFFFF 的dev色之间如何进行转换?
>>
没用过 DelphiX, 转换可用:
function ColorToRGB(Color: TColor): Longint;

>>附例子中的调用,不知有没有帮助:
var Col: TRGBQuad;
c := DXDraw.Surface.ColorMatch(RGB(Col.rgbRed, Col.rgbGreen, Col.rgbBlue));
DXDraw.Surface.Fill(c);
 
还是不行,难道它用的颜色的末六个字节不代表RGB? 还是调色板没用对?
 
Col参数实际上就是象素在内存中的数据,它的值取决于TDXDraw控件的
Surface.BitCount的值。当BitCount为8时,每个象素用1byte表示(8位),
这时Col参数实际上是一个调色板的索引值,只使用最后8位(0至255)。
当BitCount为24时,每个象素用3byte表示,这时Col的末六个字节才是代表
RGB三色的量。估计你用的是640X480X16等16位的显示模式(看一下DXDraw的
Display属性就知道了),这时Col参数中用后15位表示RGB三色的分量,每一
色为5位,所以你用$00FF00无法显示出绿色。你可以根据你的需要用位操作来
产生出16位显示模式下的Col值。
 
怎么不行呢,我用过行得
 
确实是设成24bits真彩才正确显示颜色, Zephyr兄果然了得...

但是用户如果设置window的颜色为16或8bits时又怎么办呢? 再用RGB(r,g,b)填色又会乱显示了.我记得论坛有过讨论,但不了了之,你有好办法吗?



 
根据实际情况来计算颜色值(就是说先判断当前显示模式,再根据当前显示模
式下象素的格式计算颜色值)。或者让你的程序在全屏方式下运行,但要事先
把TDXDraw的Display属性设为24bits的显示模式,这样在切换到全屏方式下时
会用Display属性指定的显示模式运行。具体如何做可参考DelphiX的例子。

也许(应该)还有更好的方法。
 
如何用DIRECTDRAW显示真彩色的图片,我只能显示256色的图片,用SETDISPLAYMODE设置(800,600,8)
再设置成(800,600,24)真彩色模式的时候就出现错误。能有办法吗?
 

Similar threads

I
回复
0
查看
748
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
594
import
I
I
回复
0
查看
684
import
I
后退
顶部