2013-03-25 19 views
5

Próbuję utworzyć pełnoekranowe przezroczyste okno bez ramki z tekstem, który jest wyświetlany na wierzchu. Tło tekstu powinno być przezroczyste, ale nie rzeczywiste oblicze czcionki. Problem polega na tym, że mogę zobaczyć tylko TextOut wyświetlany, gdy nie robię SetWindowRgn. Nie mam pojęcia co robię źle :(Przejrzyste okno win32 i tekst

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 
{ 
    HWND hWnd; 
    hInst = hInstance; 

    DWORD Flags1 = WS_EX_COMPOSITED | WS_EX_LAYERED | WS_EX_NOACTIVATE | WS_EX_TOPMOST | WS_EX_TRANSPARENT; 
    DWORD Flags2 = WS_POPUP; 

    hWnd = CreateWindowEx(Flags1, szWindowClass, szTitle, Flags2, 0, 0, 1920, 1200, 0, 0, hInstance, 0); 

    if(!hWnd)return FALSE; 

    HRGN GGG = CreateRectRgn(0, 0, 0, 0); 
    SetWindowRgn(hWnd, GGG, false); 

    ShowWindow(hWnd, nCmdShow); 
    UpdateWindow(hWnd); 

    DeleteObject(GGG); 

    return TRUE; 
} 

    case WM_PAINT: 
    hdc = BeginPaint(hWnd, &ps); 

    SetBkMode(hdc, TRANSPARENT); 
    TextOut(hdc, 50, 50, L"MY TEXT", lstrlen(L"MY TEXT")); 

    EndPaint(hWnd, &ps); 
+3

Tak, to rzeczywiście trudno zobaczyć okno pikseli 0 x 0 przekazywać wartości rozsądnych do CreateRectRgn ( –

+0

Próbowałem z 0, 0, 1920, 1200 i teraz nic nie jest niewidoczne, chcę, aby cały ekran był niewidoczny :( – Kachinsky

+0

@ user1040769 Czy możesz dodać to rozwiązanie na Githubie z przezroczystym okienkiem z ramką (tak, że widzimy gdzie okno jest przezroczyste) i jedno okienko podrzędne (takie jak przycisk), proszę? To byłoby tak wspaniałe, że możemy nauczyć się, jak widzę, jak to osiągnąłeś. rovide link. Dziękuję bardzo! – bluejamesbond

Odpowiedz

3

rozwiązać to tak:.

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 
{ 
    HWND hWnd; 
    hInst = hInstance; 

    DWORD Flags1 = WS_EX_COMPOSITED | WS_EX_LAYERED | WS_EX_NOACTIVATE | WS_EX_TOPMOST | WS_EX_TRANSPARENT; 
    DWORD Flags2 = WS_POPUP; 

    hWnd = CreateWindowEx(Flags1, szWindowClass, szTitle, Flags2, 0, 0, 1920, 1200, 0, 0, hInstance, 0); 

    if(!hWnd)return FALSE; 

    HRGN GGG = CreateRectRgn(0, 0, 1920, 1200); 
    InvertRgn(GetDC(hWnd), GGG); 
    SetWindowRgn(hWnd, GGG, false); 

    COLORREF RRR = RGB(255, 0, 255); 
    SetLayeredWindowAttributes(hWnd, RRR, (BYTE)0, LWA_COLORKEY); 

    ShowWindow(hWnd, nCmdShow); 
    UpdateWindow(hWnd); 

    DeleteObject(GGG); 

    return TRUE; 
} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    int wmId, wmEvent; 
    PAINTSTRUCT ps; 
    HDC hdc; 
    RECT rect; 

    switch (message) 
    { 
    case WM_ERASEBKGND: 

     GetClientRect(hWnd, &rect); 
     FillRect((HDC)wParam, &rect, CreateSolidBrush(RGB(255, 0, 255))); 

     break; 
+0

[Dokumentacja] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd145102.aspx) dla funkcji 'SetWindowRgn' mówi: *" Po udanym wywołaniu SetWindowRgn, system jest właścicielem region określony przez uchwyt regionu hRgn System nie tworzy kopii regionu, dlatego nie powinieneś wykonywać żadnych dalszych wywołań funkcji za pomocą tego uchwytu regionu, w szczególności nie usuwaj tego uchwytu regionu System usuwa region obsługiwać, gdy nie jest już potrzebna. "* Naruszasz ten kontrakt. –