Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » 2 Fenster

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
09.04.2004, 12:52 Uhr
RedEagle



Habe ein fenster geschrieben:

C++:
int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE, PSTR, int nFunsterStil)
{

char szName[] = "Fensterklasse";
HBRUSH MyBrush = CreateSolidBrush(RGB(0,150,255)); //Eigene BG-Color

WNDCLASS wc;

wc.style         = CS_HREDRAW | CS_VREDRAW; //CS = Class Style
wc.lpfnWndProc   = WndProc;
wc.cbClsExtra    = 0;
wc.cbWndExtra    = 0;
wc.hInstance     = hThisInstance;
wc.hIcon         = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = MyBrush;//(HBRUSH) COLOR_BACKGROUND;
wc.lpszMenuName  = NULL;
wc.lpszClassName = szName;

  RegisterClass (&wc);
  
HWND hwnd = CreateWindow (szName, "Hauptmenue", WS_SYSMENU | WS_MINIMIZEBOX, 10, 10, 150, 360, NULL, NULL, hThisInstance, NULL);

ShowWindow   (hwnd, nFunsterStil);
UpdateWindow (hwnd);

//Nachrichtenschleife
MSG msg;
     while (GetMessage(&msg, NULL, 0, 0))
     {
      TranslateMessage(&msg);
      DispatchMessage (&msg);
     }
return msg.wParam;
}

//Windows-Nachrichten-Prozedur
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)


Und möchte, das sich noch ein fenster öffnet, wenn man auf einen Button klickt:

Wie mache ich das?? und wie bekomme ich das mit den Buttons' auf dem neuen fenster hin??
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.04.2004, 12:55 Uhr
Oliver
S2-Pixelgeneral


Indem du ein neues Fenster mittels CreateWindow(Ex) am Anfang anlegst (ohne WS_VISIBLE) und wenn man auf den Button drückt zeigst du es einfach mit ShowWindow(...) an.
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.04.2004, 13:06 Uhr
RedEagle



Aber auf dem Fenster sollen auch Buttons sein, und wenn man die drückt soll ein ereigniss geschehen (kommt das dann in die gleiche nachrichten-Prozedur wie die Buttons von dem ersten fenster??
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.04.2004, 13:17 Uhr
RedEagle



In der int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE, PSTR, int nFunsterStil) Funktion

C++:
//Hauptfenster
HWND hwnd = CreateWindow (szName, "Hauptmenue", WS_SYSMENU | WS_MINIMIZEBOX, 10, 10, 150, 360, NULL, NULL, hThisInstance, NULL);

//2. Fenster
HWND hwnd2 = CreateWindow (szName, "Office" , WS_SYSMENU | WS_MINIMIZEBOX, 20, 20, 150, 360, NULL, NULL, hThisInstance, NULL);




Meine Nachrichten Prozedur:

C++:
case WM_COMMAND :
                    switch(LOWORD(wParam))
                    {
                     case  1 :
                               ShowWindow   (hwnd2, nFunsterStil);
                               break;



Jetzt kommen ncih fehler über die Variablen-Deklaration:
wo, wie und mit welchem type muss ich folgende Variablen Deklarieren:

szName
nFunsterStil

Hir mal der komplette code:

C++:
/*
name.c_str()
*/


#include <windows.h>
#include <stdio.h>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

///Globale Variablen
stringstream ss;

string schaltfl_01 = "Office",
       schaltfl_02 = "Bilder",
       schaltfl_03 = "Brennen",
       schaltfl_04 = "Editor",
       schaltfl_05 = "Spiele",
       schaltfl_06 = "Internet",
       schaltfl_07 = "Laufwerke",
       schaltfl_08 = "Musik",
       schaltfl_09 = "System",
       schaltfl_10 = "Ordner",
       schaltfl_11 = "Links",
       schaltfl_12 = "Tools",
       schaltfl_13 = "Beenden";

string office[13];
string bilder[13];
string brennen[13];
string editor[13];
string spiele[13];
string internet[13];
string laufwerke[13];
string musik[13];
string system_[13];
string ordner[13];
string links[13];
string tools[13];


///Prototypen
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); //Deklaration der Windows-Nachrichten-Prozedur

///Funktionen
int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE, PSTR, int nFunsterStil)
{

char szName[] = "Fensterklasse";
HBRUSH MyBrush = CreateSolidBrush(RGB(0,150,255)); //Eigene BG-Color

WNDCLASS wc;

wc.style         = CS_HREDRAW | CS_VREDRAW; //CS = Class Style
wc.lpfnWndProc   = WndProc;
wc.cbClsExtra    = 0;
wc.cbWndExtra    = 0;
wc.hInstance     = hThisInstance;
wc.hIcon         = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = MyBrush;//(HBRUSH) COLOR_BACKGROUND;
wc.lpszMenuName  = NULL;
wc.lpszClassName = szName;

  RegisterClass (&wc);
  
HWND hwnd = CreateWindow (szName, "Hauptmenue", WS_SYSMENU | WS_MINIMIZEBOX, 10, 10, 150, 360, NULL, NULL, hThisInstance, NULL);

HWND hwnd2 = CreateWindow (szName, "Office" , WS_SYSMENU | WS_MINIMIZEBOX, 20, 20, 150, 360, NULL, NULL, hThisInstance, NULL);

ShowWindow   (hwnd, nFunsterStil);
UpdateWindow (hwnd);

//Nachrichtenschleife
MSG msg;
     while (GetMessage(&msg, NULL, 0, 0))
     {
      TranslateMessage(&msg);
      DispatchMessage (&msg);
     }
return msg.wParam;
}

//Windows-Nachrichten-Prozedur
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static HWND hwndButton1, hwndButton2, hwndButton3, hwndButton4, hwndButton5,
             hwndButton6, hwndButton7, hwndButton8, hwndButton9, hwndButton10,
             hwndButton11, hwndButton12, hwndButton13;
  
  switch(message)
  {
   case WM_PAINT : hdc = BeginPaint (hwnd, &ps);
                    SetTextColor(hdc, RGB(25 , 25 , 200));
                    SetBkColor  (hdc, RGB(0  , 150, 255));
                    TextOut(hdc, 30, 20, "Hauptmenue", 10); //device context, x, y, string, string-Länge
                   EndPaint (hwnd, &ps);
                   return 0;
  
   case WM_CREATE : hwndButton1  = CreateWindow("button", schaltfl_01.c_str(), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 19,  50, 110, 20, hwnd, (HMENU)1, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL);
                    hwndButton2  = CreateWindow("button", schaltfl_02.c_str(), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 19,  70, 110, 20, hwnd, (HMENU)2, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL);

                    hwndButton3  = CreateWindow("button", schaltfl_03.c_str(), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 19,  90, 110, 20, hwnd, (HMENU)3, (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE), NULL);

                    //usw. bis zum 13. Button

                    return 0;
  
   case WM_COMMAND :
                    switch(LOWORD(wParam))
                    {
                     case  1 :
                               ShowWindow   (hwnd2, nFunsterStil);
                               break;
                     case 13 : PostQuitMessage(0);
                               return 0;
                    }
                    break;
                  
   case WM_DESTROY : PostQuitMessage(0);
                     return 0;
  
  }

return DefWindowProc (hwnd, message, wParam, lParam);
}


Insgesammt Brauche ich 13 neue Fenster, währe nett, wenn ihr mir mal eins einbauen würdet !!Mit erklärung Bitte, das ich den Rest selber machen kann

im vorraus
--
MFG RedEagle

Dieser Post wurde am 09.04.2004 um 13:22 Uhr von RedEagle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.04.2004, 13:58 Uhr
Oliver
S2-Pixelgeneral


Na dann musst für jedes Fenster eine eigene WNDCLASS erstellen, da kannst du dann die Nachrichtenprozedur für das jeweilige Fenster festlegen.
Jedes Fenster muss seine eigene Nachrichtenprozedur haben.

Also musst du erstmal 13 WinProcs definieren:


C++:
LRESULT CALLBACK WndProc1 (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc2 (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc3 (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc4 (HWND, UINT, WPARAM, LPARAM);  
// bis zum 13.




Dann die halt in der WNDCLASS Stuktur festlegen


C++:

WNDCLASS wc1,wc2,wc3,wc4,wc5; // bis zum 13.




Dann halt die Strukturen füllen, da brauchst du ja dann nur den Klassennamen und den Prozedurname ändern:


C++:
// die WNDCLASS brauch ja nicht bis auf den Klassennamen und Prozedurnamen geändert werden
wc5=wc4=wc3=wc2=wc1=wc;

wc1.lpfnWndProc=WndProc1;
wc1.lpszClassName="Fensterklasse1";
wc2.lpfnWndProc=WndProc2;
wc2.lpszClassName="Fensterklasse2";
wc3.lpfnWndProc=WndProc3;
wc3.lpszClassName="Fensterklasse3";
wc4.lpfnWndProc=WndProc3;
wc4.lpszClassName="Fensterklasse4";
// ... wieder bis zum 13.





Dann die Fenster erzeugen erzeugen:


C++:

HWND hwnd1= CreateWindow ("Fensterklasse1", "Fenster 1", WS_SYSMENU | WS_MINIMIZEBOX, 10, 10, 150, 360, NULL, NULL, hThisInstance, NULL);
HWND hwnd2= CreateWindow ("Fensterklasse2", "Fenster 2", WS_SYSMENU | WS_MINIMIZEBOX, 10, 10, 150, 360, NULL, NULL, hThisInstance, NULL);
HWND hwnd3= CreateWindow ("Fensterklasse3", "Fenster 3", WS_SYSMENU | WS_MINIMIZEBOX, 10, 10, 150, 360, NULL, NULL, hThisInstance, NULL);
HWND hwnd4= CreateWindow ("Fensterklasse1", "Fenster 4", WS_SYSMENU | WS_MINIMIZEBOX, 10, 10, 150, 360, NULL, NULL, hThisInstance, NULL);
// bis zum 13.




So nun musst du die WndProcs implementieren:


C++:

LRESULT CALLBACK WndProc1 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:

switch( HIWORD(wParam))
{
// ein Button von Fenster 1 wurde gedrückt

case BN_CLICKED:

// auswerten welcher
switch(LOWORD(wParam))
{
case BUTTONID: /* hier die ButtonID */


// Befehle, wenn Button gedrückt wurde

}

}

}

}





Kann ja mal noch ein Beispiel schnell mal machen...
--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.04.2004, 14:40 Uhr
Oliver
S2-Pixelgeneral


So fertig, hier ist ein Beispiel, vielleicht hilft dir das ja weiter:


C++:
#include <windows.h>

// die beiden Fensterhandles
HWND hwnd1, hwnd2;

// 2 Buttons
HWND hbutton1,hbutton2;

// die WndProcs
LRESULT CALLBACK WndProc1 (HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc2 (HWND, UINT, WPARAM, LPARAM);

// ButtonsIds
#define ID_BUTTON1 1
#define ID_BUTTON2 2


int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{

    // WndClasses
    WNDCLASS wc1, wc2;

    HBRUSH MyBrush = CreateSolidBrush(RGB(0,150,255)); //Eigene BG-Color

    wc1.style         = CS_HREDRAW | CS_VREDRAW;
    wc1.lpfnWndProc   = WndProc1;
    wc1.cbClsExtra    = 0;
    wc1.cbWndExtra    = 0;
    wc1.hInstance     = hInstance;
    wc1.hIcon         = LoadIcon(NULL, IDI_WINLOGO);
    wc1.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc1.hbrBackground = MyBrush;
    wc1.lpszMenuName  = NULL;
    wc1.lpszClassName = "Fensterklasse1";

    // zu faul alles nochmal zu schreiben, deswegen nur relevante Stellen ändern

    wc2=wc1;

    wc2.lpszClassName="Fensterklasse2";
    wc2.lpfnWndProc=WndProc2;

    RegisterClass(&wc1);
    RegisterClass(&wc2);

    // Fenster erstellen
    hwnd1=CreateWindow("Fensterklasse1","Fenster 1",WS_OVERLAPPEDWINDOW,0,0,400,400,NULL,NULL,hInstance,NULL);
    hwnd2=CreateWindow("Fensterklasse2","Fenster 2",WS_OVERLAPPEDWINDOW,40,40,400,400,NULL,NULL,hInstance,NULL);

    // 2 Buttons erstellen
    hbutton1=CreateWindow("button","Fenster 2 anzeigen",WS_CHILD |WS_VISIBLE | BS_PUSHBUTTON,20,20,200,20,hwnd1,(HMENU)ID_BUTTON1,hInstance,NULL);
    hbutton2=CreateWindow("button","MessageBox anzeigen",WS_CHILD |WS_VISIBLE | BS_PUSHBUTTON,20,20,200,20,hwnd2,(HMENU)ID_BUTTON2,hInstance,NULL);


    // Nur 1. Fenster anzeigen
    ShowWindow   (hwnd1, nCmdShow);
    UpdateWindow (hwnd1);

    MSG msg;
     while (GetMessage(&msg, NULL, 0, 0))
     {
      TranslateMessage(&msg);
      DispatchMessage (&msg);
     }
     return msg.wParam;
}


// NachrichtenProzedur für Fenster 1
LRESULT CALLBACK WndProc1(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:

    // mit HIWORD(wParam) erfährt man das Ereignis
    
    if(HIWORD(wParam)==BN_CLICKED&&LOWORD(wParam)==ID_BUTTON1)
    {
        ShowWindow(hwnd2,SW_NORMAL);
        UpdateWindow(hwnd2);
    }

    return 0;

case WM_DESTROY:

    PostQuitMessage(0);
    return 0;

default:

    return DefWindowProc (hwnd, message, wParam, lParam);

}

}




// NachrichtenProzedur für Fenster 2
LRESULT CALLBACK WndProc2(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   switch(message)
   {
   case WM_COMMAND:

       if(HIWORD(wParam)==BN_CLICKED&&LOWORD(wParam)==ID_BUTTON2)
           MessageBox(hwnd,"Button auf dem 2. Fenster wurde betätigt.","Hallo",MB_OK);


        return 0;

   default:

       return DefWindowProc (hwnd, message, wParam, lParam);

    }


}


--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.04.2004, 15:14 Uhr
RedEagle



mal
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.04.2004, 22:05 Uhr
~RedEagle
Gast


Habe das jetzt so in der Nachrichtenschleife des 1. Fenster.

C++:
case WM_COMMAND :  
                    switch(LOWORD(wParam)) //Wenn man auf Button1 Klickt, dann:
                    {
                     case  1 : ShowWindow(hwnd1,SW_NORMAL);
                               UpdateWindow(hwnd1);



Und der Fehler kommt:
`hwnd1' undeclared (first use this function)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.04.2004, 11:30 Uhr
RedEagle



Habe den Fehler durch Globale Variablen gelöst, wenn ich Kompileire kommen keine Fehler und keine Warnungen, aber es wird kein Fenster angezeigt!?!?
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.04.2004, 18:09 Uhr
RedEagle



Habe den Fehelrt gefunden, weiß aber nicht wie ich das lösen kann:
Wenn ich anstand "Fensterklasse1" usw Nur "fenserklasse" (ohne zahlen hinter) einsetht, das gehts, allerdings wird immer der selbe Fensterinhalt angezeigt
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: