procedure TApplication.WndProc(var Message: TMessage); with Message do case Msg of WM_SYSCOMMAND: case WParam and $FFF0 of SC_MINIMIZE: Minimize; SC_RESTORE: Restore; else Default; end; WM_CLOSE: 他也是一样的呀, 你说的事件不是链形是什么意思?呵呵
哦,这样的呀,呵呵,名词把我搞糊涂了,是这样的,呵呵 请看:TApplication中有这样的语句 for I := 0 to FWindowHooks.Count - 1 do if TWindowHook(FWindowHooks[I]^)(Message) then Exit; 这个可能是导致了只能一次的原因。大家可以跟踪一下。 事件不能传递?那是你没有传递,如果我想传递怎么不可以。这个传递用的不妥, 应该说WndProc只有一个,后面一个取代前面一个。
是呀,是这样的样,OnXXX的说白了只是一个函数指针,你只能给他赋一个值,但是这个和 事件的传递有什么关系呢?那么什么叫事件的传递? Delphi中消息和事件不同。 Windows消息->类的WndProc->类的消息处理过程->类的默认处理过程。 事件是对消息的封装,比如对SC_MINIMIZE消息,再消息的处理过程中,有 If Assigned(OnMin....) then ...... 每个都是这样的。你说的事件的传递是什么?呵呵
procedure wmmytrayiconcallback(var Msg : TMessage); //处理点击托盘图标的事件
message WM_MYTRAYICONCALLBACK;
procedure FormHide(Sender : TObject);//当用户单击最小化按钮的处理过程......
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMinimize := FormHide;
end;procedure TForm1.wmmytrayiconcallback(var Msg: TMessage);
//处理点击托盘图标的事件,根据 WM_MOUSEMOVE 消息的不同情况产生不同的回应
var
CursorPos : TPoint;
begin
Form1.WindowState :=wsNormal;
PopupMenu1.AutoPopup:=False;
case Msg.lParam of
//左键双击
WM_LBUTTONDBLCLK : begin
Application.ShowMainForm := True;
SetForegroundWindow(Application.Handle);
end;
//右键按下
WM_RBUTTONDOWN : begin
GetCursorPos(CursorPos);
PopupMenu1.Popup(CursorPos.x,CursorPos.y);
end;
end//case
end;procedure TForm1.FormHide(Sender: TObject);
begin
把它隱;
end;
procedure wmmytrayiconcallback(var Msg : TMessage); //处理点击托盘图标的事件
message WM_MYTRAYICONCALLBACK;
procedure FormHide(Sender : TObject);//当用户单击最小化按钮的处理过程......
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMinimize := FormHide;
end;procedure TForm1.wmmytrayiconcallback(var Msg: TMessage);
//处理点击托盘图标的事件,根据 WM_MOUSEMOVE 消息的不同情况产生不同的回应
var
CursorPos : TPoint;
begin
Form1.WindowState :=wsNormal;
PopupMenu1.AutoPopup:=False;
case Msg.lParam of
//左键双击
WM_LBUTTONDBLCLK : begin
Application.ShowMainForm := True;
SetForegroundWindow(Application.Handle);
end;
//右键按下
WM_RBUTTONDOWN : begin
GetCursorPos(CursorPos);
PopupMenu1.Popup(CursorPos.x,CursorPos.y);
end;
end//case
end;procedure TForm1.FormHide(Sender: TObject);
begin
把它隱藏;
end;
begin
Form1.Visible :=False;
end;试过了,改成这样也不行。
在TApplication.Minimize;中有 if not IsIconic(FHandle) then 。
再看看
property ShowMainForm: Boolean read FShowMainForm write FShowMainForm;
看,他只是赋值,而没有做什么操作。所有显示和隐藏Form用ShowMainForm可以吗?
事件不是链形只能产生一次,或者说,只能响应一次
直接截取最小化消息!
我现写了一个,你看看:
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SysCommand;//在这里定义消息映射函数
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
if message.CmdType = SC_MINIMIZE then
begin
showMessage('hahahaha!!!我靠!!!有本事你最小化我啊!!!!!');
//在这里做你想做的
//比如你希望的“指定最小化后的窗口的大小、位置”
end else
begin
inherited;//若不是最小化消息,就返回消息,否则拦截之
end;
end;end.
是这个意思,就是当窗体最小化的时候,OnMinimize 只产生一次
比如做托盘区控件,就需要监视最小化消息,若元件本身设置
OnMinimize = myfunc;
那么在窗体里另外有一个元件使用这个事件的时候,将不能正常完成工作。
换言之,“事件”不是链形的,不能传递。还是比如做托盘程序,要用的监视最小化消息的方法,就是利用
SetWindowLong函数实现。
下面我贴出一张代码,是<c++builder4技术内幕>的代码:
//---------------------------------------------------------------------------
#ifndef HookComponentH
#define HookComponentH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class PACKAGE THookComponent : public TComponent
{
private:
void __fastcall FormWndProc(TMessage& Message);
TFarProc NewWndProc;
TFarProc PrevWndProc;
protected:
void __fastcall Loaded();
public:
__fastcall THookComponent(TComponent* Owner);
__fastcall ~THookComponent();
__published:
};
//---------------------------------------------------------------------------
#endif
/---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop#include "HookComponent.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall THookComponent::THookComponent(TComponent* Owner)
: TComponent(Owner)
{
NewWndProc = 0;
PrevWndProc = 0;
if (!ComponentState.Contains(csDesigning))
NewWndProc = MakeObjectInstance(FormWndProc);
}
//---------------------------------------------------------------------------
__fastcall THookComponent::~THookComponent()
{
if (NewWndProc) {
TForm* ownerForm = dynamic_cast<TForm*>(Owner);
if (!ownerForm)
return;
SetWindowLong(ownerForm->Handle, GWL_WNDPROC, (long)PrevWndProc);
PrevWndProc = 0;
FreeObjectInstance(NewWndProc);
}
}void __fastcall THookComponent::Loaded()
{
TComponent::Loaded();
if (!ComponentState.Contains(csDesigning)) {
TForm* ownerForm = dynamic_cast<TForm*>(Owner);
if (!ownerForm)
return;
PrevWndProc = (void*)SetWindowLong(
ownerForm->Handle, GWL_WNDPROC, (long)NewWndProc);
}
}void __fastcall THookComponent::FormWndProc(TMessage& Message)
{
if (Message.Msg == WM_SYSCOMMAND)
if (Message.WParam == SC_MINIMIZE)
ShowMessage("Main Form Minimized");
if (PrevWndProc) {
TForm* ownerForm = dynamic_cast<TForm*>(Owner);
Message.Result = CallWindowProc((FARPROC)PrevWndProc,
ownerForm->Handle, Message.Msg, Message.WParam, Message.LParam);
}
}
//---------------------------------------------------------------------------
希望有帮助^_^
with Message do
case Msg of
WM_SYSCOMMAND:
case WParam and $FFF0 of
SC_MINIMIZE: Minimize;
SC_RESTORE: Restore;
else
Default;
end;
WM_CLOSE:
他也是一样的呀,
你说的事件不是链形是什么意思?呵呵
就最小化而言:
当窗体最小化的时候,OnMinimize 只产生一次
比如做托盘区控件,就需要监视最小化消息,若托盘区元件本身设置OnMinimize = myfunc;
那么在窗体里另外有一个元件使用这个事件的时候,将不能正常完成工作。
请看:TApplication中有这样的语句
for I := 0 to FWindowHooks.Count - 1 do
if TWindowHook(FWindowHooks[I]^)(Message) then Exit;
这个可能是导致了只能一次的原因。大家可以跟踪一下。
事件不能传递?那是你没有传递,如果我想传递怎么不可以。这个传递用的不妥,
应该说WndProc只有一个,后面一个取代前面一个。
这个说起来太累,嘿嘿
但是他“不用”自己的窗口过程取代了原来的WndProc“也会”这样
比如他只响应OnMinimize
那么第二个元件也响应OnMinimize 的话,事件就不能被触发。
VCL的消息处理也很麻烦的~
事件的传递有什么关系呢?那么什么叫事件的传递?
Delphi中消息和事件不同。
Windows消息->类的WndProc->类的消息处理过程->类的默认处理过程。
事件是对消息的封装,比如对SC_MINIMIZE消息,再消息的处理过程中,有
If Assigned(OnMin....) then ......
每个都是这样的。你说的事件的传递是什么?呵呵