如何实现在全屏游戏界面(如魔兽)上显示文字

fxb_2010 2010-09-09 01:38:00
就像VS竞技平台的VS消息一样的功能

一开始以为用CWindowDC(GetDesktopWindow()); 再设置背景为透明SetBkMode(TRANSPARENT);再DrawText(..);就可以了,发现游戏刷屏频率太高,即使是在定时器为1毫秒的频率来DrawText,依然闪烁的厉害,
再考虑了Api Hook,希望在BitBlt后添加上面显示文字的操作,结果资源消耗太大,直接崩溃了(还是游戏刷屏太快的原因);
再考虑透明对话框,希望对话框是透明的,即看不到对话框的框架,但是能看到对话框中的文字,但是好像将对话框变透明,里面的控件和文字也都变成透明的了,
哎,到底是怎么实现的,希望高手能帮帮忙,谢谢了。
...全文
958 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxb_2010 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ylmbtm 的回复:]
异形窗口,你会吗,
用你要输出的文字生成一个文字形状的窗口, 再把这个窗口显示在最上面,什么都解决了。
[/Quote]
这个真不会,能不能发一小段代码学习一下,谢谢
aa_22_999 2010-09-10
  • 打赏
  • 举报
回复
友情帮顶。。。。
wbt1970 2010-09-10
  • 打赏
  • 举报
回复
先在内存中画好形成内存位图,然后将此位图显示到屏幕,这样就不会有闪烁的感觉了
sunlin7 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fxb_2010 的回复:]
高手,小弟对OpenGL不熟
EndRender在MSDN上,网上也没查到合适的说明,能不能说明的详细点,谢谢了
[/Quote]

本人对OpenGL也不是很熟悉的.OpenGL中用的是glBegin/glEnd来启动和结束渲染.

你可以逆向一下VS平台,看看它的实现思路.
yaoyue1019 2010-09-10
  • 打赏
  • 举报
回复
忘记怎么进入文库了 反正百度文库 就查我这个账号 有发布过关于WOW的制作的API的相关资料 是个精简版的 发的比较早 内容不多 阅读起来容易
yaoyue1019 2010-09-10
  • 打赏
  • 举报
回复
貌似不用那么麻烦

查看一下大脚插件的制作吧

魔兽官方有公布API的
ylmbtm 2010-09-10
  • 打赏
  • 举报
回复
异形窗口,你会吗,
用你要输出的文字生成一个文字形状的窗口, 再把这个窗口显示在最上面,什么都解决了。
fxb_2010 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lisunlin0 的回复:]
魔兽应该是OpenGL的,hook掉那个类似于EndRender的函数,在这个函数之向流水线里面输出文字,再调用真正的EndRender完成渲染。
[/Quote]
高手,小弟对OpenGL不熟
EndRender在MSDN上,网上也没查到合适的说明,能不能说明的详细点,谢谢了
NIKE霸天虎 2010-09-09
  • 打赏
  • 举报
回复
学习来的
sunlin7 2010-09-09
  • 打赏
  • 举报
回复
楼主可以使用
war3.exe --window --opengl

来启动魔兽,这时是窗口模式的,然后使用WinDbg来attach魔兽进程,break掉几个可能的openGL函数,查看函数的调用。
sunlin7 2010-09-09
  • 打赏
  • 举报
回复
魔兽应该是OpenGL的,hook掉那个类似于EndRender的函数,在这个函数之向流水线里面输出文字,再调用真正的EndRender完成渲染。
xiaohuh421 2010-09-09
  • 打赏
  • 举报
回复
还有,你要知道游戏是不可能用GDI来画东西的,都是直接操作显卡的.....
xiaohuh421 2010-09-09
  • 打赏
  • 举报
回复
要窗口透明,文字不透明好办,用指定背景透明就可以了.

//半透明窗口
COLORREF maskColor = RGB(236,233,216);
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)|0x80000);
HINSTANCE hInst=LoadLibrary(_T("User32.DLL"));
if(hInst)
{
typedef BOOL (WINAPI * MYFUNC)(HWND , COLORREF,BYTE,DWORD);
MYFUNC fun=NULL;
fun=(MYFUNC)GetProcAddress(hInst,"SetLayeredWindowAttributes");
if(fun) fun(this->GetSafeHwnd(),maskColor,128,LWA_COLORKEY);//注意这里参数
FreeLibrary(hInst);
}
FireBirdCN 2010-09-09
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080429/13/3cf5b4ba-2fb4-44f2-8a77-43f3787b9945.html
我以前问过相同的问题。。
你看看吧
解决了 解决了 记得贴出来。。
jasonM2008 2010-09-09
  • 打赏
  • 举报
回复
绑定,听说需要用DirectDraw来绘制!待熟悉的人来看看!

16,472

社区成员

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

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

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