Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

1

11.04.2008, 20:26

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 eigentlich auch ganz gut, bis auf die Tatsache,
dass wenn ich wenn ich andere Fenster darüber packe, dass dann das ganze
Fenster, welches eigentlich 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:


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#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) ; 
} 

2

11.04.2008, 21:15

Bei mir ist es nur schwarz. Kein Wunder, wenn du ein schwarze Rechteck drüber pinselst. ;)

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

3

11.04.2008, 21:17

Ja veränder mal die größe .. dann gehts.. weil er den client-bereich
clippt

4

11.04.2008, 21:21

Vor lauter schwarz keinen Rahmen gesehen. :)
Warum machst du das bei WM_SETFOCUS und nicht bei WM_PAINT?

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

5

11.04.2008, 21:47

Eigentlich nur bei " WM_NCPAINT" aber die anderen hab ich getestet, in der hoffnung das es dann endlich funktioniert
-> Fehlanzeige

6

11.04.2008, 21:56

Die Codeschnipsel hast du aus'm Petzold, oder?
Wie auch immer. Bei dem NC-Zeug gibts ein paar Regeln und Reihenfolgen zu beachten.
Bin leider grad auf'm Sprung. Wenn du es bis morgen nicht gelöst hast, schau ich noch mal drüber. Good luck! :)

7

12.04.2008, 14:20

Normalerweise zeichnest du außerhalb der Clientarea bei WM_NCPAINT:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
case WM_NCPAINT:

hdcF = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN|0x10000);

SelectObject (hdcF, GetStockObject (BLACK_BRUSH));
Rectangle (hdcF, 0, 0, sizeX, sizeY) ;

ReleaseDC(hwnd, hdcF);

Werbeanzeige