MFC,自定义光标大小问题求助

preciousboy 2009-05-11 05:34:55
在实际应用中,我需要用到大光标,可是MFC的自定义中最大也只是32×32,请问谁知道怎么设置更大的光标,比如128×128大小的,谢谢!
...全文
556 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
preciousboy 2009-05-17
  • 打赏
  • 举报
回复
zhangyan_wt,我用了你提供的做,感觉不是很方便,能不能说说怎么自己手动画光标?谢谢呀
preciousboy 2009-05-16
  • 打赏
  • 举报
回复
我想到了解决方法了,谢谢!
preciousboy 2009-05-16
  • 打赏
  • 举报
回复
这几天没上网,今天看到你的回复,很感谢,你的代码我已经看明白,并能自己在你的基础上修改成为一个细光标了。
但我把光标指向按键时候就又变回原来的箭头了,你再看看,我应该在怎么修改,麻烦你了
preciousboy 2009-05-13
  • 打赏
  • 举报
回复
谢谢zhangyan_wt,上面的程序我运行通过了,但是我想要自己定义一个128×128的十字光标,不知道怎么设置里面的参数,我就知道这两个:CURSOR width;cursor height 。对于ANDmaskCursor, XORmaskCursor ,我不知道怎么设置。麻烦大家给些建议啊,谢谢了!
zhangyan_wt 2009-05-13
  • 打赏
  • 举报
回复
ANDmaskCursor和XORmaskCursor 实际上是两个二值图像。

例子中32*32的光标,数组长度为32*32/8 = 32*4 = 128;
如果是128*128的光标,数组长为128*128/8 = 128*16= 2048,
这两个数组要和一个128*128的点阵进行对应
点阵里第i行第j列个点,和数组的第i行第j/8个字节的第j%8个bit对应

光标的图像,实际上分为3种状态,黑色,白色,透明色。楼主要先把这个图标的图形画好,知道每个点是黑色白色或者透明。
对于透明的点,And数组上对应的bit置1, Xor数组上置0
对于黑色的点,And数组上对应的bit置0, Xor数组上置0
对于白色的点,And数组上对应的bit置0, Xor数组上置1

下面的代码画了一个大黑十字,如果再想漂亮些,自己动手画吧。

HCURSOR hCurs;
BYTE ANDmaskCursor[2048] ={0};
BYTE XORmaskCursor[2048]={0};
int i;
memset(ANDmaskCursor, 0xff, 2048);
for(i = 0; i < 127; i++)
{
ANDmaskCursor[7 + i * 16] = 0;
ANDmaskCursor[8 + i * 16] = 0;
}
for(i = 56*16; i < 72*16; i++)
ANDmaskCursor[i] = 0;

hCurs = CreateCursor( NULL, // app. instance
64, // horizontal position of hot spot
64, // vertical position of hot spot
128, // cursor width
128, // cursor height
ANDmaskCursor, // AND mask
XORmaskCursor ); // XOR mask

SetCursor( hCurs);
oysoft 2009-05-12
  • 打赏
  • 举报
回复
正确,我干过,没有问题的
[Quote=引用 3 楼 zhangyan_wt 的回复:]
CreateCursor 可以指定光标大小,我试过了,至少128*128的没问题。
[/Quote]
zhangyan_wt 2009-05-12
  • 打赏
  • 举报
回复
CreateCursor 可以指定光标大小,我试过了,至少128*128的没问题。
zhangyan_wt 2009-05-12
  • 打赏
  • 举报
回复
MSDN上有例子代码

这是一个太极图标。


BYTE ANDmaskCursor[] =
{
0xFF, 0xFC, 0x3F, 0xFF, // line 1
0xFF, 0xC0, 0x1F, 0xFF, // line 2
0xFF, 0x00, 0x3F, 0xFF, // line 3
0xFE, 0x00, 0xFF, 0xFF, // line 4

0xF7, 0x01, 0xFF, 0xFF, // line 5
0xF0, 0x03, 0xFF, 0xFF, // line 6
0xF0, 0x03, 0xFF, 0xFF, // line 7
0xE0, 0x07, 0xFF, 0xFF, // line 8

0xC0, 0x07, 0xFF, 0xFF, // line 9
0xC0, 0x0F, 0xFF, 0xFF, // line 10
0x80, 0x0F, 0xFF, 0xFF, // line 11
0x80, 0x0F, 0xFF, 0xFF, // line 12

0x80, 0x07, 0xFF, 0xFF, // line 13
0x00, 0x07, 0xFF, 0xFF, // line 14
0x00, 0x03, 0xFF, 0xFF, // line 15
0x00, 0x00, 0xFF, 0xFF, // line 16

0x00, 0x00, 0x7F, 0xFF, // line 17
0x00, 0x00, 0x1F, 0xFF, // line 18
0x00, 0x00, 0x0F, 0xFF, // line 19
0x80, 0x00, 0x0F, 0xFF, // line 20

0x80, 0x00, 0x07, 0xFF, // line 21
0x80, 0x00, 0x07, 0xFF, // line 22
0xC0, 0x00, 0x07, 0xFF, // line 23
0xC0, 0x00, 0x0F, 0xFF, // line 24

0xE0, 0x00, 0x0F, 0xFF, // line 25
0xF0, 0x00, 0x1F, 0xFF, // line 26
0xF0, 0x00, 0x1F, 0xFF, // line 27
0xF8, 0x00, 0x3F, 0xFF, // line 28

0xFE, 0x00, 0x7F, 0xFF, // line 29
0xFF, 0x00, 0xFF, 0xFF, // line 30
0xFF, 0xC3, 0xFF, 0xFF, // line 31
0xFF, 0xFF, 0xFF, 0xFF // line 32
};

// Yin-shaped cursor XOR mask

BYTE XORmaskCursor[] =
{
0x00, 0x00, 0x00, 0x00, // line 1
0x00, 0x03, 0xC0, 0x00, // line 2
0x00, 0x3F, 0x00, 0x00, // line 3
0x00, 0xFE, 0x00, 0x00, // line 4

0x0E, 0xFC, 0x00, 0x00, // line 5
0x07, 0xF8, 0x00, 0x00, // line 6
0x07, 0xF8, 0x00, 0x00, // line 7
0x0F, 0xF0, 0x00, 0x00, // line 8

0x1F, 0xF0, 0x00, 0x00, // line 9
0x1F, 0xE0, 0x00, 0x00, // line 10
0x3F, 0xE0, 0x00, 0x00, // line 11
0x3F, 0xE0, 0x00, 0x00, // line 12

0x3F, 0xF0, 0x00, 0x00, // line 13
0x7F, 0xF0, 0x00, 0x00, // line 14
0x7F, 0xF8, 0x00, 0x00, // line 15
0x7F, 0xFC, 0x00, 0x00, // line 16

0x7F, 0xFF, 0x00, 0x00, // line 17
0x7F, 0xFF, 0x80, 0x00, // line 18
0x7F, 0xFF, 0xE0, 0x00, // line 19
0x3F, 0xFF, 0xE0, 0x00, // line 20

0x3F, 0xC7, 0xF0, 0x00, // line 21
0x3F, 0x83, 0xF0, 0x00, // line 22
0x1F, 0x83, 0xF0, 0x00, // line 23
0x1F, 0x83, 0xE0, 0x00, // line 24

0x0F, 0xC7, 0xE0, 0x00, // line 25
0x07, 0xFF, 0xC0, 0x00, // line 26
0x07, 0xFF, 0xC0, 0x00, // line 27
0x01, 0xFF, 0x80, 0x00, // line 28

0x00, 0xFF, 0x00, 0x00, // line 29
0x00, 0x3C, 0x00, 0x00, // line 30
0x00, 0x00, 0x00, 0x00, // line 31
0x00, 0x00, 0x00, 0x00 // line 32
};

// Create a custom cursor at run time.

hCurs = CreateCursor( NULL, // app. instance
19, // horizontal position of hot spot
2, // vertical position of hot spot
32, // cursor width
32, // cursor height
ANDmaskCursor, // AND mask
XORmaskCursor ); // XOR mask

SetCursor( hCurs);
preciousboy 2009-05-12
  • 打赏
  • 举报
回复
谢谢回复,我刚接触MFC不久,看了msdn,不知道应该怎么应用CreateCursor 这个函数,能不能帖段代码上来
preciousboy 2009-05-11
  • 打赏
  • 举报
回复
谢谢你的回复,CreateCursor 我没用过,不过我用SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));但最大只能是32×32,CreateCursor 是不是也是最大只能是32×32?
zhangyan_wt 2009-05-11
  • 打赏
  • 举报
回复
鼠标光标么? CreateCursor 可以指定高宽,但是具体的图形要自己填数据画进去

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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