如何自己做一个调色板(100分)

  • 主题发起人 主题发起人 老人家
  • 开始时间 开始时间

老人家

Unregistered / Unconfirmed
GUEST, unregistred user!
要有代吗,和算法说明。
谈谈这方面的知识也给分
谢谢各位了
 
是类似ColorDialog的东西吗?

他有源代码啊,虽然有错误,而且不漂亮;

但是可以参考
 
参考一下这里:
http://www.lzu.edu.cn/netteach/jiaochen/vc++5.0/vc++5.0/chap11/chap11_1.htm
 
CreatePalette负责创建逻辑调色板,该函数的声明为:

BOOL CreatePalette( LPLOGPALETTE lpLogPalette ); //成功则返回TRUE。

参数lpLogPalette是一个指向LPLOGPALETTE结构的指针,LPLOGPALETTE结构描述了逻辑调色板的内容,该结构的定义为:

typedef struct tagLOGPALETTE {

WORD palVersion; //Windows版本号,一般是0x300

WORD palNumEntries; //调色板中颜色表项的数目

PALETTEENTRY palPalEntry[1]; //每个表项的颜色和使用方法

} LOGPALETTE;

结构中最重要的成员是PALETTEENTRY数组,数组项的数目由palNumEntries成员指定。PALETTEENTRY结构对调色板的某一个颜色表项进行了描述,该结构的定义为:

typedef struct tagPALETTEENTRY {

BYTE peRed; //红色的强度(0~255,下同)

BYTE peGreen; //绿色的强度

BYTE peBlue; //蓝色的强度

BYTE peFlags;

} PALETTEENTRY;

成员peFlags说明了颜色表项的使用方法,在一般应用时为NULL
 
颜色是一个长整数
下面是对其值的变换//在Windows单元中
{ Translated from WINGDI.H }

function MakeROP4(fore, back: DWORD): DWORD;
begin
Result := ((back shl 8) and DWORD($FF000000)) or fore;
end;

function GetKValue(cmyk: COLORREF): Byte;
begin
Result := Byte(cmyk);
end;

function GetYValue(cmyk: COLORREF): Byte;
begin
Result := Byte(cmyk shr 8);
end;

function GetMValue(cmyk: COLORREF): Byte;
begin
Result := Byte(cmyk shr 16);
end;

function GetCValue(cmyk: COLORREF): Byte;
begin
Result := Byte(cmyk shr 24);
end;

function CMYK(c, m, y, k: Byte): COLORREF;
begin
Result := (k or (y shl 8) or (m shl 16) or (c shl 24));
end;

function RGB(r, g, b: Byte): COLORREF;
begin
Result := (r or (g shl 8) or (b shl 16));
end;

function PaletteRGB(r, g, b: Byte): COLORREF;
begin
Result := $02000000 or RGB(r,g,b);
end;

function PaletteIndex(i: Word): COLORREF;
begin
Result := $01000000 or i;
end;

function GetRValue(rgb: DWORD): Byte;
begin
Result := Byte(rgb);
end;

function GetGValue(rgb: DWORD): Byte;
begin
Result := Byte(rgb shr 8);
end;

function GetBValue(rgb: DWORD): Byte;
begin
Result := Byte(rgb shr 16);
end;
 
看看这个论坛 http://liuyj.tzo.com/liuyj
 
多人接受答案了。
 
后退
顶部