我期待讓這將是這個樣子(不去管快速的Photoshop)的自定義窗口:如何用非矩形按鈕創建透明窗口?
alt text http://i35.tinypic.com/20ff803.png
主要的問題我已經是不使窗口透明(雖然我想任何信息是受歡迎的!),但我希望能夠只點擊按鈕的可見部分。例如,如果我點擊「5」按鈕左上方的外部,即使點擊了按鈕5的邊框,我希望它在「1」按鈕上註冊而不是「5」按鈕。如果我點擊「1」按鈕的左上方「角落」的外側,我希望它可以點擊我窗口下方的任何內容,而不是按鈕上的內容。我還需要能夠調整這個窗口的大小,並且按鈕中的圖片應該與它們一起調整大小。
我想使用與含有的PNG用α爲每個按鈕透明NSButtons透明NSWindow的,但我認爲重疊按鈕將是一個問題。
我也聽說過類似蝴蝶結,SweetFM並使用WebKit的施展接口的應用程序等。如果這是至少有可能的10.3,這將是有趣的,但我不知道如何也可以。
我環顧四周,點擊面具,地區或類似的東西,但我還沒有發現任何東西。我會更新這篇文章,因爲我發現更多的信息(如果我做的!)。
對如何進行任何提示?
(請注意,我在10.4和理想我需要支持一些老版本的Mac OS X的太工作。)
(另外,我發現了「圓窗」例如蘋果的開發。網站但它不會在10.4,所以我不知道這是要走的路提前跑了。)
謝謝!
UPDATE:
(見更新2,這個問題已經得到解決)
OK,現在我有一個稍微不同的(但不無關係)的問題。我所做的,到目前爲止是這樣的:
我選擇了做,我就可以用我的每個按鍵的自定義控制:
1子類的NSControl並重寫drawRect中,mouseUp事件,和的mouseDragged鼠標按下。通過這種方式,我可以在拖動按鈕(移動窗口)時獲得所需的行爲。
2-將每個按鈕的圖像狀態(相同的形狀,但其中一個變暗)加載到NSImages中,並在必要時使用compositeToPoint:fromRect:operation:
將它們繪製到視圖中。這些圖像是185 X 185像素與從Photoshop出口阿爾法PNG文件。
3-獲取NSImage中的位圖表示:
NSBitmapImageRep *bitRep = [[NSBitmapImageRep imageRepWithData:[unpressedImage TIFFRepresentation]] retain];
OR
NSBitmapImageRep *bitRep = [[unpressedImage representations] objectAtIndex:0];
似乎都給予同樣的結果。我試圖將這個位圖代表合成到我的窗口,看看圖像是否與原始尺寸相同並且看起來不錯(你會看到爲什麼我在枚舉之後做了這件事......)。
4-在鼠標事件的方法,我用位圖表示獲取alpha分量的特定點:
NSPoint mouse = [self convertPoint:[theEvent locationInWindow] fromView:nil]; // Returns the correct x and y positions on the control (i.e: between 0 and 185 for each axis).
NSColor *colorUnderMouse = [[[unpressedImage representations] objectAtIndex:0] colorAtX:mouse.x y:mouse.y];
float alpha = [colorUnderMouse alphaComponent];
然後,我打印的Alpha值的控制檯,但我得到很奇怪的結果。在鼠標下獲取alpha組件和顏色看起來很乍看起來(返回的顏色和alpha位於我的位圖中),但看起來顏色不是在bitRep
中的正確位置拍攝的, bitRep
失真(當我在窗口上合成bitRep
時,它不會失真,這很奇怪)。再一次,我仔細檢查了x和y鼠標座標在(0,185)範圍內,NSBitmapImageRep
的大小也是185 x 185。
首先看起來NSBitmapImageRep
與我的NSImage
相比水平翻轉。如果我翻轉我的座標,返回的值似乎大部分都是正確的(大部分形狀似乎與返回的值相符),但仍有部分圖像返回錯誤的值。
我在這一點上毫無頭緒,從未與NSBitmapImageRep
一起工作過,也許我只是忘記指定一些關於我的圖像的格式信息,這就是爲什麼值是關閉的。有人可以澄清這一點嗎?再次
謝謝!
更新2:
好沒關係,我發現這個問題。我使用setColor:atX:y:方法在打印到窗口之前在bitRep上繪製了一個彩色點,並且問題在白天清晰顯示:在bitRep中Y座標反轉,但圖像打印的是「good 「定位。這意味着bitRep具有「Windows風格」的左上角原點座標系,而窗口具有笛卡爾座標系(左下)原點。簡單地顛倒我的Y座標可以解決我獲得alpha分量和顏色的問題。
這一定是寫在文檔的某個地方,對不起,因爲我缺乏研究而打擾你......!
謝謝,這將是該中心按鈕的可能性,但與外面的按鈕,會比較困難,需要一堆的邊界檢查代碼...如果我改變什麼我的按鈕的位置由於某種原因?(這不是一個個人項目,所以這可能會有所改變,不幸的是)然後我不得不重寫大部分的邊界檢查代碼......有沒有辦法用某種掩碼來做到這一點?說「讓點擊通過,如果位圖透明在這一點上」? – Form 2009-10-06 20:40:47
我不認爲你可以像你想的那樣使用面具(透明度檢測等)。這些都是非常基本的形狀(內圈下方的外部按鈕的部分圓圈)。您可以在代碼中訪問控件的當前座標和尺寸,並使用它們來計算命中範圍,以便不對任何東西進行硬編碼。使用中心按鈕位於最佳位置的事實。 – 2009-10-06 21:27:23
它可以使用透明度(alpha)檢測,它工作得很好,雖然我現在使用的方法是10.4+,但有一種方法可以使用除colorAtX之外的其他方法來執行此操作:y:只要您有權訪問就像mahboudz指出的那樣。 – Form 2009-10-09 13:28:26