关于快捷键的一个问题(100分)

A

Axe

Unregistered / Unconfirmed
GUEST, unregistred user!
我要做一个编辑器,用Ctrl+X,Ctrl+C,Ctrl+V作为标准的菜单快捷键,实现剪贴板功能。
除主窗体外,程序中还有一个非模态窗体,上面有一个编辑框。问题就在于,不管当前窗体
是那个,这三个快捷键的消息都被主窗体的菜单截获、处理了,致使其它窗体上的编辑框无
法使用这三个快捷键进行常规的剪贴板操作。
急切等待大家的解决方法。(前提是都要使用这三个标准快捷键)
 
我也有这样的问题!
 
为了使应用程序能自动的感知剪贴板的更改,
首先应当将应用程序的窗体注册到剪贴板观测链中,
然后使应用程序能响应剪贴板的更改消息并对这些消息进行处理,
最后当然不要忘了将该窗体从剪贴板观测链中移去。
为了在剪贴板观测链中注册应用程序的窗体,需调用Win32 API函数SetClipBoardviewer
SetClipBoardviewer的定义格式为:
function SetClipBoardviewer(hwndnewviewer;hwnd):hwnd;
hwdnnewviewer参数表示要注册的窗体句柄。
如果函数执行成功,返回剪贴板中下一个窗体的句柄。如果发生错误或在剪贴板观测链中无其他窗体,则
返回NULL。
public
nextClipViewHdle:hwnd;
procedure wmdrawClipboard(var msg:twmdrawclipboard);
message wm_drawClipboard;
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.ButtonCutClick(Sender: Tobject);
begin
clipboard.Assign(image.picture.bitmap);//复制图形到剪贴板
image.Picture.Assign(nil);//清空图形
end;

procedure TForm1.ButtonCopyClick(Sender: Tobject);
begin
clipboard.Assign(image.picture.bitmap);//复制图形到剪贴板
end;

procedure TForm1.ButtonPasteClick(Sender: Tobject);
begin
if clipboard.HasFormat(cf_bitmap) then
begin//如果剪贴板格式为位图,则放入图像组件中
image.Picture.bitmap.Assign(clipboard);
buttonpaste.Enabled :=false;
end
else if clipboard.HasFormat(cf_text) then
begin//如果剪贴板格式为文本,则放入Memo组件中
memo.PasteFromClipboard;
buttonpaste.Enabled :=false;
end;
end;

//该过程自动感知剪贴板
procedure tform1.wmdrawClipboard(var msg:twmdrawclipboard);
begin
if clipboard.HasFormat(cf_text) or clipboard.HasFormat(cf_bitmap) then
buttonpaste.Enabled :=true
else
buttonpaste.Enabled :=false;
end;

procedure TForm1.FormShow(Sender: Tobject);
begin
if clipboard.HasFormat(cf_text) or clipboard.HasFormat(cf_bitmap) then
buttonpaste.Enabled :=true
else
buttonpaste.Enabled :=false;
//将本窗体注册到剪贴板观链中
nextclipviewhdle:=setclipboardviewer(handle);
end;

procedure TForm1.FormClose(Sender: Tobject; var Action: TCloseAction);
begin
//将本窗体从剪贴板观测链中移去
changeclipboardchain(handle,nextclipviewhdle);
end;

end.

下面说明第二种剪贴板的方法
注:该文件出于
http://fxdfbl.51.net/files/onefile.php?file_id=17
 
对当前获得焦点的控件发送消息,试试吧!
SendMessage(GetFocus(), wm_copy, 0, 0);
SendMessage(GetFocus(), wm_Paste, 0, 0);
SendMessage(GetFocus(), wm_cut, 0, 0);
 
TO hryyx
这么简单的方法,我怎么就没想到呢? 谢谢!

TO KOKS
虽然你写了很多,可是有点离题,委屈一下,只有20分了,同样表示感谢!
 
顶部