C++ Win32 Static Control Transparent Background

后端 未结 1 1975
有刺的猬
有刺的猬 2021-01-06 01:31

Solution: As said below, it is probably better to create your own method for the text, instead of trying to get the control to behave abnormally. So, creati

相关标签:
1条回答
  • 2021-01-06 02:02

    No need to do Owner Draw, you can just use SetWindowText() and handle the WM_CTLCOLORSTATIC message, see the code in this SO Answer <-- this will not work if the window has a pattern background, we need to subclass the static control and use the transparent background mode while drawing the text:

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {   MSG msg;
        WNDCLASS w;
    
        hInst = hInstance;
        memset(&w,0,sizeof(WNDCLASS));
        w.style = CS_HREDRAW | CS_VREDRAW;
        w.lpfnWndProc = WndProc;
        w.hInstance = hInst;
        w.hbrBackground = CreateHatchBrush(HS_DIAGCROSS, RGB(255, 0, 0));
        w.lpszClassName = L"My Class";
        w.hCursor = LoadCursor(NULL, IDC_ARROW); 
        RegisterClass(&w);
    
        HWND hWndWindow = CreateWindow(L"My Class", L"My title", WS_OVERLAPPEDWINDOW, 300, 200, 800, 600, NULL, NULL, hInst, NULL);
    
        ShowWindow(hWndWindow, nCmdShow);
        UpdateWindow(hWndWindow);
    
        while(GetMessage(&msg, NULL, 0, 0))
        {   TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        DeleteObject(w.hbrBackground);
    
        return msg.wParam;
    }
    
    WNDPROC StaticWndProc = NULL;
    TCHAR szText[] = _T("TestString");
    
    LRESULT CALLBACK MyStaticWndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
    {   if (Message == WM_PAINT)
        {   RECT rc;
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);
            GetClientRect(hwnd, &rc);
            SetBkMode(hdc, TRANSPARENT);
            DrawText(hdc, szText, _tcslen(szText), &rc, DT_CENTER | DT_VCENTER);
            EndPaint(hwnd, &ps);
            return 0;
        }
    
          //v2 StaticWndProc(hwnd, Message, wparam, lparam);
        return CallWindowProc(StaticWndProc, hwnd, Message, wparam, lparam); //v2
    }
    
    HWND hWndStatic; //v2
    LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
    {   switch (Message)
        {   case WM_CREATE:
            {   LRESULT lRes = DefWindowProc(hwnd, Message, wparam, lparam);
                hWndStatic = CreateWindowEx(0, L"Static", NULL, WS_CHILD| WS_VISIBLE |SS_LEFT, 10, 130, 200, 40, hwnd, NULL, hInst, NULL); //v2 deleted HWND
                StaticWndProc = (WNDPROC) SetWindowLong(hWndStatic, GWL_WNDPROC, (LPARAM)MyStaticWndProc);
                return lRes;
            }
    
            case WM_DESTROY: 
                SetWindowLong(hWndStatic, GWL_WNDPROC, (LPARAM)StaticWndProc); //v2
                PostQuitMessage(0);
                break;
    
            default:
                return DefWindowProc(hwnd, Message, wparam, lparam);
        }
    
        return 0;
    }
    
    0 讨论(0)
提交回复
热议问题