2009-06-17 11 views
16

WPF में टाइटल बार में यह बटन कैसे जोड़ सकता है, इसका उपयोग बहुत से अनुप्रयोगों में किया जा रहा है, मैंने सोचा कि यह बनाया जाएगा या कुछ ऐसा होगा, लेकिन ऐसा लगता है कि ऐसा नहीं है। वैसे भी मुझे बताएं अगर आप इसके बारे में कुछ जानते हैं।सहायता "?" बटन

धन्यवाद।

संपादित करें:

कुछ भी this के बराबर नहीं है?

असल में, क्या है? जीत फ़ॉर्म में आइकन, आपको यह करने की ज़रूरत है:

public Form1() 
{ 
    InitializeComponent(); 

    this.HelpButton = true; 
    this.MaximizeBox = false; 
    this.MinimizeBox = false; 
} 

क्या WPF में ऐसा कुछ नहीं है?

+0

टाइटल बार क्यों? अधिकांश ऐप्स जो मैं देखता हूं उसे मेनू बार में डाल दिया जाता है। –

+1

बात यह है कि हम इसे अधिकांशतः संवाद विंडो पर उपयोग करने जा रहे हैं, जिसमें आमतौर पर मेनू बार नहीं होता है। इसे क्लिक करने से उस विंडो के लिए प्रासंगिक मदद मिल जाएगी। फ़ॉन्ट संवाद विंडो में एमएस वर्ड 2007 में कुछ ऐसा है। – Carlo

उत्तर

30

यह आसान है, बस इस कोड को अपनी विंडो कक्षा में डालें।

यह कोड WS_MINIMIZEBOX और WS_MAXIMIZEBOX शैलियों को निकालने के लिए इंटरऑप का उपयोग करता है और WS_EX_CONTEXTHELP विस्तारित शैली को जोड़ता है (प्रश्न चिह्न केवल तभी दिखाया जाएगा जब आप कम से कम बटन को हटा दें और अधिकतम करें)।

संपादित करें: सहायता बटन पर क्लिक पर क्लिक करें, यह WndProc में HwndSource.AddHook का उपयोग करके और SC_CONTEXTHELP के wParam के साथ WM_SYSCOMMAND संदेश सुनने के द्वारा किया जाता है।

जब कोई क्लिक पता चला है तो यह कोड एक संदेश बॉक्स दिखाएगा, इसे किसी ईवेंट में बदल देगा, रूटेड ईवेंट या यहां तक ​​कि एक कमांड (एमवीवीएम ऐप्स के लिए) पाठक के लिए एक अभ्यास के रूप में छोड़ा जाएगा।

private const uint WS_EX_CONTEXTHELP = 0x00000400; 
private const uint WS_MINIMIZEBOX = 0x00020000; 
private const uint WS_MAXIMIZEBOX = 0x00010000; 
private const int GWL_STYLE = -16; 
private const int GWL_EXSTYLE = -20; 
private const int SWP_NOSIZE = 0x0001; 
private const int SWP_NOMOVE = 0x0002; 
private const int SWP_NOZORDER = 0x0004; 
private const int SWP_FRAMECHANGED = 0x0020; 
private const int WM_SYSCOMMAND = 0x0112; 
private const int SC_CONTEXTHELP = 0xF180; 


[DllImport("user32.dll")] 
private static extern uint GetWindowLong(IntPtr hwnd, int index); 

[DllImport("user32.dll")] 
private static extern int SetWindowLong(IntPtr hwnd, int index, uint newStyle); 

[DllImport("user32.dll")] 
private static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int width, int height, uint flags); 


protected override void OnSourceInitialized(EventArgs e) 
{ 
    base.OnSourceInitialized(e); 
    IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle; 
    uint styles = GetWindowLong(hwnd, GWL_STYLE); 
    styles &= 0xFFFFFFFF^(WS_MINIMIZEBOX | WS_MAXIMIZEBOX); 
    SetWindowLong(hwnd, GWL_STYLE, styles); 
    styles = GetWindowLong(hwnd, GWL_EXSTYLE); 
    styles |= WS_EX_CONTEXTHELP; 
    SetWindowLong(hwnd, GWL_EXSTYLE, styles); 
    SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); 
    ((HwndSource)PresentationSource.FromVisual(this)).AddHook(HelpHook); 
} 

private IntPtr HelpHook(IntPtr hwnd, 
     int msg, 
     IntPtr wParam, 
     IntPtr lParam, 
     ref bool handled) 
{ 
    if (msg == WM_SYSCOMMAND && 
      ((int)wParam & 0xFFF0) == SC_CONTEXTHELP) 
    { 
     MessageBox.Show("help"); 
     handled = true; 
    } 
    return IntPtr.Zero; 
} 
+0

यह काम करता है, एक और सवाल: मैं ऑनक्लिक हैंडलर को "?" में कैसे जोड़ूं बटन? – Carlo

+0

मैंने मदद बटन पर क्लिक का पता लगाने के लिए कोड जोड़ा है, उम्मीद है कि यह – Nir

+0

एक आकर्षण की तरह काम करता है। धन्यवाद! – Carlo

0

डब्ल्यूपीएफ के साथ बॉक्स से कोई मदद बटन नहीं निकलता है। हालांकि खुद को रोल करने के लिए धक्का नहीं होना चाहिए।

+0

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

+0

और सबसे अच्छा अभ्यास नहीं, या तो। इसके बजाय, मैं डब्ल्यूपीएफ ऐप्स देखता हूं जो अपने स्वयं के टाइटल बार का मज़ाक उड़ाते हैं, आदर्श भी नहीं। –

+0

@ ड्रू: हाँ, यह एकमात्र समाधान है जिसे मैंने अभी तक देखा है और यह मेरे लिए बहुत अच्छा प्रतीत नहीं होता है। विशेष रूप से क्योंकि हमारे पास पहले से ही बहुत सारे संवाद बॉक्स हैं और प्रत्येक के पास जाने और शीर्षक पट्टी को नकल करना अच्छा नहीं होगा। – Carlo

0

यदि आप गैर-क्लाइंट क्षेत्र में बटन जोड़ने का इरादा रखते हैं, तो this article पर एक नज़र डालें।

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