2012-03-14 15 views
8

मैं यह जानना चाहता हूं कि जब कुछ सेटिंग्स को सहेजने के लिए फॉर्म को अधिकतम किया जा रहा है (आकार और न ही स्थिति से संबंधित) और आकार और स्थिति को थोड़ा सा संशोधित करें। क्या ऐसा करने का एक सार्वभौमिक तरीका है? मैंने this article में WM_SYSCOMMAND संदेश को पकड़ने का प्रयास किया है। यह बटन को अधिकतम करके मेनू से अधिकतम करने के लिए अच्छी तरह से काम करता है, लेकिन जब मैं WIN + UP कीस्ट्रोक दबाता हूं तो इसे निकाल दिया नहीं जाता है। क्या किसी को भी सार्वभौमिक तरीका पता है कि अधिकतम + वाईएन + यूपी कीस्ट्रोक के मामले में अधिकतम घटना को कैसे पकड़ें?फॉर्म को अधिकतम करने के दौरान कैसे पता लगाया जाए?

धन्यवाद

+4

आप 'WM_GETMINMAXINFO' संभाल कर सकते हैं। – kobik

+0

@ कोबिक, धन्यवाद, लेकिन आकार और स्थिति केवल एकमात्र चीजें नहीं है जो मैं करना चाहता हूं (बुरा उदाहरण, मुझे पता है)। मुझे वास्तव में पता लगाने की आवश्यकता है कि खिड़की को अधिकतम करने के लिए कब जा रहा है और मैं इसे WM_GETMINMAXINFO में नहीं पहचान सकता। –

उत्तर

11

आप विंडो के राज्य को बचाने के लिए WM_GETMINMAXINFO संदेश उपयोग कर सकते हैं और फिर WMSize संदेश का उपयोग करता है, तो विंडो को बड़ा किया गया था जांच करने के लिए।

में तुम इतनी तरह mesage हैंडलर की घोषणा के रूप में:

procedure WMSize(var Msg: TMessage); message WM_SIZE; 

और इस तरह संभाल:

procedure TForm57.WMSize(var Msg: TMessage); 
begin 
    if Msg.WParam = SIZE_MAXIMIZED then 
    ShowMessage('Maximized');  
end; 
+1

यह आग बहुत देर हो चुकी है? (* के बाद * फॉर्म अधिकतम है)। – kobik

+1

@ कोबिक, हां यह संदेश अधिकतम करने के बाद आग लगता है, ओपी राज्य को बचाने के लिए 'WM_GETMINMAXINFO' का उपयोग कर सकता है और फिर विंडो को अधिकतम किया गया था या नहीं, यह जांचने के लिए' WMSize' का उपयोग करें। – RRUZ

7

विन + यूपी WM_SYSCOMMAND संदेशों उत्पन्न नहीं करता है, वह यह है कि आप उन्हें क्यों नहीं पकड़ सकते। यह WM_GETMINMAXINFO, WM_WINDOWPOSCHANGING, WM_NCCALCSIZE, WM_MOVE, WM_SIZE, और WM_WINDOWPOSCHANGED संदेश उत्पन्न करता है, हालांकि। आरआरयूजेड की तरह, WM_GETMINMAXINFO का उपयोग यह पता लगाने के लिए करें कि अधिकतम कार्य कब शुरू होने वाला है और WM_SIZE यह समाप्त होने के समय पता लगाने के लिए है।

7

IMO, आप WM_GETMINMAXINFO उपयोग नहीं कर सकते "का पता लगाने के लिए जब एक अधिकतम आपरेशन शुरू करने के लिए बारे में है" के रूप में @Remy कहा।

में तथ्य केवल संदेश Msg.CmdType=SC_MAXIMIZE या गैर-दस्तावेजी SC_MAXIMIZE2 = $F032 साथ WM_SYSCOMMAND है यह कर सकते हैं कि - लेकिन यह Win+UP के माध्यम से, या उदाहरण के लिए ShowWindow(Handle, SW_MAXIMIZE) का उपयोग करके नहीं भेजा जा रहा है।

एक ही रास्ता मैं पता लगा सकता है कि एक खिड़की के बारे में अधिकतम किया जा रहा है WM_WINDOWPOSCHANGING के माध्यम से है जो WM_GETMINMAXINFO के बाद सही निकाल दिया जाता है:

type 
    TForm1 = class(TForm) 
    private 
    procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING; 
    end; 

implementation 

const 
    SWP_STATECHANGED = $8000; 

procedure TForm1.WMWindowPosChanging(var Message: TWMWindowPosChanging); 
begin 
    inherited; 
    if (Message.WindowPos^.flags and (SWP_STATECHANGED or SWP_FRAMECHANGED)) <> 0 then 
    begin 
    if (Message.WindowPos^.x < 0) and (Message.WindowPos^.y < 0) then 
     ShowMessage('Window state is about to change to MAXIMIZED'); 
    end; 
end; 
संबंधित मुद्दे