主要内容:增加了MessageOut类用来控制客户端文字输出的颜色和字体
所属部分:客户端 服务器端
邮件地址:changjixiong@gmail.com
在上一版中,客户端左上角,以及人物的信息输出的文字是这样的
我想把字弄成别的颜色,比如,红色,我用SetTextColor设置hdcCanvas的前景色为红色,然后输出的文字是这样的
人也红了,嗯,或者可以用来做人物狂暴状态的效果,不过脚下的影子要是黑色才对。考虑到后面可能有很多的文字输出,比如人物名字正常是白色,杀人以后是红色,聊天框,被攻击掉血-100这样,还有不同的怪的名字颜色不同,比如普通怪是白色,掉宝多的怪是金色,所以,这个东西,需要分离出来控制,于是就有了类MessageOut。
MessageOut都有些啥,下面逐项的说明
每个MessageOut有下面的2个HDC,一个是要输出的内容,一个是用来打洞的掩膜
HDC hdcContent;
HDC hdcMask;
创建HDC以后,再创建2个HBITMAP
HBITMAP hbitContent;
HBITMAP hbitMask;
然后,用SelectObject将2个HBITMAP分别选进HDC,现在这2个HDC的内容是这个样子(2个黑色矩形,尺寸是在MessageOut对象创建的时候确定的)
然后,将白色画刷选进hdcMask
hbrOldMask = (HBRUSH)SelectObject(hdcMask, WHITE_BRUSH);
创建一个黑色画刷选进hdcContent
hbrBlack = CreateSolidBrush(RGB(0x00, 0x00, 0x00));
hbrOldContent = (HBRUSH)SelectObject(hdcContent, hbrBlack);
将hdcContent的文本设置蓝色,并将文本背景设置为透明
SetBkMode(hdcContent, TRANSPARENT);
SetTextColor(RGB(0x00, 0x00, 0xff));
用画刷分别刷一下,由于画刷有边框,所以刷的范围向外扩一的像素的圈
Rectangle(hdcContent, -1, -1, width+1, height+1);
Rectangle(hdcMask, -1, -1, width+1, height+1);
把文字输出到2个HDC上
TextOut(hdcContent, 0, 0, strMsg.c_str(), strMsg.length());
TextOut(hdcMask, 0, 0, strMsg.c_str(), strMsg.length());
现在这个2个HDC,直接贴出来是这个样子
用这2个HDC,就可以用透明背景贴图的方式输出蓝色文字了
将hdcMask用SRCAND模式贴上去,
BitBlt(hdcDest,
x,y,
width, height,
hdcMask,
0,0,
SRCAND);
就成了这个样子,注意,那些黑色的,不是字,是洞!!
再将hdcContent用SRCPAINT模式贴上去
BitBlt(hdcDest,
x,y,
width, height,
hdcContent,
0,0,
SRCPAINT);
就成了这个样子,
在构造的时候,使用的字高是12,字粗是FW_THIN,创建的字体起了作用,最后就成了这个样子
然后,就是不停地用黑白画刷分别把HDC上的文字刷掉,再TextOut,再bitblt
如果不喜欢,可以在构造的时候,使用别的字体,用void MessageOut::SetTextColor(COLORREF color)函数来设置文本颜色
比如,主角的文字就是白色(也可以在杀人以后设置为红色,红名,hoho~)
最后,有没有人发现小地图上代表自己的那个点是白的,代表其他玩家的点是蓝的,具体请查看
void GameMap::DrawMini(HDC hdcDest, const vector<Sprite *> & vecPplayer)