C++ Windows Fenster: Zeitweiße unsichtbare Steuererlemente

Abcd12345

Lt. Junior Grade
Registriert
März 2006
Beiträge
483
Hi,

Ich habe mit follgendem Code ein Windowsfenster mit 3 Steuerelmenten erzeugt (Statischer Text, Editbox und Button). Leider werden die Steuerelmente nur sichtbar, wenn ich auf das Fenster klicke und kommen dann nur kurz zum Vorschein. Vieleicht weiß ja jemand eine Lösung für mein Problem :)

Code:
#include <windows.h>

// Prototyp der Callback-Funktion
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam);

// Hauptprogramm
//
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,
                    LPSTR lpcmdline, int ncmdshow)
{
  WNDCLASSEX windowclass; // Struktur für Fenstereigenschaften
  HWND       hWnd;        // Fenster-Handle
  MSG        message;     // Nachricht

  // Der Klassen-Name des Fensters ist frei wählbar
  const char szClassName[] = "Erstes Fenster";

  // Struktur mit gewünschten Eigenschaften füllen
  //

  // Größe der Struktur zwischenspeichern
  windowclass.cbSize = sizeof (WNDCLASSEX);

  // Fenster soll beim Verschieben neu gezeichnet werden
  windowclass.style = CS_HREDRAW | CS_VREDRAW;

  // Zeiger auf Callback-Funktion
  windowclass.lpfnWndProc = WindowProc;

  // Keine erweiterten Einstellungen
  windowclass.cbClsExtra = 0;
  windowclass.cbWndExtra = 0;

  // Instanz speichern
  windowclass.hInstance = hInst;

  // Icons und Cursor festlegen
  windowclass.hIcon   = LoadIcon (NULL, IDI_APPLICATION);
  windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  windowclass.hCursor = LoadCursor (NULL, IDC_ARROW);

  // Hintergrundfarbe festlegen
  windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1;

  // Ein Menü brauchen wir nicht
  windowclass.lpszMenuName = NULL;

  // Klassenname angeben
  windowclass.lpszClassName = szClassName;

  // Fensterklasse registrieren
  if (!RegisterClassEx (&windowclass) )
    return (0);

  // Das Fenster erzeugen
  hWnd = CreateWindowEx (NULL,
                         szClassName,
                         "Das erste Fenster!",
                         WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                         100, 100,
                         300, 250,
                         NULL,
                         NULL,
                         hInst,
                         NULL);

  // Prüfen, ob alles glatt ging
  if (hWnd == NULL)
    return (0);

  // Der "Herzschlag" des Programms.
  // Hier werden alle Nachrichten abgeholt,
  // übersetzt und weitergeleitet.
  while (GetMessage (&message, NULL, 0, 0) )
  {

		#define ID_BEISPIELTEXT 4000

		HWND hText;

		//Statischer Text als CHildfenster erzeugen
		hText = CreateWindow ("STATIC",
							  "Beispieltext",
							  WS_VISIBLE | WS_CHILD,
							  0, 100,
							  300, 20,
							  hWnd,
							  (HMENU) ID_BEISPIELTEXT,
							  hInst,
							  NULL);

		#define ID_BEISPIELBUTTON 4001

		HWND hButton;

		//Button als CHildfenster erzeugen
		hButton = CreateWindow ("BUTTON",
							  "Test",
							  BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
							  90, 150,
							  95, 40,
							  hWnd,
							  (HMENU) ID_BEISPIELBUTTON,
							  hInst,
							  NULL);

		#define ID_BEISPIELEDITBOX 4002

		HWND hEdit;

		//Button als CHildfenster erzeugen
		hEdit = CreateWindow ("EDIT",
							  "Bitte Text eingeben..",
							  WS_VISIBLE | WS_CHILD | WS_BORDER | ES_CENTER,
							  20, 10,
							  250, 20,
							  hWnd,
							  (HMENU) ID_BEISPIELEDITBOX,
							  hInst,
							  NULL);

    TranslateMessage (&message);
    DispatchMessage (&message);

  }

  // Programm beenden
  return (int)(message.wParam);

} // WinMain


// Callback-Funktion zur Nachrichtenverarbeitung
//
LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam)
{
  // Messages auswerten
  switch (message)
  {
    // Fenster schließen? (Auch Alt-F4)
    case WM_DESTROY:
    {
      // Nachricht zum Beenden schicken
      PostQuitMessage (0);
      return (0);

    }


	case WM_RBUTTONDOWN:
	{
		//Nachricht zum Beenden schicken
		PostQuitMessage (0);
		return (0);
	}

    // Wurde eine Taste gedrückt?
    case WM_KEYDOWN:
    {
      // Ja, also je nach Taste verzweigen
      switch (wParam)
      {
        // Wurde "Escape" gedrückt?
        case VK_ESCAPE:
        {
          // Ja, also Nachricht zum Beenden schicken
          PostQuitMessage (0);
          return (0);

        }
      }
    } break;
  } 

  // Die Nachricht wurde nicht von uns verarbeitet, also
  // von Windows verarbeiten lassen.
  return (DefWindowProc (hWnd, message, wParam, lParam) );

} // WindowProc

Ich würde mich über Hilfe freuen :)
 
Hi,

du must die Steuerelemente im WindowProc erstellen.

Code:
....
  case WM_CREATE:
  {
    #define ID_BEISPIELTEXT 4000

    HWND hText;

    //Statischer Text als CHildfenster erzeugen
    hText = CreateWindow ("STATIC",
                "Beispieltext",
                WS_VISIBLE | WS_CHILD,
                0, 100,
                300, 20,
                hWnd,
                (HMENU) ID_BEISPIELTEXT,
                hInstance,
                NULL);

    #define ID_BEISPIELBUTTON 4001

    HWND hButton;

    //Button als CHildfenster erzeugen
    hButton = CreateWindow ("BUTTON",
                "Test",
                BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                90, 150,
                95, 40,
                hWnd,
                (HMENU) ID_BEISPIELBUTTON,
                hInstance,
                NULL);

    #define ID_BEISPIELEDITBOX 4002

    HWND hEdit;

    //Button als CHildfenster erzeugen
    hEdit = CreateWindow ("EDIT",
                "Bitte Text eingeben..",
                WS_VISIBLE | WS_CHILD | WS_BORDER | ES_CENTER,
                20, 10,
                250, 20,
                hWnd,
                (HMENU) ID_BEISPIELEDITBOX,
                hInstance,
                NULL);
    break;
  }
....
 
Kann es sein, dass die Steuerelemte immer wieder aufblinken, weil sie im Rahmen der Schleife immer und immer wieder erstellt werden?
 

Ähnliche Themen

Zurück
Oben