创建半屏窗口

YourKing 2010-09-07 10:38:11
我想创建一个窗口出来,但是不影响当前窗口。

就是说,一般一个新窗口出来了,标题栏,状态栏之类的地方就会随之有变化
我想实现的效果是,如果把屏幕下半部遮住,然后我的窗口出来了从上半屏都看不出变化
不知道描述的够不够清楚
截屏做窗口背景就不用提了,那样就不是半屏窗口了。

请大家给指教一下,谢谢
...全文
146 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
YourKing 2010-09-08
  • 打赏
  • 举报
回复
非常感谢SongQues,我用的是VC++,你的代码我研究看看
YourKing 2010-09-08
  • 打赏
  • 举报
回复
mobile中的输入法面板就是这样的半屏效果,不知道是怎么实现的
SongQues 2010-09-08
  • 打赏
  • 举报
回复

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Microsoft.WindowsMobile.Status;
using Microsoft.WindowsCE.Forms;

namespace yzh
{
public class yzh : Form
{
//private SystemState displayRotationState = new SystemState(SystemProperty.DisplayRotation);
private bool centered = true;

#region Native Platform Invoke

[DllImport("coredll.dll")]
private static extern UInt32 SetWindowLong(IntPtr hWnd, int nIndex, UInt32 dwNewLong);

[DllImport("aygshell.dll")]
private static extern int SHDoneButton(IntPtr hwndRequester, UInt32 dwState);

private readonly int GWL_STYLE = (-16);

private readonly UInt32 WS_CAPTION = 0x00C00000; /* WS_BORDER | WS_DLGFRAME */
private readonly UInt32 WS_BORDER = 0x00800000;
private readonly UInt32 WS_POPUP = 0x80000000;

private readonly UInt32 SHDB_SHOW = 0x0001;
private readonly UInt32 SHDB_HIDE = 0x0002;

#endregion

public NonFullscreenForm()
{
//displayRotationState.Changed += new ChangeEventHandler(displayRotationState_Changed);
}

public bool CenterFormOnScreen
{
get
{
return centered;
}
set
{
centered = value;

if (centered)
{
CenterWithinScreen();
}
}
}

protected override void OnLoad(EventArgs e)
{

this.Height += SystemInformation.MenuHeight;

base.OnLoad(e);

uint style = WS_BORDER | WS_CAPTION | WS_POPUP;
SetWindowLong(Handle, GWL_STYLE, style);

SHDoneButton(Handle, ControlBox ? SHDB_SHOW : SHDB_HIDE);

if (centered)
{
CenterWithinScreen();
}
}

protected override void OnResize(EventArgs e)
{
base.OnResize(e);

if (centered)
{
CenterWithinScreen();
}
}

protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);

if (this.ControlBox)
{
if (e.KeyCode == Keys.Return || e.KeyCode == Keys.Escape)
{
this.DialogResult = DialogResult.OK;
}
}
}

private void displayRotationState_Changed(object sender, ChangeEventArgs args)
{
if (centered)
{
CenterWithinScreen();
}
}

private void CenterWithinScreen()
{
int x = (Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2;
int y = (Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2;

this.Location = new Point(x, y);
}
}
}

楼主看一下这个!继承一下就可以看到效果!
YourKing 2010-09-08
  • 打赏
  • 举报
回复
我是做了,不是想当然的
windows mobile 普通窗口出来都是全屏的,也就是说一个新窗口出来了在z轴上会处于最上层,好像windows mobile也不支持像PC那样的透明效果,所以标题栏、右上角都是覆盖的效果.隐藏不代表透明啊,所以实现起来还没找到方向。
SongQues 2010-09-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 yourking 的回复:]
我想创建一个窗口出来,但是不影响当前窗口。

就是说,一般一个新窗口出来了,标题栏,状态栏之类的地方就会随之有变化
我想实现的效果是,如果把屏幕下半部遮住,然后我的窗口出来了从上半屏都看不出变化
不知道描述的够不够清楚
截屏做窗口背景就不用提了,那样就不是半屏窗口了。

请大家给指教一下,谢谢
[/Quote]
原来是要半屏窗体!我看成了半透明窗体!呵呵!无证!这个半屏窗体问一下楼主用什么语言写?
mojieke 2010-09-08
  • 打赏
  • 举报
回复
7楼的方法就可以,不错
大饼哥- 2010-09-08
  • 打赏
  • 举报
回复
不知道是你想当然的还是动手证实了的!

不过,我当然是想当然的,因为我没有去针对这个做demo。

但我觉得,你要的就是弹出一个Dialog这样的功能,只显示某一块区域,并且没有状态栏和菜单栏。(不知道是否??)

应该隐藏是可以的。。。试试看。
YourKing 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 songques 的回复:]

期待!我研究了快二年了!呵呵!但是还是没有成功!不过有些人过,他们只告诉你方法不告诉你怎么实现!哎……!我帮顶吧!
[/Quote]
谢谢啦!
有方法就有方向啊,我目前还没研究到什么好方法
SongQues 2010-09-07
  • 打赏
  • 举报
回复
期待!我研究了快二年了!呵呵!但是还是没有成功!不过有些人过,他们只告诉你方法不告诉你怎么实现!哎……!我帮顶吧!
YourKing 2010-09-07
  • 打赏
  • 举报
回复
就是不希望程序影响到公共区域
比如当前运行的程序B要调用我的程序A,A不想覆盖B的标题栏,如果B窗口本身在右上角就是OK按钮,A实现隐藏OK按钮的话那么B窗口的OK按钮其实是被遮住的.
大饼哥- 2010-09-07
  • 打赏
  • 举报
回复
楼上基本都提到了几个方法:
1。 创建的时候,设置Pos_x,Pox_y,hight一般。影藏掉右上角的X或者OK。这样实现有问题吗?
2。 创建好窗口后,用movewindows移动,应该也是可以的呀。

至于你说的电池电量什么的饿,应该不会有变化吧,哦,你创建的时候记得隐藏状态栏。

如果你在你所谓的下半屏里面要显示电池什么的,那就掉相应的方法获得显示啊。

不知道你问的是不是这个!!

仅供参考!
YourKing 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lvlin1980 的回复:]

这个好象很容易吧 不知道我理解的对不对:
1. 创建一个窗口,X Pos = 0; Y Pos = 某个数值(半屏)
2. 创建这个窗口的类,这个类的virtual BOOL OnInitDialog();方法中不要加入CDialog::OnInitDialog();
3. 把ok再隐藏了
::SHDoneButton(m_hWnd, SHDB_HIDE);
::SetWindow……
[/Quote]
谢谢建议

要单击运行的话模拟效果还是可以实现的
但是我想当程序被调用时也有这样的效果比较难
要考虑原来右上角是什么按钮
还有在桌面情况下被调用时状态栏上的电池电量变成了时间,这个也目前不知道怎么控制
lvlin1980 2010-09-07
  • 打赏
  • 举报
回复
这个好象很容易吧 不知道我理解的对不对:
1. 创建一个窗口,X Pos = 0; Y Pos = 某个数值(半屏)
2. 创建这个窗口的类,这个类的virtual BOOL OnInitDialog();方法中不要加入CDialog::OnInitDialog();
3. 把ok再隐藏了
::SHDoneButton(m_hWnd, SHDB_HIDE);
::SetWindowLong(m_hWnd, GWL_STYLE, WS_NONAVDONEBUTTON );

这样出来的窗口就是半屏的 , 供参考
comey 2010-09-07
  • 打赏
  • 举报
回复
学习。。。。。。。。
chxy85 2010-09-07
  • 打赏
  • 举报
回复
在对话框的构造函数里
m_bFullScreen = FALSE;

然后在初始化中,movewindow到你想要的样子
YourKing 2010-09-07
  • 打赏
  • 举报
回复
非常感谢luver提供的意见
我调试下效果看看
烂番 2010-09-07
  • 打赏
  • 举报
回复
这个不就是ToolTip窗口吗,贴点代码:

if(!CreateEx(
WS_EX_TOOLWINDOW | WS_EX_TOPMOST,
TOOLTIPS_CLASS,
NULL,
WS_POPUP,//TTS_NOPREFIX | TTS_ALWAYSTIP,
CRect(0,0,10,10),
pParent,
NULL,
NULL))


ShowWindow(SW_SHOWNOACTIVATE);

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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