c# ShowDialog后,怎么设置子窗体的位置相对于父窗体的位置呢?

神仙颠倒 2016-02-07 04:45:08
//将键盘所在的窗体设置为浮动工具条窗体。只要将窗体的CreateParams重写即可,这样窗体就不会获取焦点
#region 将当前窗体指定为浮动工具条窗体
public enum WindowStyles : uint
{
WS_OVERLAPPED = 0x00000000,
WS_POPUP = 0x80000000,
WS_CHILD = 0x40000000,
WS_MINIMIZE = 0x20000000,
WS_VISIBLE = 0x10000000,
WS_DISABLED = 0x08000000,
WS_CLIPSIBLINGS = 0x04000000,
WS_CLIPCHILDREN = 0x02000000,
WS_MAXIMIZE = 0x01000000,
WS_BORDER = 0x00800000,
WS_DLGFRAME = 0x00400000,
WS_VSCROLL = 0x00200000,
WS_HSCROLL = 0x00100000,
WS_SYSMENU = 0x00080000,
WS_THICKFRAME = 0x00040000,
WS_GROUP = 0x00020000,
WS_TABSTOP = 0x00010000,

WS_MINIMIZEBOX = 0x00020000,
WS_MAXIMIZEBOX = 0x00010000,

WS_CAPTION = WS_BORDER | WS_DLGFRAME,
WS_TILED = WS_OVERLAPPED,
WS_ICONIC = WS_MINIMIZE,
WS_SIZEBOX = WS_THICKFRAME,
WS_TILEDWINDOW = WS_OVERLAPPEDWINDOW,

WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
WS_POPUPWINDOW = WS_POPUP | WS_BORDER | WS_SYSMENU,
WS_CHILDWINDOW = WS_CHILD,

//Extended Window Styles

WS_EX_DLGMODALFRAME = 0x00000001,
WS_EX_NOPARENTNOTIFY = 0x00000004,
WS_EX_TOPMOST = 0x00000008,
WS_EX_ACCEPTFILES = 0x00000010,
WS_EX_TRANSPARENT = 0x00000020,

//#if(WINVER >= 0x0400)

WS_EX_MDICHILD = 0x00000040,
WS_EX_TOOLWINDOW = 0x00000080,
WS_EX_WINDOWEDGE = 0x00000100,
WS_EX_CLIENTEDGE = 0x00000200,
WS_EX_CONTEXTHELP = 0x00000400,

WS_EX_RIGHT = 0x00001000,
WS_EX_LEFT = 0x00000000,
WS_EX_RTLREADING = 0x00002000,
WS_EX_LTRREADING = 0x00000000,
WS_EX_LEFTSCROLLBAR = 0x00004000,
WS_EX_RIGHTSCROLLBAR = 0x00000000,

WS_EX_CONTROLPARENT = 0x00010000,
WS_EX_STATICEDGE = 0x00020000,
WS_EX_APPWINDOW = 0x00040000,

WS_EX_OVERLAPPEDWINDOW = (WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE),
WS_EX_PALETTEWINDOW = (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST),

//#endif /* WINVER >= 0x0400 */

//#if(WIN32WINNT >= 0x0500)

WS_EX_LAYERED = 0x00080000,

//#endif /* WIN32WINNT >= 0x0500 */

//#if(WINVER >= 0x0500)

WS_EX_NOINHERITLAYOUT = 0x00100000, // Disable inheritence of mirroring by children
WS_EX_LAYOUTRTL = 0x00400000, // Right to left mirroring

//#endif /* WINVER >= 0x0500 */

//#if(WIN32WINNT >= 0x0500)

WS_EX_COMPOSITED = 0x02000000,
WS_EX_NOACTIVATE = 0x08000000

//#endif /* WIN32WINNT >= 0x0500 */

}
protected override CreateParams CreateParams
{
get
{
CreateParams ret = base.CreateParams;
ret.Style = (int)WindowStyles.WS_THICKFRAME | (int)WindowStyles.WS_CHILD;
ret.ExStyle |= (int)WindowStyles.WS_EX_NOACTIVATE | (int)WindowStyles.WS_EX_TOOLWINDOW;
ret.X = this.Location.X;
ret.Y = this.Location.Y;
return ret;
}
}

#endregion
//下面是字母A发送到原窗口的焦点处。
private void btn_A_Click(object sender, EventArgs e)
{
SendKeys.Send("{A}");
}



以上的代码,实现的是一个浮动窗口的虚拟键盘。但是,窗口弹出的位置,总是以显示器最左上角为0,0,怎么能修改成,
以父窗口的左上角为0,0????(注明,显示器是1440*900的分辨率,我的父窗口是1024*768的分辨率)

假如我的显示器是以前的老式显示器,可以实现自己想要的位置,因为显示器和父窗口都是1024*768,这样左上角都是0,0

但现在就想实现子窗口相对父窗口的位置,而且,还是个浮动窗口,网上的代码 是实现虚拟键盘的。
...全文
1041 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
SoulRed 2018-02-10
  • 打赏
  • 举报
回复

form2.Owner = this;
form2.StartPosition = FormStartPosition.CenterParent;
form2.Location = new Point(1400, 1200);
第二句也可以把枚举改为manul 然后第3句就有效了
神仙颠倒 2016-03-08
  • 打赏
  • 举报
回复
引用 10 楼 rayyu1989 的回复:
可以在Keyboard里面定义一个变量 new完变量指向this 或者在ShowDialog之前设置好Location
怎么在keyboard中new 变量,指向this呢? 我的父窗口中的 //f2.Owner = this;,注释了,不注释的话,弹出的窗体上的按钮无法点击。 或者,怎么在showdialog之间设置location呢?
rayyu1989 2016-02-29
  • 打赏
  • 举报
回复
可以在Keyboard里面定义一个变量 new完变量指向this 或者在ShowDialog之前设置好Location
神仙颠倒 2016-02-26
  • 打赏
  • 举报
回复
引用 6 楼 rayyu1989 的回复:
[quote=引用 2 楼 caozhy 的回复:] ret.X = this.Owner.Location.X; ret.Y = this.Owner.Location.Y;
this.Owner 改成你所谓的父窗体的引用[/quote] 下面代码是打开的新窗体f2,父窗体是price,就是点击出来的虚拟键盘。 在price窗体代码中,打开的代码如下: 怎么改成父窗体的引用呢? Keyboard f2 = new Keyboard(); //f2.Owner = this; f2.ShowDialog();
神仙颠倒 2016-02-26
  • 打赏
  • 举报
回复
在price窗体代码中,打开的代码如下: Keyboard f2 = new Keyboard(); //f2.Owner = this; f2.ShowDialog(); f2.Owner = this; 这个的作用,能实现子窗体位于父窗体的相对位置,但是,弹出的虚拟键盘上的按钮,不能够点击!请大神给个提示。
xuzuning 2016-02-18
  • 打赏
  • 举报
回复
直接调用系统软键盘不是更简单
rayyu1989 2016-02-17
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
ret.X = this.Owner.Location.X; ret.Y = this.Owner.Location.Y;
this.Owner 改成你所谓的父窗体的引用
threenewbee 2016-02-17
  • 打赏
  • 举报
回复
你的窗体有父窗体么
xuzuning 2016-02-17
  • 打赏
  • 举报
回复
用 PointToScreen 方法将父窗体的原点映射成屏幕坐标 这样就好计算了
神仙颠倒 2016-02-17
  • 打赏
  • 举报
回复


提示的是这个错误啊,求解答!

@caozhy
threenewbee 2016-02-07
  • 打赏
  • 举报
回复
ret.X = this.Owner.Location.X; ret.Y = this.Owner.Location.Y;
Poopaye 2016-02-07
  • 打赏
  • 举报
回复
你加上父窗体的Location不就行了吗?

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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