childwindow zeigt sich nicht



  • gibt es für childfenster keine standart fensterklasse?



  • Kommt darauf an, was du mit Childfester meinst! 🙄
    Ob Child oder Parent hat nichts mit der Fensterklasse zu tun 😉



  • ich habe meine classe nun geschrieben aber was ist mit "wndclass.lpfnWndProc = (WNDPROC)WndProc;"?
    was gebe ich da als procedur ein?
    muß ich ne neue procedur schreiben?
    ist der code hier richtig?

    case WM_COMMAND:
    switch(wParam)
    {
    case but1:
    DestroyWindow(hWnd);
    break;

    case but2:

    HWND hwnd ;
    MSG msg ;
    WNDCLASS wndclass;
    LPTSTR text = TEXT("childfenster");

    memset(&wndclass,0,sizeof(wndclass));

    wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE;
    wndclass.lpfnWndProc = (WNDPROC)WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hIcon = NULL;
    wndclass.hInstance = hInstance;
    wndclass.hCursor = NULL;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = text;

    RegisterClass(&wndclass);

    hwnd = CreateWindow(text, text,WS_VISIBLE,0, 0, 240, 320, NULL,NULL, hInstance, NULL);

    ShowWindow (hwnd, SW_SHOW) ;
    UpdateWindow (hwnd) ;

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

    }

    p.s. ich progge unter win ce



  • Deine Fensterklasse musst (darsft?) du nur einmal registrieren und eine zweite Message-Loop brauchst du nicht
    Ein WndProc brauchst du aber schon (eine zweite), da sich das Fenster ja anders verhalten soll, wie das Hauptfenster 😉



  • warum darf ich die fensterklasse nicht nochmal registrieren?
    und muß ich nicht wieder ne messageloop anlegen?



  • noobie schrieb:

    warum darf ich die fensterklasse nicht nochmal registrieren?

    Es macht eben keinen Sinn und ich nehme an, dass der zweite Aufruf der RegisterClass(Ex)-Funktion für dieselbe Fensterklasse auch fehlschlagen wird.

    noobie schrieb:

    und muß ich nicht wieder ne messageloop anlegen?

    Nein, du hast im Normalfall nur die eine Message-Loop in WinMain, die ja per DispatchMessage die Nachrichten an die jeweilige WndProc des zugehörigen Fensters verteilt 😉



  • war bis jetzt im urlaub.

    das mit der messageloop hab ich verstanden.

    das mit der registrierung meiner fensterklasse fürs childfenster nicht.
    ich dachte immer man muss jede fensterklasse registrieren die man nutzen will?
    schließlig werden alle daten dann in eine WNDCLASS variable gespeichert um diese dann zu nutzen.

    warum sollte jetzt die registrierung der fensterklasse meines childfensters wegfallen?



  • Du registriest einmal eine Fenster-Klasse (evtl. auch mehrere) und kannst dann von jeder Klasse praktisch beliebig viele Fenster erzeugen



  • danke für die erklärung.

    hab jetzt alles umgeändert.
    leider funzt es immer noch nicht.

    case but2:

    WNDCLASS wndclass;
    LPTSTR event = TEXT("Event");

    memset(&wndclass,0,sizeof(wndclass));

    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = (WNDPROC)WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hIcon = NULL;
    wndclass.hInstance = ((LPCREATESTRUCT) lParam)->hInstance;
    wndclass.hCursor = NULL;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = event;

    hwndevent = CreateWindow(event,event,WS_VISIBLE | WS_CHILD,0, 0, 240, 320, hWnd,NULL,((LPCREATESTRUCT) lParam)->hInstance, NULL);
    if(hwndevent == NULL)
    {
    MessageBox(hWnd,TEXT("nix"),TEXT("nix"),MB_OK);
    }

    ShowWindow (hwndevent, SW_SHOW) ;
    UpdateWindow (hwndevent) ;

    break;

    hab ich noch etwas falsch gemacht?



  • Du musst deine Fensterklasse schon einmal registrieren 😉 (ich würde dies aber nicht in WM_COMMAND machen, sondern z.B. bei WM_CREATE)



  • ist ja alles schön und gut.
    habe jetzt auch die registrierung in die create gepackt.
    trotzdem kommt nix.

    #include <afxwin.h>
    #include <afxext.h>
    
    #define but1 1
    #define but2 2
    #define but3 3
    #define but4 4
    #define but5 5
    #define but6 6
    
    LRESULT MainWndProc(HWND,UINT,WPARAM,LPARAM);
    LRESULT WndProc(HWND,UINT,WPARAM,LPARAM);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPTSTR szCmdLine, int iCmdShow)
    {
         HWND        hwnd ;
         MSG         msg ;
         WNDCLASS  wndclass;
    	 LPTSTR text = TEXT("Interaktive-Wanderkarte");
    
    	 memset(&wndclass,0,sizeof(wndclass));
    
    	 wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE;
    	 wndclass.lpfnWndProc = (WNDPROC)MainWndProc;
    	 wndclass.cbClsExtra = 0;
    	 wndclass.cbWndExtra = 0;
    	 wndclass.hIcon = NULL;
    	 wndclass.hInstance = hInstance;
    	 wndclass.hCursor = NULL;
    	 wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    	 wndclass.lpszMenuName = NULL;
    	 wndclass.lpszClassName = text;
    
    	 RegisterClass(&wndclass);
    
         hwnd = CreateWindow(text, text,WS_VISIBLE,0, 0, 240, 320, NULL,NULL, hInstance, NULL);
    
         ShowWindow (hwnd, SW_SHOW) ;
         UpdateWindow (hwnd) ;
    
         while (GetMessage (&msg, NULL, 0, 0))
              {
    			 TranslateMessage (&msg) ;
    			 DispatchMessage (&msg) ;
    	 }
         return msg.wParam ;
    }
    
    LRESULT MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
      static HWND hwndbut1,hwndbut2,hwndbut3,hwndbut4,hwndbut5,hwndbut6,hwndevent;
      static HINSTANCE hInstance;  
      static HBITMAP hhintergrund,hbiber1,hbiber2,hbiber3,hbiber4,hbiber5,hbiber6;
      static BITMAP hintergrund,biber1,biber2,biber3,biber4,biber5,biber6;
      static HDC hdc, hdcmem, hdcmem1;
      static PAINTSTRUCT ps;
      static WNDCLASS wc;
      static LPTSTR event = TEXT("Event"); 
    
      //SHFullScreen(hWnd,SHFS_HIDESIPBUTTON | SHFS_HIDETASKBAR | SHFS_HIDESTARTICON);	
      switch(message)
      {
      case WM_CREATE:
    
    	  memset(&wc,0,sizeof(wc)); 
    
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = (WNDPROC)WndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hIcon = NULL; 
    wc.hInstance = ((LPCREATESTRUCT) lParam)->hInstance; 
    wc.hCursor = NULL; 
    wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); 
    wc.lpszMenuName = NULL; 
    wc.lpszClassName = event; 
    
    RegisterClass(&wc);
    
    	  hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
    	  hwndbut1 = CreateWindow (L"button", L"",WS_CHILD | WS_VISIBLE | BS_OWNERDRAW ,30, 24, 75, 75, hWnd, (HMENU) but1,hInstance, NULL);
    	  hwndbut2 = CreateWindow (L"button", L"",WS_CHILD | WS_VISIBLE | BS_OWNERDRAW ,135, 123, 75, 75, hWnd, (HMENU) but2,hInstance, NULL);
    	  hwndbut3 = CreateWindow (L"button", L"",WS_CHILD | WS_VISIBLE | BS_OWNERDRAW ,30, 222, 75, 75, hWnd, (HMENU) but3,hInstance, NULL);
    	  hwndbut4 = CreateWindow (L"button", L"",WS_CHILD | WS_VISIBLE | BS_OWNERDRAW ,135, 24, 75, 75, hWnd, (HMENU) but4,hInstance, NULL);
    	  hwndbut5 = CreateWindow (L"button", L"",WS_CHILD | WS_VISIBLE | BS_OWNERDRAW ,30, 123, 75, 75, hWnd, (HMENU) but5,hInstance, NULL);
    	  hwndbut6 = CreateWindow (L"button", L"",WS_CHILD | WS_VISIBLE | BS_OWNERDRAW ,135, 222, 75, 75, hWnd, (HMENU) but6,hInstance, NULL);
    	  hhintergrund = SHLoadDIBitmap(L"/programme/wanderkarte/hintergrund.bmp");
    	  hbiber1 = SHLoadDIBitmap(L"/programme/wanderkarte/biber1.bmp");
    	  hbiber2 = SHLoadDIBitmap(L"/programme/wanderkarte/biber2.bmp");
    	  hbiber3 = SHLoadDIBitmap(L"/programme/wanderkarte/biber3.bmp");
    	  hbiber4 = SHLoadDIBitmap(L"/programme/wanderkarte/biber4.bmp");
    	  hbiber5 = SHLoadDIBitmap(L"/programme/wanderkarte/biber5.bmp");
    	  hbiber6 = SHLoadDIBitmap(L"/programme/wanderkarte/biber6.bmp");
    	  GetObject (hbiber1,sizeof(BITMAP),&biber1);
    	  GetObject (hbiber2,sizeof(BITMAP),&biber2);
    	  GetObject (hbiber3,sizeof(BITMAP),&biber3);
    	  GetObject (hbiber4,sizeof(BITMAP),&biber4);
    	  GetObject (hbiber5,sizeof(BITMAP),&biber5);
    	  GetObject (hbiber6,sizeof(BITMAP),&biber6);
    	  GetObject (hhintergrund, sizeof (BITMAP), &hintergrund);
    	  break;
    
      case WM_PAINT:
    	  hdc = BeginPaint (hWnd, &ps) ;
    	  hdcmem = CreateCompatibleDC (hdc) ;
    	  SelectObject (hdcmem, hhintergrund) ;
    	  BitBlt (hdc, 0, 0, hintergrund.bmWidth, hintergrund.bmHeight, hdcmem, 0, 0, SRCCOPY);
    	  DeleteDC (hdc);
    	  DeleteDC (hdcmem) ;
    	  EndPaint (hWnd, &ps) ;
    	  break;
    
    	case WM_COMMAND:
    	  switch(wParam)
    	  {
    	  case but1:
    		  DestroyWindow(hWnd);
    		  break;
    
    	  case but2:
    
    		  hwndevent = CreateWindow(event,event,WS_VISIBLE | WS_CHILD,0, 0, 240, 320, hWnd,NULL,((LPCREATESTRUCT) lParam)->hInstance, NULL); 
    		  if(hwndevent == NULL) 
    		  { 
    			  MessageBox(hWnd,TEXT("nix"),TEXT("nix"),MB_OK); 
    		  } 
    
    		  ShowWindow (hwndevent, SW_SHOW) ; 
    		  UpdateWindow (hwndevent) ; 
    
    		  break;
    	  }
    	  break;
    
    	case WM_DRAWITEM:
    		LPDRAWITEMSTRUCT lpdis;
    		lpdis = (LPDRAWITEMSTRUCT) lParam;
    
    		switch(lpdis->CtlID)
    		{
    		case but1:
    			hdcmem = CreateCompatibleDC(lpdis->hDC);
    			hdcmem1 = CreateCompatibleDC(lpdis->hDC);
    			SelectObject(hdcmem,hhintergrund);
    			SelectObject(hdcmem1,hbiber1);
    			BitBlt(lpdis->hDC,0,0,75,75,hdcmem,30,24,SRCCOPY);
    			TransparentImage(lpdis->hDC,0,0,75,75,hdcmem1,0,0,75,75,GetPixel(hdcmem1,1,1));
    			DeleteDC(hdcmem);
    			DeleteDC(hdcmem1);
    			break;
    
    		case but2:
    			hdcmem = CreateCompatibleDC(lpdis->hDC);
    			hdcmem1 = CreateCompatibleDC(lpdis->hDC);
    			SelectObject(hdcmem,hhintergrund);
    			SelectObject(hdcmem1,hbiber5);
    			BitBlt(lpdis->hDC,0,0,75,75,hdcmem,135,123,SRCCOPY);
    			TransparentImage(lpdis->hDC,0,0,75,75,hdcmem1,0,0,75,75,GetPixel(hdcmem1,1,1));
    			DeleteDC(hdcmem);
    			DeleteDC(hdcmem1);
    			break;
    
    		case but3:
    			hdcmem = CreateCompatibleDC(lpdis->hDC);
    			hdcmem1 = CreateCompatibleDC(lpdis->hDC);
    			SelectObject(hdcmem,hhintergrund);
    			SelectObject(hdcmem1,hbiber3);
    			BitBlt(lpdis->hDC,0,0,75,75,hdcmem,30,222,SRCCOPY);
    			TransparentImage(lpdis->hDC,0,0,75,75,hdcmem1,0,0,75,75,GetPixel(hdcmem1,1,1));
    			DeleteDC(hdcmem);
    			DeleteDC(hdcmem1);
    			break;
    
    		case but4:
    			hdcmem = CreateCompatibleDC(lpdis->hDC);
    			hdcmem1 = CreateCompatibleDC(lpdis->hDC);
    			SelectObject(hdcmem,hhintergrund);
    			SelectObject(hdcmem1,hbiber4);
    			BitBlt(lpdis->hDC,0,0,75,75,hdcmem,135,24,SRCCOPY);
    			TransparentImage(lpdis->hDC,0,0,75,75,hdcmem1,0,0,75,75,GetPixel(hdcmem1,1,1));
    			DeleteDC(hdcmem);
    			DeleteDC(hdcmem1);
    			break;
    
    		case but5:
    			hdcmem = CreateCompatibleDC(lpdis->hDC);
    			hdcmem1 = CreateCompatibleDC(lpdis->hDC);
    			SelectObject(hdcmem,hhintergrund);
    			SelectObject(hdcmem1,hbiber2);
    			BitBlt(lpdis->hDC,0,0,75,75,hdcmem,30,123,SRCCOPY);
    			TransparentImage(lpdis->hDC,0,0,75,75,hdcmem1,0,0,75,75,GetPixel(hdcmem1,1,1));
    			DeleteDC(hdcmem);
    			DeleteDC(hdcmem1);
    			break;
    
    		case but6:
    			hdcmem = CreateCompatibleDC(lpdis->hDC);
    			hdcmem1 = CreateCompatibleDC(lpdis->hDC);
    			SelectObject(hdcmem,hhintergrund);
    			SelectObject(hdcmem1,hbiber6);
    			BitBlt(lpdis->hDC,0,0,75,75,hdcmem,135,222,SRCCOPY);
    			TransparentImage(lpdis->hDC,0,0,75,75,hdcmem1,0,0,75,75,GetPixel(hdcmem1,1,1));
    			DeleteDC(hdcmem);
    			DeleteDC(hdcmem1);
    			break;
    		}
    		break;
    
        case WM_DESTROY:
    		DeleteObject (hbiber1);
    		DeleteObject (hbiber2);
    		DeleteObject (hbiber3);
    		DeleteObject (hbiber4);
    		DeleteObject (hbiber5);
    		DeleteObject (hbiber6);
    		DeleteObject (hhintergrund);
    		PostQuitMessage (0) ;
    		break;
      }
    
      return DefWindowProc(hWnd, message, wParam, lParam);
    } 
    
    LRESULT WndProc(HWND hWnde, UINT messagee, WPARAM wParame, LPARAM lParame)
    {
    	  switch(messagee)
    	  {
    	  case WM_CREATE:
    		  MessageBox(hWnde,TEXT("hallo welt"),TEXT(""),MB_OK);
    		  break;
    	  }
    		  return DefWindowProc(hWnde, messagee, wParame, lParame);
    }
    

    es wird einfach nix als mein parentfenster angezeigt

    edit by flenders: Code-Tags eingefügt - solltest du das nächste Mal selber machen 😉



  • Aber er kommt schon zu dem CreateWindow und die MessageBox kommt nicht?



  • btw: wie willst du auch etwas sehen, wenn du ein optisch dem Hauptfenster identisches Childfenster innen reinlegst 🙄
    Du solltest dem ChildWindow eine eigene WndProc geben und einen anderen backgroundBrush (damit du es auch siehst) und evtl noch etwas kleiner als das Hauptfenster, damit dieses nicht ganz überdeckt wird



  • auch wenn es den eindruck macht ganz doof bin ich nicht 😃
    die procedur meines hauptfensters ist MainWndProc und der hintergrund meines parentfensters ist ein bild und das des child-fensters ist nur weis.

    schreibe gerade alles nochmal neu vieleicht hab ich irgentwo nen kleinen fehler gemacht.

    danke für deine gedult und mühe.

    werde mich vieleicht noch mal heute abend melden.



  • Sorry - hatte mir das Ganze wohl nicht genau genug angeschaut 🤡



  • hab den fehler gefunden.
    für diesen fehler müsste ich mich auf der stelle an die wand stellen. 🙄

    ich sage nur:

    hwndevent = CreateWindow(event,event,WS_VISIBLE | WS_CHILD,0, 0, 240, 320, hWnd,NULL,((LPCREATESTRUCT) lParam)->hInstance, NULL);
    

    fällt dir

    ((LPCREATESTRUCT) lParam)->hInstance
    

    irgentwie auf?
    ich idiot habe die ganze zeit die instance meines parentwindow genommen und mich gewundert warum es nicht so will wie ich.

    nachdem ich ne eigene hInstance für mein childwindow erstellt und diese dann eingesetzt habe war der ganze spuk vorbei. 😃

    danke nochmal für deine hilfe, gedult, ratschläge usw.



  • Was meinst du mit "eigene hInstance für mein childwindow erstellt"?
    Aber jetzt wo du es sagst: ((LPCREATESTRUCT) lParam)->hInstance kannst du natürlich nur in WM_CREATE verwenden, bei anderen Messages wird im lParam ja kein Pointer auf die CREATESTRUCT-Struktur übergeben.
    Hast du hInstance jetzt einfach in WM_CREATE in einer in MainWndProc statischen Variable gespeichert? - ist wohl das einfachste 🙄 und beste 😕



  • nein ich habe das mit dem pointer ganz sein gelassen und einfach mit:

    HINSTANCE hInstanceChild;
    

    ne neue instance für mein child erstellt.
    seid dem geht es.

    wenn ich die instance vom pointer aus der WM_CREATE nehme dann wird der hintergrund meines parents schwarz und die größe verändert sich.

    ich progge für win-ce daher vieleicht dieser unterschied



  • Ich versteh' zwar nicht ganz, was du da jetzt genau gemacht hast (kommt mir auch ein wenig komisch vor), aber wenn's funktioniert ist es ja recht 😉


Anmelden zum Antworten