2009-09-30 15 views
5

आईट्यून्स मिनी-प्लेयर (केवल एक उदाहरण देने के लिए) क्लिक-थ्रू का समर्थन नहीं करता है जहां प्ले/पॉज़ और वॉल्यूम कंट्रोल का उपयोग होने पर एप्लिकेशन को सामने नहीं लाया जाता है।क्लिक-थ्रू बटन और विंडो

यह कैसे किया जाता है?

मैं एप्पल के प्रलेखन के माध्यम से देख रहा था और Cocoa Event-Handling Guide, Event Dispatch में यह कहा गया, एक छोटे से पर जाने के लिए है:

कुछ घटनाओं, जिनमें से कई आवेदन किट (प्रकार NSAppKitDefined) द्वारा परिभाषित कर रहे हैं, के लिए है खिड़की या एप्लिकेशन ऑब्जेक्ट द्वारा नियंत्रित कार्यों के साथ करें। इन घटनाओं के उदाहरण सक्रिय, निष्क्रिय करने, छिपाने और एप्लिकेशन दिखाने से संबंधित हैं। एनएसएपीपी इन घटनाओं को अपने प्रेषण दिनचर्या में जल्दी से फ़िल्टर करता है और उन्हें स्वयं ही संभालता है।

तो, मेरी समझ सीमित (How an Event Enters a Cocoa, Application) उपवर्गीकरण NSApplication और अधिभावी - (void)sendEvent:(NSEvent *)theEvent चाहिए जाल हर माउस और कीबोर्ड घटना है, लेकिन अभी से, खिड़की क्लिक पर उठाया जाता है। इसलिए एनएसएप्लिकेशंस द्वारा घटना को देखा जाने से पहले खिड़की उठाई जाती है या मुझे कुछ और याद आ रहा है।

मै मैट गैलाघर के Demystifying NSApplication by recreating it पर देखा है, दुर्भाग्य से मैट ने घटना कतार को कवर नहीं किया है, इसलिए इसके अलावा, मैं स्टंप हो गया हूं।

किसी भी मदद की सराहना की जाएगी, धन्यवाद।

संपादित जोड़ने के लिए:Lloyd's Lounge पर मिले एक पोस्ट जिसमें उन्होंने CocoaBuilder, capture first right mouse down पर एक पोस्ट करने के लिए एक ही समस्या और लिंक के बारे में बात करती है। मैं वर्तमान में वहां दिए गए कोड को आजमा रहा हूं, कुछ घूमने के बाद और [theEvent प्रकार] के लिए एनएसएलओजी को पुनः सक्रिय करने के बाद, बाईं माउस बटन गतिविधि पकड़ी जा रही है।

अब, इसे आगे लाने के लिए विंडो पर बाईं ओर क्लिक करने से ईवेंट प्रकारों का अनुक्रम उत्पन्न होता है, 13, 1, 13, ये एनएसएपीपीकिट डिफिनेटेड, एनएसएलफ्टफॉउसडाउन और एनएसएपीपीकिट फिर से परिभाषित हैं। क्या मैं इन्हें फ़िल्टर कर सकता हूं या कहां जा रहा हूं?

उत्तर

2

यह काफी जवाब नहीं है जिसे मैं ढूंढ रहा था, लेकिन अब यह पर्याप्त रूप से अच्छी तरह से काम करता है। NSView उपखंड करके और निम्न विधियों को लागू करके, वह दृश्य तब बटन के रूप में कार्य कर सकता है।

- (void)mouseDown:(NSEvent *)theEvent { 
    [NSApp preventWindowOrdering]; 
// [self setNeedsDisplay:YES]; 
} 

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent { 
    return YES; 
} 

- (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent *)theEvent { 
    return YES; 
} 

और कुछ भी आवश्यक नहीं है, यही है। बेशक यह सभी एनएसबटन की भलाई को छोड़ देता है जिसे मैं रखना चाहता था, मुझे डिजाइन करना होगा और फिर बटन राज्यों को चित्रित करना और अपडेट करना होगा, लेकिन मुझे जवाब देने में खुशी है।

1

क्या आपने acceptsFirstMouse: चेक आउट किया है? इस घटना के लिए NSViewYES वापस आ सकता है यह कहने के लिए कि दृश्य को विंडो को अग्रभूमि में लाने के बजाय ईवेंट को संभालना चाहिए। संभवतः, घटना को रोककर, इसका उपयोग खिड़की को अग्रभूमि में लाने के लिए नहीं किया जाएगा, लेकिन मैं इसके लिए झुकाव नहीं कर सकता।

आपको स्पष्ट रूप से acceptsFirstMouse: ओवरराइड करने के लिए इस व्यवहार को रखने के लिए किसी भी नियंत्रण को उपclass करने की आवश्यकता होगी।

+0

स्वीकार करता है फर्स्टमाउस: और स्वीकार करता है फर्स्ट रेस्पॉन्डर: इसका कोई प्रभाव नहीं है, यह इस समस्या पर मेरा पहला प्रयास था (और मुझे ध्यान दिया जाना चाहिए)। हालांकि धन्यवाद। –

3

यह NSPanel के साथ पूरा किया जा सकता है जिसे निष्क्रिय करने पर छिपाने के लिए सेट किया गया है और केवल आवश्यकतानुसार कुंजी बनने के लिए सेट किया गया है। यह भी मानता है कि आप YES से -acceptsFirstMouse: पर नियंत्रण का उपयोग करेंगे; NSButton एस डिफ़ॉल्ट रूप से ऐसा करते हैं।

आप पैनल के लिए आईबी के माध्यम से फ्लैग निष्क्रिय करने पर छिपाने को बंद कर सकते हैं, लेकिन आपको इसे रखने के लिए पैनल को -setBecomesKeyOnlyIfNeeded:YES संदेश जारी करना होगा और ऐप को बटन क्लिक पर आगे आने से रोकना होगा।

+0

मुझे विश्वास है कि यह जवाब है, लेकिन एनएसवी व्यू संदर्भ (जहां स्वीकार करता है 'फर्स्टमाउस:' विधि परिभाषित किया गया है) कहता है कि यह 'NO' पर सेट है। और आखिर में 'NSView' subclassing वैसे भी कोई फर्क नहीं पड़ता। –

+0

कोकोडाडेव पर एक संक्षिप्त चर्चा मिली, http://www.cocoadev.com/index.pl?PreventWindowOrdering, यह वही है जो मैं चाहता हूं, हालांकि यह इसके बारे में जाने का एक बुरा तरीका लगता है। –

+0

'स्वीकार करता है 'फर्स्टमाउस:' विशेष रूप से 'एनएसबीटन' को' YES' लौटने के रूप में कॉल करता है: "कई नियंत्रण वस्तुएं, हालांकि, जैसे 'एनएसबटन' और' एनएसएसएलडर 'के उदाहरण, उन्हें स्वीकार करते हैं, इसलिए उपयोगकर्ता तुरंत कर सकता है माउस बटन को छोड़ दिए बिना नियंत्रण में हेरफेर करें। " –

2

यह अपने व्यवहार को बदलने जब एप्लिकेशन सक्रिय है बिना एक NSButton क्लिक होने की घटनाओं पर प्रतिक्रिया बनाने के लिए संभव है:

इंटरफेस (ClickThroughButton.h):

#import <AppKit/AppKit.h> 

@interface ClickThroughButton : NSButton 

@end 

कार्यान्वयन (ClickThroughButton.m) :

#import "ClickThroughButton.h" 

@implementation ClickThroughButton 

- (BOOL)shouldDelayWindowOrderingForEvent:(NSEvent *)theEvent { 
    return ![NSApp isActive];  
} 

- (void)mouseDown:(NSEvent *)theEvent {  
    if (![NSApp isActive]) { 
     [NSApp preventWindowOrdering];   

     [self highlight:YES]; 

     NSEvent *mouseUpEvent = [[self window] nextEventMatchingMask:NSLeftMouseUpMask 
                untilDate:[NSDate distantFuture] 
                inMode:NSEventTrackingRunLoopMode 
                dequeue:YES]; 
     NSPoint mouseLocation = [self convertPoint:[mouseUpEvent locationInWindow] fromView:nil]; 
     BOOL mouseUpInside = [self mouse:mouseLocation inRect:[self bounds]]; 

     if (mouseUpInside) { 
      if ([self target]) 
       [[self target] performSelector:[self action] withObject:self]; 
     } 

     [self highlight:NO];    

    } else { 
     [super mouseDown:theEvent];   
    } 
} 

@end 
+0

यह काम करता है, लेकिन शीर्ष पर संवाद कैसे रखें? मैं कीबोर्ड व्यूअर जैसे एप्लिकेशन को विकसित कर रहा हूं। –

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