窗体全屏 隐藏任务栏与菜单栏

WIN MOBILE中,常常要全屏显示某个窗体,但是如果通过"SHFullScreen"方法,最大只能扩大到工作区,任务栏与菜单栏依旧还在,需要隐藏这两个栏。处理方法是先FindHide,如要恢复则FindShow,在每次操作后,均需要MoveWindow调整工作窗体。

MS_SIPBUTTON:下方中间的拼字那个窗口

menu_worker:下方的带颜色的长条,不算中间的拼字

HHTaskBar:上方的任务条

 

[DllImport("CoreDll.dll", SetLastError = true)]

public static extern IntPtr FindWindow(string className, string WindowsName);

[DllImport("coredll.dll", EntryPoint = "EnableWindow")]

public static extern bool EnableWindow(IntPtr hwnd, bool bEnable);

[DllImport("coredll.dll", EntryPoint = "ShowWindow")]

public static extern bool ShowWindow(IntPtr hwnd, bool bEnable);

[DllImport("coredll.dll")]

private static extern IntPtr ShowWindow(IntPtr hWnd, int _value);

[DllImport("aygshell.dll")]

public static extern bool SHFullScreen(IntPtr hWnd, uint dwState);

[DllImport("coredll.dll", SetLastError = true)]

public static extern bool EnumWindows(IntPtr lpEnumFunc, uint lParam);

[DllImport("coredll.dll")]

public static extern void GetClassName(IntPtr hwnd,StringBuilder s, int nMaxCount);

 

public const int SW_SHOW = 5; //显示窗口常量

public const int SW_HIDE = 0; //隐藏窗口常量

 

 

1.         先使用FindWindow找到某窗体的句柄,然后使用ShowWindow来控制窗体的显示与隐藏。只能控制一个窗体

2.         先使用EnumWindows枚举所有的窗体句柄,然后使用GetClassName获取某一个句柄对应窗体的名字,再使用ShowWindow来控制窗体的显示与隐藏。可以控制所有窗体

 

隐藏任务栏

1.         使用FindWindw+ShowWindow

2.         SHFullScreen

CRect rc;

SetRect( &rc, 0, 0, GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN ) );

MoveWindow( rc );

隐藏菜单栏

使用FindWindw+ShowWindow

在很多时候,我们仅需要隐藏任务栏,而对下方的输入法栏并不需要隐藏,如手机QQ的做法.但是在这个时候,弹出输入法软键盘的时候,屏幕上窗口将会自动向下收缩并露出上方被隐藏任务栏的区域.解决方法是在主窗口里响应 WM_WININICHANGE 消息即可,不需要在里面添加自定义代码,如下:

// 按动输入法时不自动弹出任务栏

void CMainFrame::OnWinIniChange(LPCTSTR lpszSection)

{

CFrameWnd::OnWinIniChange(lpszSection);

// TODO: 在此处添加消息处理程序代码

}

 

SHFullScreen的使用

public static bool FullScreen(IntPtr hWnd, bool isFull)

{

uint dwState = 0;

if (isFull)

     {

          dwState = SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON;

     }

     else

     {

          dwState = SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON | SHFS_SHOWSTARTICON;

     }

     return SHFullScreen(hWnd, dwState);

}

 

const uint SHFS_SHOWTASKBAR = 0x1;//任务栏

const uint SHFS_HIDETASKBAR = 0x2;

const uint SHFS_SHOWSIPBUTTON = 0x4;//输入法

const uint SHFS_HIDESIPBUTTON = 0x8;

const uint SHFS_SHOWSTARTICON = 0x10;//开始菜单栏

const uint SHFS_HIDESTARTICON = 0x20;

 

这种方法隐藏任务栏,在程序退出的时候不需要做什么特殊处理.但是在对 CWnd, CFrameWnd 一类的窗口做处理的时候一定要先 SetForegroundWindow 一次, CDialog 类型的窗口则不需要这一步.

另外在对 CWnd, CFrameWnd 类型窗口做处理的时候,还必须响应 WM_ACTIVATE 消息,在其中做同样的处理才能做到完全的隐藏任务栏效果.

由于此消息在程序退出及窗口切换的时候也被调用,因此直接在其中响应消息,会导致程序退出之后任务栏的刷新问题,及程序窗口无法切出.解决办法是设置成员变量判断程序是否退出,并检测此消息的参数来判断是否切换窗口.相关代码如下:

void CMainFrame::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)

{

CFrameWnd::OnActivate(nState, pWndOther, bMinimized);

if( !nState && !pWndOther )

   return;

if( !m_bExit )

{

   // 全屏窗口

   SetForegroundWindow();

   DWORD dwState = ( SHFS_HIDETASKBAR | SHFS_HIDESTARTICON | SHFS_HIDESIPBUTTON );

   ::SHFullScreen( m_hWnd, dwState );

   CRect rc;

   SetRect( &rc, 0, 0, GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics( SM_CYSCREEN ) );

   MoveWindow( rc );

}

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值