编程日记(45) 梁肇新 2001年 45期 2000年2月21日 星期一 晴   今天的工作计划是生成E-mail和实现剪贴板功能。这个问题在上周末就提出来了,经过周末的仔细思考和今天的编程实践,总算实现了。小伙子们都很高兴,我也一样!   在《豪杰大眼睛》的功能设计中,须要加入直接把图像用电子邮件发送出去功能。而在系统右键菜单中生成的SendTo(发送到)功能是非常有用的,但IconTextMenu中却没有。经过分析,发现在发送电子邮件的时候,要使用MAPI的接口来完成。因此我们决定使用Outlook的功能,由MAPI自动完成。这样,就实现了发送E-mail的基本处理。   由于涉及了SendTo功能,它是系统鼠标右键产生的一个子菜单,可以把所选中的文件或文件夹“发送到”桌面、软驱等位置。《豪杰大眼睛》中的鼠标右键菜单和系统要保持一致,但是取到的SendTo只是一个空项,没有任何反应。由于对于SendTo的许多处理还不是很熟悉,必须在实践中试验出来。在菜单上要自动定义发送功能,应该是用Shell的执行处理。我们发现SendTo系统目录的ShellFolder对象不是Shell的执行处理。因为把SendTo的源拖放于“执行”上并不能执行该操作。   至于剪贴板的实现,把图像放入剪贴板就可以从其他软件如“画笔”中取得这个图像。要想图像进入剪贴板必须用到GlobalAlloc()来分配。而且剪贴板中的图像还分为DIB格式和HBITMAP格式。由于DIB格式是与设备无关的位图,所以可以直接把要显示图像的全图或缩略图装入剪切板中。而且分成HIFI色彩和显示色彩两种方式。   剪切板接受GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE)的内存句柄而不是内存指针。对DIB图剪切板不支持正向位图,即BMPINFO中的高度不能为负数,否则接收端会提示格式有问题。   与设备有关的图像不用DIB方式。DIB方式只能是32或24位图比较合适,与显示有关的图像使用HBITMAP方式。但是如果当前的显示是256色,那么真彩图像就只是256色,无法放入真彩的图像。所以为了减少不必要的程序,不使用与显示有关的剪贴板,也就不需要试验HBITMAP方式了。