Eigener Rahmen bei Fenster



  • Hallo

    Ich hab mal getestet wie man bei Fenstern nen eigenen Rahmen zeichnet.
    Mein Fenster soll einfach den gasamten Rahmen schwarz machen.
    Das funktioniert eigendlich auch ganz gut, bis auf die Tatsache,
    dass wenn ich wenn ich andere Fenster darüber packe, dass dann das ganze
    Fenster, welches eigendlich weiß ist, schwarz wird... 😞

    Es wäre nett wenn ihr mal gucken könntet woran das liegt, denn ich finds einfach net

    Hier das Programm zum anschauen

    Und hier der code:

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static TCHAR szAppName[] = TEXT ("HelloWin") ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
    
         if (!RegisterClass (&wndclass))
         {    // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit 
              MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), 
                          szAppName, MB_ICONERROR) ;
              return 0 ;
         }
    
          hwnd = CreateWindow (szAppName,                 // Name der Fensterklasse
                      TEXT ("Das erste echte Programm"),  // Fenstertitel
                      WS_OVERLAPPEDWINDOW,                // Fensterstil
                      CW_USEDEFAULT,                      // X-Position des Fensters
                      CW_USEDEFAULT,                      // Y-Position des Fensters
                      CW_USEDEFAULT,                      // Fensterbreite
                      CW_USEDEFAULT,                      // Fensterhöhe
                      NULL,                               // übergeordnetes Fenster
                      NULL,                               // Menü
                      hInstance,                          // Programm-Kopiezähler (Programm-ID)
                      NULL) ;                             // zusätzliche Parameter
    
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
    
         while (GetMessage (&msg, NULL, 0, 0))
         {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
         }
         return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         HDC			hdc ;
    	 HDC			hdcF;
         PAINTSTRUCT	ps ;
         RECT			rect ;
    	 static int		sizeX, sizeY;
    
         switch (message)
         {
         case WM_CREATE:
              //PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
    
    		 sizeX = 100;
    		 sizeY = 100;
    
              return 0 ;
         case WM_PAINT:
              hdc = BeginPaint (hwnd, &ps) ;
    
              GetClientRect (hwnd, &rect) ;
    
    		  // Das Fenster weiß malen
    		  SelectObject (hdc, GetStockObject (WHITE_BRUSH)); 
    		  Rectangle(hdc, 0,0,rect.right, rect.bottom);
    
    		  //DeleteObject (hdc);
    
              DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
                        DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
    
              EndPaint (hwnd, &ps) ;
              break;
    
         case WM_NCCALCSIZE:
    		  sizeX = ((NCCALCSIZE_PARAMS*)lParam)->rgrc[1].right;
    		  sizeY = ((NCCALCSIZE_PARAMS*)lParam)->rgrc[1].bottom;
    		  break;
         case WM_NCACTIVATE:
    	 case WM_NCPAINT:
    	 case WM_ACTIVATE:
    	 case WM_SETFOCUS:
    
    		hdcF = GetWindowDC(hwnd);
    			//GetDCEx(hwnd,  0, DCX_WINDOW  | 0x10000 | DCX_CLIPCHILDREN);
    
    		SelectObject (hdcF, GetStockObject (BLACK_BRUSH)); 
            Rectangle (hdcF, 0, 0, sizeX, sizeY) ;
    
    		//DeleteObject (hdcF);
    		// Paint into this DC
    		ReleaseDC(hwnd, hdcF);
    		//MessageBox(hwnd, L"HALLO", L"Hallo", 0);
    		return 0;
    
         case WM_DESTROY:
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    


  • Hi.

    Sorry kann dir jetzt nicht wirklich helfen
    aber ist schön zu wissen dass sich auch andere gerade
    durch den Petzold durchwühlen...... 😃 👍



  • Naja der code is von Petzold... allerdings hab ich in dem Buch
    nichts über WM_NCPAINT gelesen... 😞

    Ich glaube das es irgendwie an dem clipping liegt...

    aber ich weiß net wo ....


Log in to reply