2015-05-06 7 views
5

मुझे निर्दिष्ट पृष्ठभूमि रंग के साथ एक सीमा रहित विंडो बनाने की जरूरत है। मैं जानता हूँ कि इस तरह के एक गैर क्लाइंट क्षेत्र को हटाने और पाने के लिए कुछ:सीमा रहित खिड़की। छाया कैसे जोड़ें और 1px सीमा को कैसे हटाएं?

enter image description here

यह अच्छा है, लेकिन नहीं मैं वास्तव में क्या चाहते हैं। यदि आप किसी भी एरो खिड़की पर नज़र डालें - इसके चारों ओर एक छाया है (वास्तव में यह छाया नहीं है लेकिन कुछ चमक है)। मैंने कहीं पाया गया कि मैं एक छाया जोड़ने के लिए इस कोड का उपयोग कर सकते हैं:

const MARGINS shadow_on = { 1, 1, 1, 1 }; 
DwmExtendFrameIntoClientArea(hwnd, &shadow_on); 

यह काम है (सोचा कि यह पूरी तरह से मेरे लिए स्पष्ट नहीं है - प्रलेखन छाया के संबंध हैं और इस समारोह के बारे में कुछ नहीं कहता है) लगभग कर रहा है। लगभग। खिड़की के चारों ओर एक पतली सीमा दिखाई दी है। ऐसा लगता है कि यह अर्द्धपारदर्शी है और यह देखो और खिड़की के लग रहा है टूट जाता है:

enter image description here

मुझे पता है कि यह संभव है - दृश्य स्टूडियो भी किसी भी तरह इस सीमा का रंग बदल!

अपडेट: टिप्पणियों में द्वितीय निरीक्षण के रूप में मैं DwmExtendFrameIntoClientArea() में नकारात्मक मार्जिन का उपयोग कर सकता हूं। मैं -1 मान सेट और यह परिणाम मिला:

enter image description here

के रूप में आप देख सकते हैं - यह भी weirder है। मैंने रंग के साथ पृष्ठभूमि भरने की कोशिश की, लेकिन भाग्य के बिना।

+0

आप विंडो क्षेत्र क्लिप चमक दूर करने के लिए कर सकते हैं:
const MARGINS shadow_on = { 1, 0, 0, 0 };

यहाँ साफ खिड़कियों एपीआई कोड उदाहरण इस तरह के खिड़की, यह डेल्फी पर लिखा है बनाने का तरीका है। क्या आपने चमक को हटाने के लिए इसे पहले से क्लिप करने का प्रयास किया था? यह हो सकता है कि आप चमक से छुटकारा पाएं और एक ही समय में छाया का उपयोग न करें। – icbytes

+0

@icbytes no, आपको समझ में नहीं आया - मुझे एक चमक की आवश्यकता है - मुझे एक सीमा की आवश्यकता नहीं है जो प्रकट होता है जब मैं एक चमक जोड़ रहा हूं। – nikitablack

+0

फिर उल्लिखित फ़ंक्शन का उपयोग न करें। इसे स्वयं बनाएं एक पीजीए लाइन, सभी तरफ, थोड़ा हल्का हरा के साथ। – icbytes

उत्तर

1

इस कार्यप्रणाली को कॉल के बाद एक पिक्सेल सीमा निकालने के लिए:

const MARGINS shadow_on = { 1, 1, 1, 1 }; 
DwmExtendFrameIntoClientArea(hwnd, &shadow_on); 

आप WndProc WM_NCCALCSIZE संदेश ओवरराइड करने के लिए की जरूरत है, और 0 परिणाम के रूप में लौट आते हैं। आपको WS_CAPTION शैली का उपयोग करके विंडो बनाने की भी आवश्यकता है। (विंडोज एक्सपी पर यह कोड आयताकार खिड़की नहीं देगा, लेकिन WinXP पर कोई छाया नहीं है, इसलिए विंडोज एक्सपी पर आपको WS_POPUP विंडो शैली में गिरावट चाहिए)
वैसे, छाया जोड़ने के लिए यह मार्जिन का उपयोग करने के लिए पर्याप्त है: https://stackoverflow.com/a/44489430/877099

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