1000 分大放送!有关文字直接显示在屏幕上。(200分)

  • 主题发起人 主题发起人 evon
  • 开始时间 开始时间
to :吕雪松
>没什么难度,也不至于搞得写显存什么的那么复杂。
如果直接在桌面上绘图的话,那当然是简单不过了
问题是如果在游戏当中,如何阻止游戏画面某区域重画,就.......

to :mikedeakins
>如果是游戏需要独占还可以理解,一般的应用程序确实没有必要。
我就是有需要 啊!~......啊

to :热血
该怎麽做,具体源码?
我 心已....凉
血已....冷

to :caowei,hustmouse
Overlay ? Hook Blt 具体实现的源码?
我全部家当都送给你!...

^ 灰心的我始终如一....^^ ^ ^
 
我说的是硬件实现的方式,所有的字幕卡,从几百到几千元的都有这个功能.
另外如果非要用软件实现的话,有一个办法不知道现在还行不行(几年前是行的:-))
就是找到显存的起始地址,然后在显存里面直接写数据.这要动用DDK,
我做毕业设计的时候有一段程序用到过,不过那个时候是PCI显卡,AGP的没有试验过,
而且如果你要一直显示的话,应该不断的刷新. 做成VXD.
 
evon,大家说了不少可行的例子,为什么还HOW呢?

你也知道,这个问题并不是一个两个源码就能搞定的,
要查的资料也决非泛泛。
我觉得大富翁是个解决疑难、开阔思路的地方,现在
有了几个方向,就该试一试,不成了,再来讨论实际
问题,这样对大家都有好处。

你以为如何?
 
to JeffSY:
我认为您说的都是正确的。
只不过到目前为止,我还没有初步的结论。

我试过 DirectDraw 如果使用独占模式,好像只能用於 Full Screen 不能用在特定 围内
使用 Vxd 这方面的书籍与资料很少,不知如何开始!
.......
 
接左轻侯话说:谁在最前面也有个次序嘛! 不停的让你的窗口ONTOP
 
见过一些sprite小程序,在屏幕保护下也可显示在最前,我用创建窗口在Z次序最顶端,然后不
停的SetWindowPostion在最顶端,也可显示在大多数程序上,但斗不过它.不知是否你想要的
效果,是否金山游侠,东方不败这类现实效果.









































































































 
要想一直显示在最前,可以使用ApplicationEvents控件的Idle事件来完成该
操作,该事件会不断的利用系统的空闲时间,无论是否激活!
 
我觉得你可以试一下上面伙伴说的,如果能显示呢在给你一个透明窗口控件+LABEL.透明,
,要不就IDLE +DX+AOOOO(好像是这地质既不太清楚了)起始地址
 
配上透明的窗体和label就更好了,不过会让人捕捉到窗体句柄,你的天机就泄露了。
 
陈宽达的《delphi深度历险》好像有说哦。:)
 
编写设备驱动吧 。;)
 
利用dxdraw,建立主副两表面,副表面写字(可以利用gdi函数textout),然后反转(flip),
这样就行了!哦!忘了!反转前要将副表面的内容写到主表面用blt!
 
我用线程的形式测试一下写屏好像效果还行,代码如下:
unit Unit2;

interface

uses
Classes,Windows,SyncObjs;

type
ShowTEXTToWin = class(TThread)
private
{ Private declarations }
FullscreenDC:HDC;
strText:String;
m_stop:TEvent;
procedure ShowText();
protected
procedure Execute; override;
public
constructor Create(Astop:TEvent);
end;

implementation
{ ShowTEXTToWin }
procedure ShowTEXTToWin.ShowText();
begin
FullscreenDC:=GetDC(0);
Textout(FullscreenDC,1,1,Pchar(strText),Length(strText));
end;

constructor ShowTEXTToWin.Create(Astop:TEvent);
begin
strText:='这里在测试!!';
m_stop:=Astop;
FreeOnTerminate := TRUE;
inherited Create(False);
end;

procedure ShowTEXTToWin.Execute;
begin
{ Place thread code here }
while true do
begin
ShowText();
if wrSignaled=m_stop.WaitFor(20) then break;
end;
end;

end.


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,SyncObjs;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
m_stop:TEvent;
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
te:ShowTEXTToWin;
begin
te:=ShowTEXTToWin.Create(m_stop);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
m_stop.SetEvent();
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
m_stop:=TEvent.Create(NIL,TRUE,FALSE,'Stop Show TEXT');
end;

end.
 

Similar threads

D
回复
0
查看
937
DelphiTeacher的专栏
D
D
回复
0
查看
892
DelphiTeacher的专栏
D
D
回复
0
查看
864
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部