加入BUTTON |
尚未結案
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
|
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
|
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
Hi mchakuna 您好:
procedure TForm1.Button1Click(Sender: TObject); var Btn : TButton; MHandle : THandle; begin MHandle := Form1.Handle; Btn := TButton.Create(FindControl(MHandle)); Btn.Top := 10; Btn.Left := 10; Btn.Caption := 'New Button'; Btn.Name := 'Button2'; Btn.Parent := FindControl(MHandle); end;我不是高手, 高手是正在銀幕前微笑的人.
------
我不是高手, 高手是正在銀幕前微笑的人. |
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
引言: Hi mchakuna 您好:谢谢, 我按上面的代码写好了。我是在DLL中编写的,而这个DLL会在主程序中某个元件上(应该是个panel)加上上述的button。然而,我想加入一个响应程序,如procedure TForm1.Button1Click(Sender: TObject); var Btn : TButton; MHandle : THandle; begin MHandle := Form1.Handle; Btn := TButton.Create(FindControl(MHandle)); Btn.Top := 10; Btn.Left := 10; Btn.Caption := 'New Button'; Btn.Name := 'Button2'; Btn.Parent := FindControl(MHandle); end;我不是高手, 高手是正在銀幕前微笑的人. Btn.OnClick := MyClick;编译是通过了, 但好像按了button后并没有响应。如果在程序中强制调向button的click函数,这个事件却有响应。是不是主程序把click事件载取了所以在dll中无法获入这个button的click响应?我要怎样才可以使这个button响应? 谢谢 |
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
引言:我参考论坛中的一个关於Hook的例子加入了这个button的click事件响应, 代码如下。引言: Hi mchakuna 您好:谢谢, 我按上面的代码写好了。我是在DLL中编写的,而这个DLL会在主程序中某个元件上(应该是个panel)加上上述的button。然而,我想加入一个响应程序,如procedure TForm1.Button1Click(Sender: TObject); var Btn : TButton; MHandle : THandle; begin MHandle := Form1.Handle; Btn := TButton.Create(FindControl(MHandle)); Btn.Top := 10; Btn.Left := 10; Btn.Caption := 'New Button'; Btn.Name := 'Button2'; Btn.Parent := FindControl(MHandle); end;我不是高手, 高手是正在銀幕前微笑的人.Btn.OnClick := MyClick;编译是通过了, 但好像按了button后并没有响应。如果在程序中强制调向button的click函数,这个事件却有响应。是不是主程序把click事件载取了所以在dll中无法获入这个button的click响应?我要怎样才可以使这个button响应? 谢谢 function MouseProc(icode:Integer; wP:wParam; lP:lParam):LRESULT;stdcall; var pMsg : ^TMouseHookStruct; h : HWnd; begin try if (iCode >= 0) then begin if iCode =HC_ACTION then begin pMsg := Pointer(lp); h := pMsg.hwnd; // 如果是我的button发出的click事件 if (h=btn.Handle) and (wP=513) then begin // 对click事件的响应 end; Result := 0; End Else Result := CallNextHookEx(idHook, iCode, wp, lp); end; except Result := 0; end; end;这里的wP=513是我从网上找到的代表按下的事件码。我不知这个代码是否在不同的平台也是一样的。总觉得不太好。有没有更好的表示标识click事件的方法?另外,如果在处代码中加入messagebox来显示一些内容,我发觉它会不断显示很多很多次, 为什么会这样? 有没有方法解决?而且即使不调用messagebox,在启动Hook之后,好像除这个Button外,系统上的其它窗口都不再响应左键click了,唉 最后想问一个问题,按mustapha.wa及miles的方法,我加入了TButton, 但我想要的是加入一个带BMP背景的按钮。我试过用TBitBtn代替tbutton,编译成功,但运行时却带出一串非法操作。好像问题是在读入bmp图上。我把读入bmp图的语句去掉,错误不出现但按钮还却不见了!!!! 發表人 - mchakuna 於 2004/02/27 17:55:21 |
Miles
尊榮會員 發表:27 回覆:662 積分:622 註冊:2002-07-12 發送簡訊給我 |
|
mchakuna
一般會員 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
引言: Hi mchakuna 您好: 1. Btn.OnClick := MyClick; 這應該沒問題, MyClick的宣告對嗎 procedure MyClick(Sender : TObject); 2.我看不太出來問題在哪裡, 若要用到Hook就麻煩了, 是否方便將程式碼上來, 大家來想想辦法. 我不是高手, 高手是正在銀幕前微笑的人.我的代码很简单, 就是把你们的代码贴上来而矣 TBtnHandler = class public procedure MyClick(Sender: TObject); end; function CallFunction : Integer; stdcall; // 主程序会调用这个函数 var BtnHandler :TBtnHandler; begin BackPanelHwnd := 0; // 按钮将加於这个handle指定的元件上 ///////////////////////////////////////////////////////// // MainFormHandle是主程序窗体的handle // EnumChildWindows找出所要的元件的handle (即BackPanelHWnd) EnumChildWindows(MainFormHandle, @EnumWindowsProc, 0); if BackPanelHwnd<>0 then begin Btn:=TButton.Create(FindControl(BackPanelHwnd)); Btn.ParentWindow := BackPanelHwnd; Btn.Width := 50; Btn.Height := 20; Btn.Top := 100; Btn.Left := 20; Btn.Caption:='Btn'; Btn.Name:='Button'; BtnHandler := TBtnHandler.Create; Btn.OnClick := BtnHandler.MyClick; end; ///////////////////////////////////////////////////////// Result := 0; end;注意, 响应函数MyClick在类BtnHandler中. 如果在程序中直接调用Btn.click, 则myclick会被响应 發表人 - mchakuna 於 2004/03/01 14:16:58 |
mustapha.wang
資深會員 發表:89 回覆:409 積分:274 註冊:2002-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |