2012-07-13 39 views
6

Tôi đã tạo Hộp kiểm Trong suốt trong Win32 C++. Tôi đã làm cho nó bởi vì theo như tôi biết bạn không thể có một hộp kiểm trong suốt win32 bản địa và tôi cần phải sử dụng hộp kiểm này trong một trình cài đặt NSIS.Cách "Xóa" Cửa sổ Trong suốt WinAPI

Vấn đề của tôi: Khi sơn lại, tôi không biết cách xóa nền trong suốt để tôi có thể vẽ trên "canvas rõ ràng". Điều này rất quan trọng khi người dùng thay đổi văn bản bên trong hộp kiểm và tôi cần phải vẽ lại nó. Tôi đoán tôi đã gặp phải vấn đề mà mọi người phải có với các cửa sổ trong suốt.

Cách tôi có thể xóa cửa sổ trong suốt, Lưu ý Tôi quen thuộc với WinAPI rằng bạn không thể thực sự rõ ràng một cửa sổ AFAIK vì bạn chỉ vẽ lại trên cửa sổ. Vì vậy, tôi đang tìm kiếm lời khuyên về những kỹ thuật nào tôi có thể sử dụng để vẽ lại cửa sổ như:

  • Gửi thư repaint đến cửa sổ cha mẹ hy vọng sẽ vẽ lại dấu ngoặc đơn (bên dưới hộp kiểm). một tin nhắn xuống con cái của nó (ví dụ, hộp kiểm). Tôi đã thử điều này, nó làm cho các hộp kiểm có rất nhiều nhấp nháy.
  • Có thể có một chức năng quét/sơn trong suốt Tôi không biết rằng tôi có thể sử dụng để vẽ trên toàn bộ cửa sổ hộp kiểm mà về cơ bản sẽ xóa cửa sổ? Tôi đã thử điều này nó làm cho cửa sổ hộp kiểm màu đen vì lý do nào đó?

Mã của tôi:

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

Nói chung bạn không bao giờ muốn gửi một thông điệp sơn để một cửa sổ khác, nếu bạn muốn nó sơn lại, làm mất hiệu lực đó là hình chữ nhật. –

+0

Bạn làm gì trong trình xử lý tin nhắn WM_ERASEBKGND của mình? –

+0

@LarryOsterman hmm chưa bao giờ làm việc với thông điệp đó trước đây? Vì vậy, không có gì ngay bây giờ, tôi nên làm gì? –

Trả lời

0

Bạn cần phải xử lý các thông điệp WM_ERASEBBKGND. Một cái gì đó như sau nên làm việc!

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

Điều đó có tô màu trong suốt 'màu' hoặc nút màu xám tiêu chuẩn không? Hãy nhớ rằng hộp kiểm có nền trong suốt và hwnd của phụ huynh có thể không có nền màu xám chuẩn, nó có thể là hình ảnh, v.v. –

+0

@JakeM Xem câu trả lời được cập nhật. Tôi giả định rằng bạn đang xử lý phần bản vẽ của hộp kiểm. –

0

Cố gắng loại bỏ phong cách cửa sổ WS_CLIPCHILDREN

+0

bạn có muốn xóa kiểu khỏi hộp kiểm hoặc hộp kiểm của cha mẹ không? –

+0

@JakeM từ hộp kiểm –

Các vấn đề liên quan