在VC中實現程式在啟動時隱藏 (轉)

worldblog發表於2007-12-12
在VC中實現程式在啟動時隱藏 (轉)[@more@]

  最近經常見論壇上有人問,在啟動時如何隱藏。以下是我總結的一些方法,歡迎大家討論,找出更好的方法。

  對於這類問題,大家最容易想到的可能就是在PreCreateWindow中新增cs.style &=~WS_VISIBLE;這是不可行的。程式仍可使用ShowWindow()將窗體顯示出來.

1.基於對話方塊的程式
  我在論壇上看到有人說在OnInitDialog()中加上ShowWindow(SW_H)對話方塊便不出現了,其實是不可行的。至於原因,我認為是是在OnInitDialog()後ShowWindow(SW_SHOW)讓對話方塊顯示的.可以新增下面程式碼:
CXXDlg::OnInitDialog()
{
  ... 
  Sleep(5000);
  return TRUE;

可以發現5秒後對話方塊才顯示出來.至於在何時呼叫的我也不清楚,但是我們可以在OnPaint()中加上ShowWindow(SW_HIDE),來達到隱藏的目的.不過使用的這種方法,會有一點閃爍.另外一種方法就是在OnInitDialog()中使用SetWindowPlacement()

GetWindowPlacement(&m_wp); //恢復時用
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);//從工作列中去掉.

WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);

還有一種更簡單的方法:在OnInitDialog()中呼叫下面程式碼.
SetWindowPos(&wndTop,0,0,0,0,NULL);

2.基於單文件的程式

  我們一般採用的方法就是將InitInstance()中的:
CXXApp::InitInstance()
{
  //m_pMainWnd->ShowWindow(SW_SHOW);
}
但是這樣窗體還會有閃爍。
因為MFC還要在ActiveFrame顯示,所以我們還需要新增下面程式碼:
void CMainFrame::ActivateFrame(int nCmdShow)
{
  nCmdShow=SW_HIDE;
  CFrameWnd::ActivateFrame(nCmdShow);
}
或者:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  AfxGetApp()->m_nCmdShow=SW_HIDE;
}
順便說一下,上面透過ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW)的方法來實現從工作列去掉按鈕,這樣當顯示時還要切換顯示的,其實還可以透過呼叫TaskbarList直接刪除和新增:
ITaskbarList的定義在shobjidl.h(vs)中。
也可以手動定義:
DECLARE_INTERFACE_(ITaskbarList,IUnknown)
{
  STDMETHOD(QueryInterface)(THIS_ REFIID riid,LPVOID* ppvObj) PURE;
  STDMETHOD_(ULONG,AddRef)(THIS) PURE;
  STDMETHOD_(ULONG,Release)(THIS) PURE;
  STDMETHOD(ActivateTab)(HWND) PURE;
  STDMETHOD(AddTab)(HWND) PURE;
  STDMETHOD(DeleteTab)(HWND) PURE;
  STDMETHOD(HrInit)(void) PURE;
};
BOOL CMy2App::InitInstance()

  CoInitialize(0);
  ITaskbarList *pObj;
  CoCreateInstance(CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER,IID_ITaskbarList,(void**)&pObj);
  pObj->DeleteTab(m_pMainWnd->m_hWnd); //從工作列上刪除
  //pObj->AddTab(m_pMainWnd->m_hWnd);  //新增

  pObj->Release();
  CoUninitialize();
}

所以我們還可以用將窗體最小化,並從任備欄上刪除按鈕的方法來實現隱藏.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992248/,如需轉載,請註明出處,否則將追究法律責任。

相關文章