初学delphiX ,想改变一下 DxDraw 的背景,于是找到了这篇文章
话题247821的标题是: 请教用过DelphiX的兄弟 (100分)
分类:图形图象
Nutty (2000-05-18 17:34:00) |
在下用dxdraw.surface.fill(devcolor: longint)初始化背景色, 然而这个longint的devcolor我不知该如何赋值.
现象: 查看其定义,可以用RGB颜色来表示,但当我想要背景为绿色时, 执行dxdraw.surface.fill(RGB(0,128,0))却得到紫色背景!
|
wjiachun (2000-05-18 17:55:00) |
dxdraw.surface.fill(RGB(0,255,0)); |
Nutty (2000-05-18 17:56:00) |
也即是说 值域为 -7FFFFFFE----7FFFFFFF 的TColor色与 定义值域为 0----FFFFFFFF 的dev色之间如何进行转换? |
Nutty (2000-05-18 17:58:00) |
wjiachun兄: 不是这样... dxdraw.surface.fill(clgreen)得到的是紫色背景...faint |
wjiachun (2000-05-18 18:07:00) |
I faint too! |
Croco (2000-05-18 18:08:00) |
值域为 -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);
|
Nutty (2000-05-19 22:52:00) |
还是不行,难道它用的颜色的末六个字节不代表RGB? 还是调色板没用对? |
Zephyr (2000-05-19 23:26:00) |
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值。 |
Fudei (2000-05-20) |
怎么不行呢,我用过行得 |
Nutty (2000-05-20 22:39:00) |
确实是设成24bits真彩才正确显示颜色, Zephyr兄果然了得...
但是用户如果设置window的颜色为16或8bits时又怎么办呢? 再用RGB(r,g,b)填色又会乱显示了.我记得论坛有过讨论,但不了了之,你有好办法吗?
|
Zephyr (2000-05-21 1:03:00) |
根据实际情况来计算颜色值(就是说先判断当前显示模式,再根据当前显示模 式下象素的格式计算颜色值)。或者让你的程序在全屏方式下运行,但要事先 把TDXDraw的Display属性设为24bits的显示模式,这样在切换到全屏方式下时 会用Display属性指定的显示模式运行。具体如何做可参考DelphiX的例子。
也许(应该)还有更好的方法。 |
Nutty (2000-05-22 1:24:00) |
谢谢 |
sunwork (2000-08-03 20:44:00) |
如何用DIRECTDRAW显示真彩色的图片,我只能显示256色的图片,用SETDISPLAYMODE设置(800,600,8) 再设置成(800,600,24)真彩色模式的时候就出现错误。能有办法吗?
|
Zephyr的回答最终被接受。