Tobias Wälde Ответов: 5

Форма C# без полей без заголовка


Эй там,

Я хочу создать форму, которая имеет только границу windows-aero (в win 10 синяя линия с тенью) без строки заголовка.
Очень важно сохранить функцию изменения размера.

Моя проблема-это белая линия вверху, которую вы можете увидеть на этом скриншоте:
problem. PNG-Google Диск[^]


Пожалуйста, помогите мне

с уважением
Тобиас Вальде

Что я уже пробовал:

this.BorderStyle = FormBorderStyle.SizableToolWindow;
this.ControlBox = false;
this.Text = String.Empty;

5 Ответов

Рейтинг:
38

Member 12680324

Winform слишком сложно сделать таким образом. но без тени это возможно, может быть - вам нужно создать свою собственную собственную тень.
путем преобразования yourWinform в управляющую библиотеку
затем используйте WindowsFormsIntegration и попробуйте его в WPF, если это возможно


Tobias Wälde

спасибо, полезный ответ, но, к сожалению, я не могу развиваться в wpf, может быть, я попробую учебник купить книгу :D

Рейтинг:
34

#realJSOP

Я не сделал обязанности и достижения долгое время, но попробовать formborderstyle значение.Вместо этого FixedSingle.

РЕДАКТИРОВАТЬ =============================

Вы всегда можете использовать interop и использовать Win32 API для установки стиля окна. Это довольно сложно, но вполне возможно. Имейте в виду, что как только вы снимаете заголовок, пользователь не может переместить окно, если вы не напишете код, чтобы разрешить его (если я правильно помню, метод API, который вас интересует, - это CreateWindowEx). Выезд www.pinvoke.net - у них есть прототипы и константы, доступные для поддержки большинства методов Windows API.

То, что вы пытаетесь сделать, не соответствует лучшей практике пользовательского интерфейса Windows, поэтому ожидайте, что вам придется написать кучу странного кода, чтобы реализовать свою мечту. По моему опыту, нестандартный пользовательский интерфейс тратится впустую на вашего обычного пользователя, который просто хочет выполнить свою работу и закрыть приложение. Просто говорю...


Tobias Wälde

спасибо за быстрый ответ.
во-первых, я перепробовал каждый стиль formborderstyle и создал свои собственные границы...
тогда фиксированные окна бесполезны в моем проекте.

в любом случае спасибо

#realJSOP

Я обновил свой ответ.

Tobias Wälde

спасибо, очень полезно

Рейтинг:
2

OriginalGriff

Самое лучшее, что вы можете сделать, это установить свойство ControlBox в false, и свойство Text к пустой строке. Он оставляет" короткую " полосу вверху (около 5 пикселей), но остается пригодным для использования и значительным.


Tobias Wälde

во-первых, спасибо за быстрый ответ.

эта панель очень раздражает, потому что я хочу добавить значок и изменить backcolor-свойство...

есть ли какая-нибудь возможность нарисовать такую панель или СТХ над этим баром?

OriginalGriff

Ты можешь...но это нехорошо.
См. здесь предысторию и некоторые предупреждения:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd162743(v=против 85). aspx
И взгляните на это:
http://www.codeproject.com/Articles/55180/Extending-the-Non-Client-Area-in-Aero
например, делать что-то вроде того, что вы хотите.
Имейте в виду, что Aero (Win7) и Win10 могут работать не совсем одинаково, поэтому будьте готовы к некоторым экспериментам.

Tobias Wälde

спасибо, я собираюсь попробовать это

OriginalGriff

Пожалуйста!

Рейтинг:
2

BillWoodruff

Вот одно решение, которое приводит к отсутствию границы формы и делает форму повторно значительной:

1. Установите 'FormBorderStyle в' FixedToolWindow и спрячьте другие обычные вещи.

2. Этот пример не включает в себя код для перемещения формы; это остается для вас, чтобы написать.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace YourNameSpace
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        const int MoveZoneSize = 16;
        const int ReSizeThreshold = 4;

        private Rectangle scrnBounds;
        private Rectangle moveZone;

        // for use when making the Form movable
        private int mdx, mdy, dx, dy;
        
        private bool mouseIsUp = true;

        private void Form1_Load(object sender, EventArgs e)
        {
            UpdateScreenSize();
        }

        private void UpdateScreenSize()
        {
            moveZone = new Rectangle(0,0,MoveZoneSize,MoveZoneSize);
            scrnBounds = this.DisplayRectangle;
            moveZone.Offset(scrnBounds.Right - MoveZoneSize, scrnBounds.Bottom - MoveZoneSize);    
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (ModifierKeys == Keys.Alt && e.KeyCode == Keys.Escape)
            {
                this.MouseMove -= Form1_MouseMove;
                this.Close();
            }
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (moveZone.Contains(e.Location))
            {
                mdx = e.X;
                mdy = e.Y;

                this.MouseMove += Form1_MouseMove;
            }
        }
        
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            this.MouseMove -= Form1_MouseMove;
            UpdateScreenSize();
        }

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            dx = Math.Abs(e.X - mdx);
            dy = Math.Abs(e.Y - mdy);

            if (dx < ReSizeThreshold && dy < ReSizeThreshold) return;

            this.Width = e.X;
            this.Height = e.Y;
        }
    }
}
Записи:

1. создается прямоугольник (квадрат) 'moveZone, который охватывает область нижнего правого края формы размера 'MoveZoneSize.

2. определен порог "демпфирования" ReSizeThreshold событий перемещения мыши. это может сделать изменение размера формы визуально более плавным.

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

4.в событии перемещения мыши вычисляется Дельта перемещения мыши, и если она меньше 'ReSizeThreshold, то метод завершается. если дельта больше, то форма изменяется, и текущие границы формы и границы прямоугольника moveZone пересчитываются заново.

Прочие комментарии:

1. в зависимости от компьютера, видеокарты, памяти и т. д., а также от возможной сложности элементов формы и использования в них якоря и док-станции, отступа, поля и т. д. Свойства: визуальное качество изменение размера формы мышью во время выполнения ... может варьироваться. Конечно, вы должны установить для свойства формы 'DoubleBuffered значение 'true.


Tobias Wälde

спасибо, но это не убирает эту раздражающую белую полосу сверху...

BillWoodruff

Он работает на моей машине под управлением Win 10. Проверьте, чтобы убедиться, что вы установили:

1. FormBorderStyle to ' FixedToolWindow
2. ShowIcon to ' None
3. Обивка на 0,0,0,0
4. SizeGripStyle to ' None

Вы настроили внешний вид окна в Win 10 ?

твое здоровье, Билл

Member 12239906

Это пока не работает

BillWoodruff

Затем откройте новый вопрос, опубликуйте свой код и четко опишите, что не работает.

Рейтинг:
1

Karthik_Mahalingam

проверить это c# - Как переместить и изменить размер формы без границы? - переполнение стека[^]

проверил, работает..
не уверен, что это будет соответствовать вашим требованиям. попробуй.


Tobias Wälde

спасибо, перемещение формы-это не проблема
но я хочу сохранить исходную границу окна, чтобы иметь тень вокруг формы

Karthik_Mahalingam

проверить это
http://stackoverflow.com/a/19164145/1147428