怎样在内存中用256色小图(32X32)做鼠标的光标

symansoft 2000-05-18 09:44:00
请问各位高人:
我在一Form中有10个TImage对象,现欲实现如下功能:
1)用鼠标单击某个TImage时,鼠标的光标立刻由该图象替代,可以在表单上到处移动。
2)鼠标移出该表单时鼠标又变成箭头。


请问我该怎样实现呢?请赐教!


...全文
302 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
symansoft 2000-06-02
  • 打赏
  • 举报
回复

256色自定义光标我已经实现,但有一点不满意,就是自画光标图案(比如一只彩球)四周的背景色是白色,而不是Form的颜色,请问如何解决这个问题呢?谢谢!


symansoft 2000-05-31
  • 打赏
  • 举报
回复

再次感谢Lin的不厌其烦的答复。现在问题的焦点转变为怎样把超级图标软件制作出的256色或真彩色图标的光标资源*.cur编译成*.res文件,看样子本期问题基本上解决了。
Lin 2000-05-29
  • 打赏
  • 举报
回复
1、手工编辑一个RC文件,例如Test.RC,包含以下内容:
...
1000 CURSOR "Test.cur"
...
2、将Test.rc加入到工程;
3、在使用时用LoadImage API,不要用LoadCursor:
Screen.Cursors[1] := LoadImage(hInstance, MakeIntResource(1000), IMAGE_CURSOR, 32, 32, LR_DEFAULTCOLOR);
Button5.Cursor := 1;
4、祝你成功。
symansoft 2000-05-29
  • 打赏
  • 举报
回复

Lin,我今天试用了一下你所建议的超级图标工具,功能确实强大,但有个问题,比如用它制作的光标资源*.Cur在用Borland提供的Brc32编译成*.res时却遇到“Invalid cursor format”的错误(请参看....\examples\game\swat\readme.txt),请问你如何使用的?
Lin 2000-05-28
  • 打赏
  • 举报
回复
symansoft:
自定义光标序号也不一定非要从5开始,如果你看看系统光标的预定义值,它们是从-22到0,所以,自定义光标只要大于0就可以了。
symansoft 2000-05-28
  • 打赏
  • 举报
回复

首先,感谢Lin提供了一个好软件!
关于本期问题的来由,我想做如下详细说明:
我空闲时间想设计一个象棋软件,其中32个棋子用32个TImage对象,每个棋子的Picture属性是32X32的256色BMP文件,同兵种第二个棋子的Picture从第一个中复制(比如第一只车是ChessmanRC1)如:
ChessmanRC2->Picture->Assign(ChessmanRC1->Picture);
奇怪的是,程序运行时,用鼠标拖动ChessmanRC1到ChessmanRC2上时,并不覆盖ChessmanRC2,反而钻到ChessmanRC2下面去了。没办法,只好寄希望于把棋子的Picture取代鼠标的光标,可以拖到任何地方。
我参看了Borland提供的例子游戏Swat,其中自定义光标部分如下:
Screen->Cursors[crMaletUp] = LoadCursor(HInstance, "Malet");
Screen->Cursors[crMaletDown] = LoadCursor(HInstance, "MaletDown");
上面crMaletU为5,crMaletDown为6,我不明白自定义光标序号一定要从5开始,麻烦Lin总结以下好吗?
Lin 2000-05-28
  • 打赏
  • 举报
回复
关于“程序运行时,用鼠标拖动ChessmanRC1到ChessmanRC2上时,并不覆盖ChessmanRC2,反而钻到ChessmanRC2下面去了”,是不是可以这样解决(我没有BCB++,没法子试):ChessmanRC1->BringToFront();
symansoft 2000-05-24
  • 打赏
  • 举报
回复

Lin君回答的非常好,使人茅塞顿开,不过我还得咀嚼一下。如果你提到的那个能取代Borland的ImageEdit的工具不大的话,能否直接寄给我,或告诉我其下载地址?
Lin 2000-05-24
  • 打赏
  • 举报
回复
symansoft:
按照我的理解,Cursor也是一个Icon,所以凡是用到彩色Cursor的地方,都可以用Icon取代,不过,热点位置只能是(0,0),这可能是Icon和Cursor的区别所在。
TIcon允许256色甚至是TrueColor,不过不能使用Borland提供的ImagEdit,得使用其他的工具(如果需要,我可以提供,它还可以编辑ANI文件哦)。在载入的时候,使用LoadImage而不要使用LoadIcon按照我的理解,LoadBitmap、LoadIcon、LoadCursor都将被LoadImage取代。
TIcon应该包含两个TBitmap,一个与,一个或,所以不能将一个TBitmap直接Assign给一个TIcon对象。
symansoft 2000-05-23
  • 打赏
  • 举报
回复
对不起,这几天上网线路不畅,让各位久等了.

我比较同意Lin的看法,我后来查看了帮助文件,发现TImage对象中有TIcon,且TIcon对象也包含TBitmap对象,是否可以用Assign()方法把32X32的位图直接copy到TIcon对象中,不知TIcon是否允许256色,Borland提供的图标制作工具好象只允许16色.请问我的想法是否可行?

Lin 2000-05-19
  • 打赏
  • 举报
回复
你的TImage最好包含是Icon,假设你的表单为TDBGrid DBGrid1:
1、用鼠标单击某个TImage时,鼠标的光标立刻由该图象替代,可以在表单上到处移动。
在Image的OnClick事件中加入:
...
//此处的1为一代表值,只要大于0即可,以免替换掉系统缺省的光标
Screen.Cursors[1] := (Sender as TImage).Picture.Icon.Handle;
DBGrid1.Cursor := 1;
...

2、It's OK,试试看?
kxy 2000-05-19
  • 打赏
  • 举报
回复
把鼠标隐藏,在鼠标的位置画上你的图,然后,鼠标移动到哪里,你就画在哪里:)

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧