2013-03-25 15 views
5

Tam ekran şeffaf, kenarlıksız bir pencere oluşturmaya çalışıyorum. Metin arka planı şeffaf olmalı, ancak gerçek yazı tipi yüzü olmamalıdır. Sorun şu ki, yalnızca SetWindowRgn yapmazken görüntülenen TextOut'u görebiliyorum. . Ben yanlış ne yapıyorum :(Şeffaf win32 penceresi ve metni

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

Evet, bir 0 x 0 piksel penceresini görmek gerçekten de zordur (CreateRectRgn için aklı başında değerler iletin –

+0

0, 0, 1920, 1200 ile denedim ve şimdi hiçbir şey görünmez, ekranın tamamını görünmez istiyorum :( – Kachinsky

+0

@ user1040769 Github'a bu çözümü bir sınırla birlikte şeffaf bir pencere ile ekleyebilir misiniz? Pencerenin şeffaf olduğu bir pencere ve bir çocuk penceresi (bir düğme gibi) lütfen bu kadar iyi olur, bu şekilde nasıl başardığınızı görmemizi öğrenebiliriz. bir bağlantıyı yönlendirmek. Çok teşekkür ederim! "SetWindowRgn" işlevi için – bluejamesbond

cevap

3

böyle bu Çözüldü hiçbir fikrim yok:

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

[The Documents] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd145102.aspx) diyor ki: * "SetWindowRgn'e yapılan başarılı bir çağrıdan sonra, sistemin sahibi bölge tarafından belirtilen bölge hRgn Sistem, bölgenin bir kopyasını yapmaz.Bu nedenle, bu bölge tanıtıcısı ile herhangi bir işlev çağrısı yapmamalısınız.Özellikle, bu bölge tanıtıcıyı silmeyin.Sistem, bölgeyi siler. Artık gerekmediğinde ele alın. "* Bu sözleşmeyi ihlal ediyorsunuz. –