2013-03-25 102 views
5

我正在嘗試使全屏透明無邊框窗口上顯示完美的文本。文本背景應該是透明的,但不是實際的字體。問題是,當我不執行SetWindowRgn時,我只能看到TextOut。我不知道我做錯了:(透明的win32窗口和文本

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

是的,這的確是很難看到一個0 X 640像素的窗口傳遞理智值CreateRectRgn( )。 – 2013-03-25 00:35:11

+0

我試着用0,0,1920年,1200和現在沒有什麼是不可見的,我想整個屏幕無形:( – Kachinsky 2013-03-25 16:22:03

+0

@ user1040769能否請你在Github上有透明的窗口邊框添加此溶液(所以我們可以看到窗口是透明的)和一個孩子窗口(如一個按鈕)?這將是非常偉大的方式,我們可以學習我看到你是如何做到這一點的。提供鏈接。非常感謝! – bluejamesbond 2013-09-14 15:28:48

回答

3

解決了這個是這樣的:

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

[文檔](http://msdn.microsoft.com/en-us/library/windows/desktop/dd145102.aspx)用於「SetWindowRgn」函數說:*「成功調用SetWindowRgn後,系統擁有該區域指定的區域處理hRgn,系統不會複製該區域,因此不應該使用該區域句柄進一步調用函數,特別是不要刪除該區域句柄。在不再需要時處理。「*您違反了該合同。 – 2013-03-25 21:48:38