2012-07-13 22 views
6

Win32 C++ uygulamasında Şeffaf Onay Kutusu oluşturdum. Bunu yaptık çünkü bildiğim kadarıyla yerel win32'de şeffaf bir onay kutunuza sahip olamıyorsunuz ve bu onay kutusunu NSIS yükleyicisinde kullanmam gerekiyor.WinAPI Şeffaf Penceresi Nasıl Temizlenir

Sorunum: Yeniden boyama yaparken, saydam arka planımı nasıl sileceğimi bilmiyorum, böylece "temiz tuval" üzerine çizim yapabilirim. Bu, kullanıcı onay kutusunun içindeki metni değiştirdiğinde ve tekrar yazdırmam gerektiğinde önemlidir. Sanırım herkesin şeffaf pencerelerle alması gereken problemle karşılaştım.

Saydam penceremi temizleyebilme yolu nedir, Not WinAPI'yi tanıyorum, pencereyi yeniden boyamanız nedeniyle AFAIK penceresini gerçekten temizleyemezsiniz. gönderme withut

  • umarım (onay kutusunun altındaki sit olan) üst baştan boyayacak ana penceresine bir rötuş mesaj gönder: Ben pencereyi gibi yeniden çizmek için kullanabileceğiniz hangi teknikleri konusunda tavsiye arıyorum Çocuklarına bir mesaj (yani, onay kutusu). Bunu denedim, onay kutusunun çok fazla titremesi var.
  • Belki de, aslında pencereyi temizleyecek olan tüm onay kutusu penceresini boyamak için kullanabileceğim şeffaf bir fırça/boya fonksiyonu var mıdır? Bunu denedim, herhangi bir nedenle onay kutusu penceresini siyah yapar mı?

Kodum:

case WM_SET_TEXT: 
{ 
     // set checkbox text 
     // Technique 1: update parent window to clear this window 
     RECT thisRect = {thisX, thisY, thisW, thisH}; 
     InvalidateRect(parentHwnd, &thisRect, TRUE); 
} 
break; 
case WM_PAINT: 
{ 
    PAINTSTRUCT ps; 
    HDC hdc = BeginPaint(hwnd, &ps); 
    // Technique 2: 
    SetBkMode(hdc, TRANSPARENT); 
    Rectangle(hdc, thisX, thisY, thisW, thisH); // doesn't work just makes the window a big black rectangle? 
    EndPaint(hwnd, &ps); 
} 
break; 
+3

Hiç başka pencereye bir boya mesaj göndermek istemiyoruz WS_CLIPCHILDREN bunu yeniden boyanması istiyorsanız, pencere stilini kaldırmak o oranlı dikdörtgen geçersiz. –

+0

WM_ERASEBKGND mesaj işleyicide neler yapıyorsunuz? –

+0

@LarryOsterman hmm daha önce bu mesajla hiç çalışmadı mı? Yani şimdi hiçbir şey, ne yapmalıyım? –

cevap

0

Sen WM_ERASEBBKGND mesajı işlemek gerekir. Aşağıdaki gibi bir şey çalışması gerekir!

case WM_ERASEBKGND: 
{ 
    RECT rcWin; 
    RECT rcWnd; 
    HWND parWnd = GetParent(hwnd); // Get the parent window. 
    HDC parDc = GetDC(parWnd); // Get its DC. 

    GetWindowRect(hwnd, &rcWnd); 
    ScreenToClient(parWnd, &rcWnd); // Convert to the parent's co-ordinates 

    GetClipBox(hdc, &rcWin); 
    // Copy from parent DC. 
    BitBlt(hdc, rcWin.left, rcWin.top, rcWin.right - rcWin.left, 
     rcWin.bottom - rcWin.top, parDC, rcWnd.left, rcWnd.top, SRC_COPY); 

    ReleaseDC(parWnd, parDC); 
} 
break; 
+0

Şeffaf bir 'renk' veya standart bir düğme gri rengi boyayacak mı? Onay kutusunun saydam bir arka plana sahip olduğunu ve ana hwnd'in standart gri arka planı bulunamayacağını, bir resim vb. Olabileceğini unutmayın. –

+0

@JakeM Güncellenmiş yanıtı görün. Onay kutusunun çizim kısmını ele aldığınızı farz ediyorum. –

0

deneyin Genelde

+0

stili, onay kutusundan veya onay kutularından gelen stili kaldırmak mı istiyorsunuz? –

+0

@JakeM onay kutusundan –