2012-07-13 10 views
6

मैंने Win32 C++ में एक पारदर्शी चेकबॉक्स बनाया है। मैंने इसे बनाया है क्योंकि जहां तक ​​मुझे पता है कि आपके पास मूल Win32 में एक पारदर्शी चेकबॉक्स नहीं है और मुझे एनएसआईएस इंस्टॉलर में इस चेकबॉक्स का उपयोग करने की आवश्यकता है।एक WinAPI पारदर्शी विंडो "साफ़ करें" कैसे करें

मेरी समस्या: पुनर्निर्मित करते समय, मुझे नहीं पता कि मेरी पारदर्शी पृष्ठभूमि कैसे मिटाना है, इसलिए मैं "स्पष्ट कैनवास" पर आकर्षित कर सकता हूं। यह महत्वपूर्ण है जब उपयोगकर्ता चेकबॉक्स के अंदर टेक्स्ट बदलता है और मुझे इसे पुन: प्रस्तुत करने की आवश्यकता होती है। मुझे लगता है कि मैंने समस्या में भाग लिया है हर किसी को पारदर्शी खिड़कियों के साथ मिलना चाहिए।

मैं अपनी पारदर्शी विंडो को कैसे साफ़ कर सकता हूं, नोट मैं WinAPI से परिचित हूं कि आप वास्तव में एक विंडो AFAIK को साफ़ नहीं कर सकते क्योंकि आप खिड़की पर बस पेंट करते हैं। भेजने withut

  • माता पिता खिड़की जो उम्मीद है कि माता-पिता फिर से रंगना होगा (जो चेकबॉक्स के नीचे स्थित बैठ है) के लिए एक रीपेंट संदेश भेजें: तो मैं क्या तकनीक मैं जैसे खिड़की पुनः बनाने का उपयोग कर सकते हैं पर सलाह के लिए देख रहा हूँ अपने बच्चों को एक संदेश (यानी, चेकबॉक्स)। मैंने यह कोशिश की है, यह चेकबॉक्स को बहुत झटकेदार बनाता है।
  • शायद एक पारदर्शी ब्रश/पेंट फ़ंक्शन है जो मुझे नहीं पता कि मैं पूरी चेकबॉक्स विंडो पर पेंट करने के लिए उपयोग कर सकता हूं जो अनिवार्य रूप से विंडो को साफ़ करेगा? मैंने कोशिश की है कि यह किसी कारण से चेकबॉक्स विंडो काला बनाता है?

मेरे कोड:

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

सामान्य तौर पर आप नहीं कभी किसी अन्य विंडो के लिए एक पेंट संदेश भेजना चाहते हैं, अगर आप चाहते हैं कि उसे रंगा, यह आयत है अमान्य हो जाएगा। –

+0

आप अपने WM_ERASEBKGND संदेश हैंडलर में क्या करते हैं? –

+0

@LarryOsterman hmm पहले कभी उस संदेश के साथ काम नहीं किया? तो अभी कुछ भी नहीं, मुझे क्या करना चाहिए? –

उत्तर

0

आप WM_ERASEBBKGND संदेश संभाल करने की जरूरत है। निम्नलिखित की तरह कुछ काम करना चाहिए! खिड़की शैली को दूर

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

क्या वह पारदर्शी 'रंग' या मानक बटन ग्रे रंग पेंट करेगा? याद रखें कि चेकबॉक्स में एक पारदर्शी पृष्ठभूमि है और इसके माता-पिता के पास मानक ग्रे पृष्ठभूमि नहीं हो सकती है, यह एक छवि इत्यादि हो सकती है। –

+0

@JakeM अद्यतन उत्तर देखें। मुझे लगता है कि आप चेक बॉक्स के ड्राइंग भाग को संभालने वाले हैं। –

0

कोशिश करने के लिए WS_CLIPCHILDREN

+0

क्या आपका मतलब चेकबॉक्स या चेकबॉक्स माता-पिता से शैली को हटा देना है? चेकबॉक्स से –

+0

@ जेकएम –

संबंधित मुद्दे