如何在系统运行当中载入自定义光标?(100分)

  • 主题发起人 主题发起人 Jufeng_zhu
  • 开始时间 开始时间
J

Jufeng_zhu

Unregistered / Unconfirmed
GUEST, unregistred user!
在系统运行过程中,我需要载入自定义光标。光标定义已经放在RES中,都已经有了定义。
在DELPHI5中参考资料说使用SCREEN。CURSORS。ADD()就可以了。
我在程序中进行载入,然后在某一个状况下设置了光标。但是
程序编译后,在WINME和WIN98中没有更改光标。
但是在WINME,WIN98中编译的程序在WIN2000中光标居然变化,而且完全正确。
因此我想得到如何在98中获得同样的结果。
 
既然已经放在了资源文件里,那你试试LoadCursor如何。

顺便送你一篇文章
Dephi5 中资源文件的创建和使用

崔同杰 张卫华

 

--------------------------------------------------------------------------------

几乎每个 Windows 应用程序都使用图标、图片、光标等资源。资源是程序的一部分,
但是它是不可执行代码。下面我们就详细介绍资源文件在 Delphi5 中建立和使用方法。
1 .把资源放到 Exe 文件的优点
由于定位资源比在磁盘中定位文件花费时间少,所以应用程序执行会更快。多种资源
可以放在一个文件中,减少了图标、图片、光标等文件数量。保存资源文件时不要和工
程名相同,因为 Delphi 创建工程时会自动创建一个和工程名相同的资源文件。并且最
好将资源文件保存到和工程文件同一个文件夹中。

2 .创建资源文件

首先创建一个 .Rc 的纯文本文件。格式如下:

资源标识符 + 关键字 + 资源文件名

① 资源标识符:程序中调用资源时的特殊标号;

② 关键字:标识资源文件类型;

Wave : 资源文件是声音文件;

RCDATA : JPEG 文件;

AVI : AVI 动画;

ICON : 图标文件;

BITMAP : 位图文件;

CURSOR : 光标文件;

资源文件名:资源文件名;

③ 资源文件名:编译的资源文件,比如动画、位图、光标等;

④ 如: MyWav WAVE -FileName.Wav-

使用 Borland 资源编译器( BRCC32.EXE )转化 .Rc 文件成 .Res 文件。在 DOS 命令
行下输入下列命令:

Brcc32 FileName.Rc // Brcc32.Exe 在 Delphi5/Bin 文件下。

3 .在工程中引用资源文件

为了存取我们的资源文件,必须告诉 Delphi 链接我们的资源文件到应用程序中。
因此我们可以在源代码中加入一条编译指令完成上述功能。这条指令必须紧跟在窗口指令
后,如下形式:

{$R *.DFM} //Delphi 自带编译指令

{$R FileName.Res}   // 新加入的编译资源文件的指令。

不要删除 {$R *.DFM} 指令,因为这行代码告诉 Delphi 链接下面的资源到窗口的资源中。

4 .调用资源文件

(1) 存取资源文件中的位图 (Bitmap) :

程序中如果想存取资源,你必须调用一些 Windows API 函数。保存在资源文件中的位图、
光标和图标可以通过调用LoadBitmap 、 LoadCursor 和 LoadIcon 函数存取。

本例举例说明如何存取资源文件中位图并显示在 Timage 控件中。

procedure TfrMain.btnCanvasPic(Sender: TObject);

begin

Image1.Picture.Bitmap.Handle :=LoadBitmap(hInstance, '' 资源标识符 '');

end;

注:如果位图没有装载成功,程序仍旧执行,但是 Image 将不再显示图片。你
可以根据 LoadBitmap 函数的返回值判断是否装载成功,如果装载成功返回值是非
0 ,如果装载失败返回值是 0 。

另外一个存取显示位图的方法如下:

procedure TfrMain.btnLoadPicClick(Sender: TObject);

begin

Image1.Picture.Bitmap.LoadFromResourceName(hInstance, '' 资源标识符 '');

end;

(2) 存取资源文件中的光标:

Screen.Cursors[] 是一个光标数组,使用光标文件我们可以将定制的光标加入到这
个属性中。因为默认的光标在数组中索引值是 0 ,所以除非想取代默认光标,最好将
定制的光标索引值设为 1 。

procedure TfrMain.btnUseCursorClick(Sender: TObject);

begin

Screen.Cursors[1] :=LoadCursor(hInstance,'' 资源标识符 '');

Image1.Cursor :=1;

end;

(3) 存取资源文件中的图标:

将图标放在资源文件中,可以实现动态改变应用程序图标。

procedure TfrMain.LoadIconClick(Sender: TObject);

begin

Application.Icon.Handle := LoadIcon(hInstance, '' 资源标识符 '');

End;

(4) 存取资源文件中的 AVI :

procedure TfrMain.LoadIconClick(Sender: TObject);

begin

Animate1.ResName :=''MyAvi'' ; // 资源标识

Animate1.Active :=True ;

End ;

(5) 存取资源文件中的 JPEG:

把 jpeg 单元加入到 Interface 的 uses 单元中。

procedure TForm1.LoadJPGClick(Sender: TObject);

var

Fjpg : TJpegImage ;

FStream :TResourceStream ;

begin

Fjpg :=TJpegImage.Create ;

FStream := TResourceStream.Create (Hinstance,'' 资源标识符 '',RT_RCDATA) ;

FJpg.LoadFromStream (FStream) ;

Image1.Picture.Bitmap.Assign (FJpg);

end;

(6) 存取资源文件中的 Wave:

把 MMSystem 加入到 Interface 的 uses 单元中

procedure TForm1.LoadWaveClick(Sender: TObject);

begin

PlaySound(''MyWav'', HInstance, Snd_ASync or Snd_Memory or snd_Resource) ;

end;

5 .结束语

位图、光标和图标、 AVI 动画、 JPEG 和 Wave 文件等可以放到资源文件中,上面我
们介绍了如何将资源加入到资源文件中,并介绍了在 Delphi 中动态存取资源文件的方法。
Delphi 编译工程会自动创建一个和工程名相同的资源文件(如果没有其他的资源,主窗口
的图标会放在这个资源文件中)。但是建议最好不要改变这个资源文件。

 
此功能就是在我的程序中使用的,SECREN。CURSORS。ADD(LOADCURSOR());
问题是WIN98/ME不能成功而WIN2000成功了。
 
能不能把这部分代码让看看,我实在不好猜错在哪里的。[:(]
 
我用过的,都WIN98.WIN2K都可以,试试以下代码!
screen.Cursors[2]:=LoadIcon(HInstance, 'MYCURSOR');
screen.Cursor :=2 ;
 
楼上的可以.
 
在dpr文件中写上:

{$R cur.res}
在改变光标的form文件中,加:
const
crMyCursor1 = 1;

然后在create中:
Screen.Cursors[crMyCursor1] := LoadCursor(Hinstance, MakeIntreSource(401));
memo1.Cursor := crMyCursor1;


而在cur.rc中,写上:

401 cursor “mycur.cur”
编译即可。
 
后退
顶部