关于popupmenu的使用问题(70分)

  • 主题发起人 白雪纷飞忧伤蝴蝶
  • 开始时间

白雪纷飞忧伤蝴蝶

Unregistered / Unconfirmed
GUEST, unregistred user!
定义了一个窗体,其属性中BorderStyle为bsNone,且定义了透明色;
然后在其上放了两个TImage控件,底下的一个显示图片,上面的一个transparent属性设为True,并用定义的透明色重画,两个Image控件的大小都是和Form的Client大小相等的。
请问:怎样为该窗体添加popupmenu,使得点击右键能弹出快捷菜单呢?
分不多,只能少给点,海涵。
 
哪个Image控件在前面,你就可以把那个Image控件的PopupMenu设为你PopupMenu控件的名字就可以实现了.你可以去试一下看看.
 
to:_港湾
就是因为都试过了,不行所以才到这边来问的……
 
好像有一个api可以把事件传递到它的父对象上。什么名字忘了。
 
直接设置窗体的PopupMenu就可以了啊,想那么复杂干吗
 
to:Corn3
将消息传递至父窗口吗?我下课回寝室看下书才知道。

to:DIGUA
直接设置窗体的popupmenu我试着是不行,希望您能给出方法,不胜感激。
 
to:Corn3
是用SendMessage还是CallWindowProc,实在是搞不清,能不能指点一下?
 
求高手指点呀……
 
按你的描述,试验了,没问题,直接设置成窗体的就行啊,你说不行,那就不懂了
 
to:DIGUA
其实我还在最上面那个image控件上每一秒画一次图的,不知道是不是这个原因呢,但我把这个给去了还是不行,所以才问的
不过话说回来,大富翁连续好几天都不能登录,全文检索也不能用,是不是有点太什么了吧……
 
unit Clock;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,jpeg, StdCtrls, Buttons, XPMan, Menus;
type
TempTime=record
TempHour,TempMint,TempSecd:Word;
end;
TForm1 = class(TForm)
Image1: TImage;
Timer1: TTimer;
ImageHand: TImage;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
LastTime:TempTime;
implementation
uses Manager;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
Circle:TShape;
NumOfHour:integer;
begin
LastTime.TempHour:=100;
LastTime.TempMint:=100;
LastTime.TempSecd:=100;
ImageHand.Top:=0;
ImageHand.Left:=0;
ImageHand.Height:=200;
ImageHand.Width:=200;
Image1.Top:=0;
Image1.Left:=0;
Image1.Height:=200;
Image1.Width:=200;
Image1.Picture.LoadFromFile('F:/delphi/时钟/Back.jpg');
For NumOfHour:=0 To 59do
begin
Circle:=TShape.Create(nil);
Circle.Left:=Round(97+Sin(NumOfHour*6*PI/180)*90);
Circle.Top:=Round(99-Cos(NumOfHour*6*PI/180)*90);
Circle.Width:=((NumOfHour+4) mod 5) +2;
Circle.Height:=((NumOfHour+4) mod 5) +2;
Circle.Shape:=stCircle;
Circle.Parent:=Form1;
ImageHand.Canvas.FillRect(Rect(0,0,200,200));
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
NowHour:word;
NowMinu:word;
NowSecd:word;
NowMill:word;
begin
DecodeTime(Now,NowHour,NowMinu,NowSecd,NowMill);
ImageHand.Canvas.Pen.Color:=$ffffff;
if ((LastTime.TempHour<>100) and (LastTime.TempMint<>100) and (LastTime.TempSecd<>100)) then
begin
ImageHand.Canvas.MoveTo(99,97);
ImageHand.Canvas.LineTo(Round(99+Sin( LastTime.TempHour*30*PI/180)*60),Round(97-Cos(LastTime.TempHour*30*PI/180)*60));
ImageHand.Canvas.MoveTo(99,97);
ImageHand.Canvas.LineTo(Round(99+Sin( LastTime.TempMint*6*PI/180)*70),Round(97-Cos( LastTime.TempMint*6*PI/180)*70));
ImageHand.Canvas.MoveTo(99,97);
ImageHand.Canvas.LineTo(Round(99+Sin( LastTime.TempSecd*6*PI/180)*80),Round(97-Cos( LastTime.TempSecd*6*PI/180)*80));
end;
ImageHand.Canvas.Pen.Color:=clBlack;
ImageHand.Canvas.MoveTo(99,97);
ImageHand.Canvas.LineTo(Round(99+Sin( NowHour*30*PI/180)*60),Round(97-Cos( NowHour*30*PI/180)*60));
ImageHand.Canvas.MoveTo(99,97);
ImageHand.Canvas.LineTo(Round(99+Sin( NowMinu*6*PI/180)*70),Round(97-Cos( NowMinu*6*PI/180)*70));
ImageHand.Canvas.MoveTo(99,97);
ImageHand.Canvas.LineTo(Round(99+Sin( NowSecd*6*PI/180)*80),Round(97-Cos( NowSecd*6*PI/180)*80));
LastTime.TempHour:=NowHour;
LastTime.TempMint:=NowMinu;
LastTime.TempSecd:=NowSecd;
end;

end.

以上是源代码……
 
在image控件上响应onmousedown事件,再用popmenu.popup方法将菜单弹出。
---------------------------------------------------------------------
快乐的四眼,欢迎访问我的技术博客:http://eyes4.mblogger.cn
 
to:eyes4
这个方法我试过的,也不行……
 
这样一个问题,等了一个月了……
唉……
 
拦截鼠标消息
 
imagemousedown
var
P:TPoint;
begin
if button=btRight then
begin
getCurosrPos(P);
popmenu.popup(p.x,p.y);
end;
end;
 
主窗体的PopupMenu是可以透过来的,如果不能透过来就是你最上层的控件已经有了另一个PopupMenu,这样主窗体的就不起作用了。
还有检查一下你动态生成的控件,是不是能相应这个呢,TShape是没有PopupMenu的,需要另外添加他的相应事件。
 
to:书痕
不好意思,我是初学,拦截鼠标消息不太会……能能指点下?
to:linuxping
你的代码和前面“_港湾”说的方法差不多,我试过了,是不行的
to:nanshan
我把所有的popupmenu全都去了,只剩一个form上的,结果还是不行。另外我给circle添加了mousedown的事件,可是也还是不行啊……
 
我把你的源代码拷过去后能显示popupmenu啊,你要是愿意的话把你的工程发到我邮箱吧:
yudingling@126.com
 
如果你还有问题可以吧你的代码压缩一个给我们调试一下,看看是什么问题。
或者你可以一个控件一个控件的删除,看看问题出在哪里了。
 
顶部