Warum wird das Fenster nicht angezeigt?
-
Hi!
Ich bin Anfänger in WinApi und habe mal ein ganz einfaches Programm geschrieben, das ein einfaches Fenster darstellen soll.
Hier ist mal der Quellcode:
#include <windows.h> //Prototypen LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrecInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASSEX wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, "Name"); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = "Name"; wc.lpszClassName = "Name"; wc.cbSize = sizeof(WNDCLASSEX); RegisterClassEx(&wc); hwnd = CreateWindow("Name", "My 1. Application", WS_OVERLAPPEDWINDOW, 0, 0,500, 500,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam) { switch (umsg) { case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, umsg, wParam, lParam); }
Das Problem is, dass das Fenster bei mir nicht angezeigt wird. Aber wenn ich bei den Prozessen von Windows gucke, dann steht es dabei.
An was liegt das??? Hab ich einen Fehler im Quellcode?? Oder liegt es an was anderem??
Vielen Dank für die Hilfe schon mal im voraus.
Gruß Friggel
-
#include <windows.h> /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ char szClassName[ ] = "WindowsApp"; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName = NULL; /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default color as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, nFunsterStil); /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }
-
Liegt das etwa nur an dem Namen für die Fensterklasse usw.???
Was anderes hab ich nicht gesehen in deinem Code.
-
Du musst entweder alle Member der WNDCLASSEX-Struktur besetzen (bei dir fehlt hIconSm) oder die Struktur mit 0 initialisieren:
WNDCLASSEX wc = {0};
Oder auch mit ZeroMemory o.ä.
-
Muss man bei der Fensterklasse immer alles angeben?? Das is ja blöd.
Naja dann werd ich das später nochmal ausprobieren, wenn ich das hIconSm dazu mach.
Danke für die Hilfe.
Gruß Friggel
-
FriggelTest schrieb:
Muss man bei der Fensterklasse immer alles angeben?? Das is ja blöd.
Nein! Das musst du nicht! Ich hab doch oben schon geschrieben, dass du die Struktur dann eben mit 0 initialisieren musst
-
Wenn ich die Struktur mit 0 initialisier, kann ich dann trotzdem noch z.B. ein Icon angeben, aber hIconsm nicht???
Das war das was ich gemeint hab.
Oder muss ich wenn ich die Struktur mit 0 initialisiere dann gar nichts mehr angeben???
Ich hoff du verstehst was ich mein.
Gruß Friggel
-
Um deinem Code aufzugreifen:
WNDCLASSEX wc = {0}; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, "Name"); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = "Name"; wc.lpszClassName = "Name"; wc.cbSize = sizeof(WNDCLASSEX);
Das ist eigentlich bei allen Strukturen so, dass du wenn du nicht alle Member besetzt, sie vorher mit 0 initialisieren musst
-
Ja ok dann isses klar.
Danke für deine Hilfe!
Gruß Friggel