2013-12-09 5 views
1

Как скрыть границу окна по умолчанию (форма) (я хочу использовать мой), но все еще есть доступная привязка и тень формы?Sizable App Without Border (FormBorderStyle = Sizable)

Разработка на (настольном) Win 8, считается, что это функция DWM API или что-то в этом роде.

PS: Я новичок в DWM.

+0

Вместо того, чтобы скрывать границу, попробуйте покрасить свою границу сверху по умолчанию. Перехватите сообщение NC_PAINT. Таким образом, вы сможете использовать возможности Windows. –

+0

Хороший ответ, но если я ХОЧУ Скрыть границу границы ... с WindowStyles, возможно ... Как это сделать? – VentyCZ

+0

DONE, больше не нужна помощь :) – VentyCZ

ответ

0

Хорошо, я наконец нашел решение для своей проблемы.

Первоначально я использовал WinForms, но с годами я перешел на WPF.

WPF получил что-то, называемое WindowChrome, которое является рамкой/держателем окна, которое содержит содержимое окна. & меняется каждый раз, когда есть новая итерация Windows.

Я узнал, что есть функция, которая позволяет легко легко изменить свойство WindowChrome окна.

Я сделал свою собственную функцию, где я могу передать свойства для нового хрома:

/// <summary> 
/// Changes the WindowChrome of selected Window (wnd) &amp; adjust its properties 
/// </summary> 
/// <param name="wnd">Window to affect</param> 
/// <param name="glassThickness">Thickness of glass border (0 - no glass = no shadow, lower than 0 - whole window, higher than 0 - real border)</param> 
/// <param name="resBorder">Thickness of resize border - where Windows natively supports resizing of the window</param> 
/// <param name="topMove">Height of the window header/title - Windows native support for changing position of the window (from top), disables mouse events of controls underneath it</param> 
/// <remarks></remarks> 
public void NiceChrome(Window wnd, Thickness glassThickness, Thickness resBorder, int topMove) 
{ 
    WindowStyle = WindowStyle.SingleBorderWindow; 
    Shell.WindowChrome.SetWindowChrome(wnd, new Shell.WindowChrome 
    { 
     ResizeBorderThickness = resBorder, 
     GlassFrameThickness = glassThickness, 
     UseAeroCaptionButtons = false, 
     CaptionHeight = topMove, 
     CornerRadius = new CornerRadius(0), 
     NonClientFrameEdges = Shell.NonClientFrameEdges.None 
    }); 
} 

Я надеюсь, что я сделал комментарий легко понять, если кто-то хочет использовать эту функцию. Также я узнал, что использование Thickness (-1) на glassThickness делает все окно под стеклом под ним без дополнительного пространства/границы вне самого окна, но при этом сохраняет эффект тени.

Еще одно замечание заключается в том, что вы должны изменить прописку окна при максимальном увеличении, поскольку Windows все еще хочет отрезать границу/стекло, которого больше нет.

PS: Английский - это не мой родной язык, если в грамматике есть какие-либо проблемы, исправьте его, редактируя. Спасибо & Да, я отвечаю на свой вопрос, который почти 2 года (мои пристрастия).