MDIChild窗体中不能使用Tab键切换焦点控件的问题。请高手解答

leonkim 2005-06-13 10:44:54
我用主程序调用Dll内的MDIChild子窗体,显示一切正常。当焦点在子窗体内的控件上时,按Tab键,焦点不动。请各位分析问题出现的原因,多谢。
Dll中的输出方法定义如下:
procedure ShowChild(pMainApp:Pointer);stdcall;
var
pForm:^TForm;
begin
Application.Handle:=TApplication(Pointer(pMainApp^)).Handle;
pForm:=@Application.MainForm;
pForm^:= TApplication(Pointer(pMainApp^)).MainForm;
fmMain:=TfmMain.Create(nil);
//*******************************
fmMain.FormStyle := fsMDIChild;
fmMain.WindowState := wsMaximized;//保证主窗体以最大化方法显示
//*******************************
fmMain.show;
end;
...全文
216 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
leonkim 2005-06-13
  • 打赏
  • 举报
回复
解决了,贴出来给大家共享:

TFmMain = class(TForm)
procedure FormCreate(Sender: TObject);
private
//声明响应WM_HOTKEY消息的方法
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
function GetSysFocus: Integer;
public
procedure WMACTIVATEAPP(var Msg: TMessage); message WM_ACTIVATEAPP;
end;

implementation
const id_SnapShot = 115; //定义热键标识符


function TFmMain.GetSysFocus: Integer;
var
hOtherWin,OtherThreadID,hFocusWin:integer;
begin
hOtherWin:=GetForegroundWindow;
OtherThreadID:=GetWindowThreadProcessID(hOtherWin,nil);
if AttachThreadInput(GetcurrentThreadID,OtherThreadID,True) then
begin
hFocusWin:=GetFocus;
result:=GetFocus;
if HFocusWin<>0 then
try
SendMessage(GetFocus,WM_COPY,0,0);//书上是这么写的
finally
AttachThreadInput(GetcurrentThreadID,OtherThreadID,False);
end;
end
else result:=GetFocus;
end;

procedure TFmMain.WMHotKey(var Msg: TWMHotKey);
var
H: THandle;
begin
if Msg.HotKey = id_SnapShot then
begin
H := GetSysFocus;
while IsWindow(H) and (H <> Handle) do
begin
SendMessage(H,WM_NEXTDLGCTL,0,0);
H := GetParent(H);
end;
end;
end;


procedure TFmMain.WMACTIVATEAPP(var Msg: TMessage);
begin
if Boolean(Msg.WParam) then
RegisterHotKey(Handle, id_SnapShot, 0, VK_TAB) //定义热键 在程序得到焦点时
else
UnRegisterHotKey(Handle, id_SnapShot); //释放已经登记的热键 在程序失去焦点时
end;

procedure TFmMain.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle, id_SnapShot, 0, VK_TAB) //定义热键 在程序得到焦点时
end;
leonkim 2005-06-13
  • 打赏
  • 举报
回复
TO : xthmpro_cn(安徽农民*在外打工)
项目早就开始了,
1、窗体每次调用比较麻烦。//调用只在主程序中写一次就行了,也不是太麻烦
2、Tab键转换处问题 //在网上查不到,可能是查的方法不对,请指教
3、不能显示子窗体的Hint。否则出错。(需要修改VCL代码)//使用我上边写的方法,显示可以显示Hint
4、使用第三方空间出错。已知的有:cxGrid //这个项目原则上不使用第三方控件

Tab键转换出问题 //在网上查不到,可能是查的方法不对,请指教
xthmpro_cn 2005-06-13
  • 打赏
  • 举报
回复
这个比较难,网上有处理的办法,但是,我建议还是改用BPL运行包吧(如果项目才开始的话)。
1、窗体每次调用比较麻烦。
2、Tab键转换处问题
3、不能显示子窗体的Hint。否则出错。(需要修改VCL代码)
4、使用第三方空间出错。已知的有:cxGrid
5...

所以建议改用BPL包。我就是改了。
TMenuItem显示在右侧 不使用MDI制作子窗体使用标题栏移动窗体使用标题栏移动窗口 两行hint 从XML文件动态创建菜单 从另外MDI子窗口读数据 使控件具有阴影效果 使每个MDIChild填充整个主窗口区域 使用Enter替代Tab 使用动画效果关闭窗口 使用动画方式打开窗体 使用帮助文件 使用状态栏显示hint 使用系统图标 使窗体不能移动 关闭一个MDI窗体 创建一个能改变大小的无边界窗体 创建半透明窗体 创建圆角窗体 创建透明窗体 判断窗体是modal 制作动画应用程序图标 制作可移动不能改变大小的窗体 制作永远最小化窗口 制作透明窗口 取和设置鼠标位置 取鼠标指针下面的活动TWinControl 启动时隐藏主窗口 在 window xp 使用阴影效果 在TCombobox内显示多行文本 在TScrollBox上显示窗体 在你的程序使用 Win XP 可视风格 在窗体上制造多边形洞 在窗体上挖洞 在窗体周围画彩色轮廓 定位messagebox 实现窗口的最小化动画效果 将InputQuery定位在窗体位置 怪异窗体 手动改变窗体比例 抓屏 拖拽时显示窗口内容 捕获主窗体WM_MOVE消息 改变Hint字体 改变Hint的显示时间 改变MessageDlg的按钮标题 最小化控件 最小化第二个窗口到任务栏 查找窗体注册类 格式化MessageDlg 检查PopUp菜单是否打开 检查控件是否被其它窗口遮掩 添加菜单项到系统菜单 渐变色填充窗体 特效窗口 移动指针到当前具有焦点控件 移除系统菜单项 自动关闭TCommonDialog 运行时改变MainForm 运行时移动控件 运行时移动窗口控件或取消其它窗口的复选框 通过在标题栏上右击缩小窗口 防止 Windows 最小化窗体 防止控件重画 防止窗体改变大小和移动 隐藏标题栏 隐藏窗体的最大化和最小化按钮

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧