Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
// main_cpp //
#include <Windows.h>
#include <iostream>
int width = 640;
int height = 420;
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
bool InitWndClassEx ( WNDCLASSEX *WndClassEx, HINSTANCE hInstance, const char szClassName[] = "Hallo");
const char szClassName[] = "Hallo";
char szTitle[] = "1.Programm Grafic3 Silent1297 2011 ©";
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR szCmdLine, int iCmdShow)
{
WNDCLASSEX WndClassEx; // legt die Grundeigenschaften für das Fenster fest.
WNDCLASSEX WndClassExChild; //Grundeigenschaften für ChildWindow
HWND hWnd; //legt die Eigenschaften des Fensters fest.
MSG msg; //darin werden die Daten gespeichert.
// Registrierung von WndClassEx //
InitWndClassEx ( &WndClassEx, hInstance, "WndClassEx");
RegisterClassEx ( &WndClassEx );
// Fenster Erstellen //
hWnd = CreateWindowEx (NULL, // beeinhaltet die Folgenden Eigenschaften und die Eigenschaften aus WndClassEx
szClassName, //hierüber werden die Eigenschaften aus WndClassEx. eingebunden
szTitle,
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX, //Fenster (Minimierungsbutton.....
300, //Abstand-Oben
600, //Abstand-Links
width, // Breite
height, // Höhe
NULL,
NULL,
hInstance,
NULL);
if ( hWnd == NULL )
{MessageBox ( NULL, "Create Window failed", "Error", MB_OK);
return false;
}
ShowWindow( hWnd, iCmdShow);
{
int cx = GetSystemMetrics(SM_CXSCREEN); //cx = desktopbreite ermitteln
int cy = GetSystemMetrics(SM_CYSCREEN);//cx = desktophöhe ermitteln
int px = (cx - width) / 2; //AbstanddesFensters von links errechnen
int py = (cy - height) / 2; //AbstanddesFensters von oben errechnen
MoveWindow( hWnd, px, py, width, height, true);
}
HINSTANCE hChildInst = NULL;
HWND hWndChild;
HWND hWndChild2;
// Registrierung von ChildWindow1 //
InitWndClassEx ( &WndClassExChild, hInstance, "WndClassExChild");
hWndChild = CreateWindowEx (WS_EX_CLIENTEDGE, szClassName,
"Child Window silent1297", WS_CAPTION | WS_CHILD| WS_VISIBLE,
70, 20, 250, 300, // LinksAbstand, Obenabstand, Breite, Höhe
hWnd, NULL, hChildInst, NULL );
// Registrierung von ChildWindow2 //
InitWndClassEx ( &WndClassExChild, hInstance, "WndClassExChild2");
hWndChild2 = CreateWindowEx (WS_EX_CLIENTEDGE, szClassName,
"Child Window - 2 silent1297", WS_CAPTION | WS_CHILD| WS_VISIBLE,
320, 20, 250, 300, // LinksAbstand, Obenabstand, Breite, Höhe
hWnd, NULL, hChildInst, NULL );
SetClassLong ( hWndChild2, GCL_HBRBACKGROUND, (LONG) GetStockObject (BLACK_BRUSH));
while( GetMessage ( &msg, hWnd, NULL, NULL) > NULL) // -1 = Fehler | 0 // > 0
{
TranslateMessage( &msg ); // wird in Character-Message übersetzt
DispatchMessage ( &msg ); // wird verschickt an die Callback Funktion
};
// WINDOW-PROCEDUR(Einleitungsteil) -> WNDCLASSEX(Registrierung) -> HWND(Fenstereinstellungenfestlegen) -> MESSAGELOOP(Messages übersetzen und an die CALLBACK-Funktion weiterverschicken)
return 0;
}
LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) //Gehirn des eigentlichen Windows, Verarbeitung von Messages...
{
//Jede Message hat 2 Informationen ( wParam und lParam)
switch (msg)
{
case WM_CLOSE: //Programm Ende
{
DestroyWindow( hWnd);
}
break;
case WM_DESTROY: //Fenster Ende (Wenn auf das X-geklickt wird
PostQuitMessage(0);
break;
default:
return DefWindowProc ( hWnd, msg, wParam, lParam);
}
}
bool InitWndClassEx ( WNDCLASSEX *WndClassEx , HINSTANCE hInstance, const char *szClassName) //Funktion mit Defaultwerten für zB ChildWindows
{
WndClassEx->cbSize = sizeof( *WndClassEx);
WndClassEx->style = NULL;
WndClassEx->lpfnWndProc = (WNDPROC)WndProc; // hWnd -> CreateWindow (szClassName ) -> WndClass.
WndClassEx->cbClsExtra = NULL;
WndClassEx->cbWndExtra = NULL;
WndClassEx->hInstance = hInstance;
WndClassEx->hIcon = LoadIcon( NULL, IDI_WARNING); //Icon
WndClassEx->hCursor = LoadCursor( NULL,IDC_ARROW); //Cursor
WndClassEx->hbrBackground = (HBRUSH) GetStockObject ( WHITE_BRUSH) ; //Fensterfarbe
WndClassEx->lpszMenuName = NULL;
WndClassEx->lpszClassName = szClassName; // C-String
WndClassEx->hIconSm = LoadIcon (NULL, IDI_APPLICATION);
if ( !RegisterClassEx ( WndClassEx ))
{MessageBox ( NULL, "Register Class failed", "Error", MB_OK);
return false;
}
}
Beim Code fällt mir nichts auf. Wenn es aber fehlschlägt rufe doch anschließend mal die Funktion GetLastError() auf und schaue, welcher Fehlercode dort zurückgegeben wird. Die Beschreibungen findest du hier: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspxEs wird gar nichts erzeugt (kein Parentwindow -> keine ChildWindows).
Doch das geht, aber dann brauchst du Klasse auch nur ein einziges Mal registrieren, also nur ein Aufruf von InitWndClassEx() für beide Child Windows.Geht es nicht, dass ich beide Childwindows eine WndClassExChild nutzen lasse ?