source

기능 크기 조정을 그대로 유지하면서 WPF 창의 최대화 버튼 사용 안 함

lovecheck 2023. 5. 22. 21:09
반응형

기능 크기 조정을 그대로 유지하면서 WPF 창의 최대화 버튼 사용 안 함

옵션이 네 . 즉, WPF의 크기 조정 모드는 다음과 같습니다.NoResize,CanMinimize,CanResize그리고.CanResizeWithGrip유감스럽게도 크기 조정을 사용할 수 있는 옵션은 창을 최대화할 수도 있고 그렇지 않은 옵션은 제게 쓸모가 없습니다.

크기 조정 기능을 유지하면서 최대화 버튼을 비활성화하는 옵션이 있습니까?

고객의 요구를 충족시키지 못하는 솔루션을 선호합니다.WinAPI 물건들

최대화만 사용 안 함:

ResizeMode="CanMinimize"

WPF에는 WinForms와 같이 Maximize(최대화) 버튼만 비활성화할 수 있는 기본 기능이 없습니다.WinAPI 호출에 의존해야 합니다.무섭지 않아요.

[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

private const int GWL_STYLE = -16;
private const int WS_MAXIMIZEBOX = 0x10000;

private void Window_SourceInitialized(object sender, EventArgs e)
{
    var hwnd = new WindowInteropHelper((Window)sender).Handle;
    var value = GetWindowLong(hwnd, GWL_STYLE);
    SetWindowLong(hwnd, GWL_STYLE, (int)(value & ~WS_MAXIMIZEBOX));
}

설정하는 경우

WindowStyle="ToolWindow"

창의 속성에서 위쪽에 최소화 또는 최대화 단추가 없는 크기 조정 가능한 창을 제공합니다.사각형으로 보이고 닫기 버튼도 사각형이지만, 최소한 최소화와 최대화는 없습니다!

P/Invoke 메서드

관리되는(.)에서 관리되지 않는 코드(이 경우 C++)를 가장 쉽게 호출할 수 있는 방법NET) 코드는 플랫폼 호출 서비스(P/Invoke라고도 함)를 사용하는 것입니다.컴파일러에 관리되지 않는 함수의 선언을 제공하고 다른 관리되는 메서드를 호출하는 것과 마찬가지로 호출합니다.지정된 창의 특성을 변경하는 데 사용할 수 있는 관리되지 않는 SetWindowLong 메서드가 있습니다.P/Invoke를 사용하여 WPF 창 클래스에서 이 메서드를 호출할 수 있으려면 다음 선언을 창 클래스에 추가하기만 하면 됩니다.

[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

DllImport 특성은 메서드를 포함하는 DLL의 이름을 지정하며 extern 키워드는 C# 컴파일러에게 메서드가 외부에서 구현되며 응용 프로그램을 컴파일할 때 메서드에 대한 구현이나 메서드 본문을 찾을 수 없음을 알려줍니다.SetWindowLong 메서드에 전달될 첫 번째 인수는 언급된 단추를 비활성화할 창의 핸들입니다.관리되는 WindowInterop의 인스턴스를 생성하여 WPF 창에 대한 핸들을 얻을 수 있습니다.창의 SourceInitialized 이벤트에 대한 이벤트 핸들러의 Helper 클래스 및 Handle 속성에 액세스합니다.이 이벤트는 핸들이 완전히 만들어지면 발생합니다.SetWindowLong 메서드의 두 번째 인수는 설정할 창의 속성 또는 값을 상수 정수 값으로 지정합니다.창 스타일을 변경하려면 GWL_STYLE(= -16) 상수를 두 번째 인수로 메서드에 전달해야 합니다.

private const int GWL_STYLE = -16;

마지막으로 세 번째 인수는 대체 값을 지정합니다.여기서 사용할 수 있는 상수 집합은 다음과 같습니다.

private const int WS_MAXIMIZEBOX = 0x10000; //maximize button
private const int WS_MINIMIZEBOX = 0x20000; //minimize button

그러나 두 번째 인수(이 경우 창 스타일)에 의해 지정된 "속성"의 전체 값을 지정하는 DWORD를 전달해야 하므로 이러한 상수를 세 번째 인수로 메서드에 전달할 수 없습니다.특정 속성의 현재 값(이 경우 GWL_STYLE)을 검색하는 다른 GetWindowLong 메서드가 있습니다. 그런 다음 비트 연산자를 사용하여 SetWindowLong 메서드에 전달할 세 번째 매개 변수의 올바른 값을 가져올 수 있습니다.다음은 WPF에서 창의 최소화 단추를 비활성화하는 방법에 대한 전체 코드 샘플입니다.

public partial class MainWindow : Window
{
 [DllImport("user32.dll")]
 private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
 [DllImport("user32.dll")]
 private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int  dwNewLong);

 private const int GWL_STYLE = -16;

 private const int WS_MAXIMIZEBOX = 0x10000; //maximize button
 private const int WS_MINIMIZEBOX = 0x20000; //minimize button

 public MainWindow() {
  InitializeComponent();
  this.SourceInitialized += MainWindow_SourceInitialized;
}

private IntPtr _windowHandle;
private void MainWindow_SourceInitialized(object sender, EventArgs e) {
_windowHandle = new WindowInteropHelper(this).Handle;

 //disable minimize button
 DisableMinimizeButton();
}

protected void DisableMinimizeButton() {
  if (_windowHandle == IntPtr.Zero)
    throw new InvalidOperationException("The window has not yet been completely initialized");

   SetWindowLong(_windowHandle, GWL_STYLE, GetWindowLong(_windowHandle,  GWL_STYLE) & ~WS_MAXIMIZEBOX);
 }
}

최소화 버튼을 비활성화하는 것은 WS_MAXIMIZEBOX 상수를 WS_MIMIZEBOX로 바꾸기만 하면 됩니다.

또 다른 선택은 그것을 잡는 것입니다.StateChanged창이 최대화될 때 발생하는 이벤트입니다.그런 다음 간단히 설정합니다.WindowState"정상"으로.

그러나 이 경우 최대화 상자가 숨겨지지 않습니다.

private void Window_StateChanged(object sender, EventArgs e)
{
    if (WindowState == WindowState.Maximized)
    {
        WindowState = WindowState.Normal;
    }
}

최소화, 최대화 및 닫기 단추를 제거하고 필요한 단추를 직접 만드는 WindowStyle을 없음으로 설정하여 사용자 정의 창을 만들 수 있습니다.이에 대한 좋은 예입니다.

http://www.codeproject.com/Articles/131515/WPF-Custom-Chrome-Library

추가 작업을 제공하지만 WinAPI를 사용하고 싶지 않다면 선택 사항입니다.

언급URL : https://stackoverflow.com/questions/18707782/disable-maximize-button-of-wpf-window-keeping-resizing-feature-intact

반응형