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 ....