Knowledge Base Nr: 00157 apphide.cpp - http://www.swe-kaiser.de

MFC: Applikationen sichtbar/unsichtbar machen
Fensterverhalten ändern (Standardschaltflächen, Zentrieren)

  
//fremde applikationen: suchen nach fenstertitel evtl. eignet sich der ClassName besser
//z.b. notepad ohne geladenes dokument
CWnd* pWnd = FindWindow(NULL, "Unbenannt - Editor");

//eigene applikation:
//über PreCreateWindow() falls immer versteckt
//oder dynamisch:
CWnd* pWnd = AfxGetMainWnd();

if (pWnd)
{
pWnd->ShowWindow(SW_HIDE); //SW_SHOW
}

///////////////////
///////// parsed die kommandozeile und steuert fremde applikationen

CString strCmd(::GetCommandLine());

int nAction = SW_SHOW;
if (strCmd.Find("action=h")>0)
nAction = SW_HIDE;
if (strCmd.Find("action=s")>0)
nAction = SW_SHOW;
if (strCmd.Find("action=x")>0)
nAction = SW_MAXIMIZE;
if (strCmd.Find("action=m")>0)
nAction = SW_MINIMIZE;

char* pszTitle = 0;
char* pszClass = 0;
char* pszCmd = strCmd.GetBuffer(300);

int nPosT = strCmd.Find("title=");
if (nPosT>0)
{
pszTitle = pszCmd+nPosT+6;
}

int nPosC = strCmd.Find("class=");
if (nPosC>0)
{
pszClass = pszCmd+nPosC+6;
}

CWnd* pWnd = FindWindow(pszClass, pszTitle);

if (!pWnd || (strCmd.Find("?")>0))
{
pWnd->ShowWindow(nAction);
PostQuitMessage(0);
}
else
{
AfxMessageBox("Fenster umschalten (c)FAW 2003\n\n"
"usage: hideapp [?] [action=a] title=xxx|class=xxx\n\n"
"?\t diese hilfe\n"
"action=h\n fenster verstecken\n"
"action=s\n fenster anzeigen (default)\n"
"action=x\n fenster maximieren\n"
"action=m\n fenster minimieren\n"
"title=xxxxx\nfenstertitel\n"
"class=xxxxx\nfensterklasse\n"
);
PostQuitMessage(0);
}

///////////////////
//Dieser Code erstellt ein Hauptrahmenfenster ohne Minimieren- und Maximieren-Schaltflächen und
//ohne einen in der Größe veränderbaren Rahmen. Auf dem Bildschirm wird es als zentriertes
//Fenster angezeigt.

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// Erstellen eines Fensters ohne min-/max-Schaltflächen oder größenveränderbaren Rahmen
cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER;

// Verändern der Fenstergröße auf 1/3 der Bildschirmgröße und anschließendes Zentrieren
cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 3;
cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 3;
cs.y = ((cs.cy * 3) - cs.cy) / 2;
cs.x = ((cs.cx * 3) - cs.cx) / 2;

// Aufruf der Basisklassenversion
return CFrameWnd::PreCreateWindow(cs);
}

///////////////////
//Dieser Code erstellt untergeordnete MDI-Fenster ohne eine Maximieren-Schaltfläche.

BOOL CMyChildWnd::PreCreateWindow(CREATESTRUCT& cs)
{
// Erstellen eines untergeordneten Fensters ohne die Schaltfläche Maximieren
cs.style &= ~WS_MAXIMIZEBOX;

// Aufruf der Basisklassenversion
return CMDIChildWnd::PreCreateWindow(cs);
}