Style okien i klas okien - rysowanie okna potomnego na głównym

0

Cześć,

Jakie style powinienem zastosować do okna lub do klasy okna jeśli nie chcę, aby podczas WM_PAINT rysowało ono okno, które na nim się znajduje?
Teraz sytuacja wygląda tak, że gdy ruszam moim oknem potomnym po oknie głównym to pozostaje na nim (na głównym) "ślad" w grafice, który wymazuje się dopiero z opóźnieniem. Jak mogę to naprawić? CO ciekawe to się dzieje TYLKO z oknem potomnym, jeśli jeżdżę po głównym np. przeglądarką to żadnego problemu nie ma.
Teraz główne ma: WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX | WS_CLIPCHILDREN
a potomne: WS_DLGFRAME | WS_EX_TOOLWINDOW | WS_EX_TOPMOST | WS_SYSMENU | WS_CAPTION

1

Jakie style powinienem zastosować do okna lub do klasy okna jeśli nie chcę, aby podczas WM_PAINT rysowało ono okno, które na nim się znajduje?

Źle zadane pytanie. Problemem nie jest, ze WM_PAINT rysuje okno, problemem jest dlaczego rysuje się coś źle, co to za „ślad”.

Nic więcej powiedzieć nie można nie widząc kodu. Pokaż też screena jak ten ślad wygląda.

0

Tutaj udało mi się uchwycić ten moment:
(czarne tło jest w pliku jpg i jest malowane w WM_PAINT)
okno
Podejrzewałem, że to bardziej problem z oknem potomnym (logowania), bo tylko przy ruszaniu nim jest taki efekt, gdy ruszam po oknie np. przeglądarką to wszystko jest ok. To szybko znika i trudno jest to uchwycić, ale nadal to nie jest "normalne" zachowanie dla programu :D

0

Skoro „czarne tło jest rysowane w WM_PAINT”, to rysuj tam to co trzeba zamiast czarnego tła.
Wygląda na to, że źle rysujesz okno. Kiedy otwarte masz okno potomne to prawdopodobnie nie wykonuje się jakaś pętla, w której rysowałeś.

Nie ma takiej możliwości jak sugerujesz, by nie rysować okna a mieć je na ekranie. Zwłaszcza że to jest XP, który nie przechowuje nigdzie zawartości okna zasłoniętej innym oknem na wierzchu: czego nie ma na ekranie tego nie ma. Trzeba odrysować.

Pokaż najlepiej jak otwierasz to okno, jak wygląda pętla komunikatów jednego i drugiego okna, i jak wygląda WM_PAINT.

0

Pętla komunikatów:

   while(GetMessage(&Msg, NULL, 0, 0) > 0)
	{        
        if (!IsDialogMessage(hwndLog, &Msg) && !IsDialogMessage(hwnd, &Msg))
        {
          TranslateMessage(&Msg);
          DispatchMessage(&Msg);
        }
    }

Tworzenie:

     memset(&wc,0,sizeof(wc));
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.lpfnWndProc   = WndProc;
    wc.hInstance     = hInstance;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszClassName = "WindowClass";
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
	wc.hIcon 		 = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 1284 ) );
	wc.hIconSm		 = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 2503 ) );
    
    INITCOMMONCONTROLSEX iccex;
	iccex.dwICC = ICC_WIN95_CLASSES;
	iccex.dwSize = sizeof( INITCOMMONCONTROLSEX );
	InitCommonControlsEx( & iccex );

    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Launcher",WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX | WS_CLIPCHILDREN,
        CW_USEDEFAULT, /* x */
        CW_USEDEFAULT, /* y */
        500, /* width */
        120, /* height */
        NULL,NULL,hInstance,NULL);
    
    memset(&wc,0,sizeof(wc));
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.lpfnWndProc   = WndProc2;
    wc.hInstance     = hInstance;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszClassName = "WindowClass2";
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
	wc.hIcon 		 = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 1284 ) );
	wc.hIconSm		 = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( 2503 ) );
    
	hwndLog = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass2", "Log in",WS_DLGFRAME|WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_SYSMENU|WS_CAPTION,
        CW_USEDEFAULT, /* x */
        CW_USEDEFAULT, /* y */
        600, /* width */
        200, /* height */
        hwnd,NULL,hInstance,NULL);

WM_PAINT:

 case WM_PAINT:
		{
	        PAINTSTRUCT ps = { 0 };
		    HDC hdc = BeginPaint(hwnd, &ps);
			    RECT rc;
			    GetClientRect(hwnd, &rc);
			    HDC memdc = CreateCompatibleDC(hdc);
			    HBITMAP hbitmap = CreateCompatibleBitmap(hdc, rc.right, rc.bottom);
			    HGDIOBJ oldbmp = SelectObject(memdc, hbitmap);
				
			    FillRect(memdc, &rc, WHITE_BRUSH);
			    Gdiplus::Graphics gr(memdc);
			    gr.DrawImage(firstImage, 0, 150, 810, 400);
			    gr.DrawImage(secondImage, 0, 0, 800, 580);
				
			    BitBlt(hdc, 0, 0, rc.right, rc.bottom, memdc, 0, 0, SRCCOPY);
				
			    SelectObject(memdc, oldbmp);
			    DeleteObject(hbitmap);
			    DeleteDC(memdc);
			
		    EndPaint(hwnd, &ps);
			
		    return 0;
		}

Z ciekawszych operacji jeszcze:

		case WM_ERASEBKGND:
		{
			return 1;
		}

Reszta raczej związku z tematem nie ma.

0

Do czego to służy?

if (!IsDialogMessage(hwndLog, &Msg) && !IsDialogMessage(hwnd, &Msg))

Poza tym chyba jakieś RegisterClass by się przydało.

I jeszcze to

        case WM_ERASEBKGND:
        {
            return 1;
        }

chyba lepiej pozostawić DefWindowProc skoro sam tego komunikatu praktycznie nie obsługujesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1