Bu sadece Pencere sınıfa bu kod gömme, basit.
Bu kod, WS_MINIMIZEBOX ve WS_MAXIMIZEBOX stillerini kaldırmak ve WS_EX_CONTEXTHELP genişletilmiş stilini eklemek için birlikte çalışma kullanır (soru işareti yalnızca simge durumuna küçült ve düğmelerini kaldırırsanız gösterilir).
DÜZENLEME: yardım düğmesindeki tıklatma algılaması eklendi, bu işlem HwndSource.AddHook kullanarak WndProc içine takılarak ve wParam of SC_CONTEXTHELP ile bir WM_SYSCOMMAND mesajı dinleyerek yapılır. Bir tıklama bu kod, bir ileti kutusu göstermek bir olayın, yönlendirilmiş olay veya (MVVM uygulamalar için) bile komuta içine bu değişen olacaktır algılandığında
okuyucuya alıştırma olarak bırakılmıştır.
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;
}
Neden başlık çubuğu? Gördüğüm çoğu uygulama bunu menü çubuğuna koydu. –
Şey, çoğunlukla, genellikle bir menü çubuğu olmayan iletişim pencerelerinde kullanacağız. Tıklandığında bu pencere için bağlamsal yardım getirecektir. Yazı tipi iletişim penceresinde MS Word 2007 gibi bir şey. – Carlo