winform 程序我设置了一个窗体无边框,设置了size,调试运行的时候size又变成了其他?

zks911 2016-08-04 01:50:03
winform 程序我设置了一个窗体无边框,设置了size(900,477)因为我的背景图片是(900,477),调试运行的时候size又变成了(675,382),背景图片也就对应不上了,我尝试了好多方式都还是这样?大神谁知道问题出在哪里啊?
...全文
942 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
desperaso 2018-07-06
  • 打赏
  • 举报
回复
无边框,四边阴影,win10正常,win7阴影有点浓

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

public class winFormEX : Form
{
[DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")]
private static extern IntPtr CreateRoundRectRgn
(
int nLeftRect,
int nTopRect,
int nRightRect,
int nBottomRect,
int nWidthEllipse,
int nHeightEllipse
);

[DllImport("dwmapi.dll")]
public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset);
[DllImport("dwmapi.dll")]
public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize);
[DllImport("dwmapi.dll")]
public static extern int DwmIsCompositionEnabled(ref int pfEnabled);
private bool m_aeroEnabled;
private const int CS_DROPSHADOW = 0x00020000;
private const int WM_NCPAINT = 0x0085;
private const int WM_ACTIVATEAPP = 0x001C;

public struct MARGINS
{
public int leftWidth;
public int rightWidth;
public int topHeight;
public int bottomHeight;
}

private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;

protected override CreateParams CreateParams
{
get
{
m_aeroEnabled = CheckAeroEnabled();

CreateParams cp = base.CreateParams;
if (!m_aeroEnabled)
cp.ClassStyle |= CS_DROPSHADOW;

return cp;
}
}

private bool CheckAeroEnabled()
{
if (Environment.OSVersion.Version.Major >= 6)
{
int enabled = 0;
DwmIsCompositionEnabled(ref enabled);
return (enabled == 1) ? true : false;
}
return false;
}

protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCPAINT:
if (m_aeroEnabled)
{
var v = 2;
DwmSetWindowAttribute(this.Handle, 2, ref v, 4);
MARGINS margins = new MARGINS()
{
bottomHeight = 1,
leftWidth = 1,
rightWidth = 1,
topHeight = 1
};
DwmExtendFrameIntoClientArea(this.Handle, ref margins);

}
break;
default:
break;
}
base.WndProc(ref m);
}

[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
private void _MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, 0xA1, 0x02, 0);
}
}

public winFormEX()
{
SetStyle(ControlStyles.DoubleBuffer, true);
FormBorderStyle = FormBorderStyle.None;
MouseDown += new MouseEventHandler(_MouseDown);
}
}


使用

public partial class Form1 : winFormEX
{
public Form1()
{
InitializeComponent();

BackColor = Color.White;
}

private void button1_Click(object sender, System.EventArgs e)
{
Close();
}
}
  • 打赏
  • 举报
回复
我跟你们说有一个可能,就是他的开发机分辨率太小。
我记不清当年勇VS2013还是15,在设计模式下窗口超出当前分辨率你打开窗口设计器后会自动裁切超出当前分辨率的窗体。
我之前遇到之后一气之下把Size设置全部代码化移到
InitializeComponent();

后面了………………
锦小木 2018-07-05
  • 打赏
  • 举报
回复
同样的问题- -不知道该如何解决。。。而且我的Form,直接new出来的话大小不变,new之后设置location大小就会改变。。。一开始以为是dpi的问题,后来电脑分辨率和显示比例我都调了还是不行。。。用断点监控发现,初始化窗体时,运行到clientsize的时候赋值一次,size变化了,然后运行到MaximumSize和MinimumSize时候又被强行改回来。当运行到location赋值的时候size又被变一次。。。后来发现FormBorderStyle在设置成Tool、Window时后才会这样。。。别的就没事。。。不明白为啥- -
老牛18岁 2017-03-24
  • 打赏
  • 举报
回复
最好不要用winform,破解机率太大.
xuggzu 2017-03-23
  • 打赏
  • 举报
回复
给form的sizechanged事件写个函数,把断点设到函数里,F5,中断后单步执行,看走到哪,根据情况判断错误。
douding911019 2017-03-23
  • 打赏
  • 举报
回复
楼主你好,我也遇到这样的问题,百思不得,你解决了么?
XD-1 2016-08-15
  • 打赏
  • 举报
回复
加个监视(watch)跟踪一下size啊,调代码的时候仔细一点,看size怎么变化的
zks911 2016-08-15
  • 打赏
  • 举报
回复
引用 37 楼 xuzuning 的回复:


为啥我的就是这样子啊。。。
xuzuning 2016-08-15
  • 打赏
  • 举报
回复
xuzuning 2016-08-15
  • 打赏
  • 举报
回复
测试时在窗体中加了个 Lable
        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = ClientSize.ToString();
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            label1.Text = ClientSize.ToString();
        }
均能显示出正确的尺寸
xuzuning 2016-08-15
  • 打赏
  • 举报
回复
经测试,没有发现你说的问题(VSAT010)
zks911 2016-08-15
  • 打赏
  • 举报
回复
引用 33 楼 xuzuning 的回复:
分别贴出 form.cs 和 form1.design.cs
form1.design.cs:


namespace WindowsFormsApplication1
{
    partial class Form1
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.BackColor = System.Drawing.SystemColors.AppWorkspace;
            this.CausesValidation = false;
            this.ClientSize = new System.Drawing.Size(900, 477);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.MaximumSize = new System.Drawing.Size(900, 477);
            this.MinimumSize = new System.Drawing.Size(900, 477);
            this.Name = "Form1";
            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);
            this.ResumeLayout(false);

        }

        #endregion
    }
}


form.cs:里面没有任何我的代码!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {

        }
    }
}

xuzuning 2016-08-15
  • 打赏
  • 举报
回复
分别贴出 form.cs 和 form1.design.cs
zks911 2016-08-15
  • 打赏
  • 举报
回复
引用 30 楼 robake 的回复:
代码里是不是加了Form_Resize的事件?
并没有
zks911 2016-08-15
  • 打赏
  • 举报
回复
引用 29 楼 xuzuning 的回复:
[quote=引用 25 楼 zks911 的回复:] [quote=引用 24 楼 yuankaiwsl 的回复:] 上传一个新的解决方案,让大家看看到底怎么回事
http://download.csdn.net/detail/zks911/9596166 你看看,就新建一个窗体就是这样的问题![/quote]这么快就删掉了?问题解决了吗?[/quote] 问题并没有解决。csdn审核不通过给删了。。
robake 2016-08-08
  • 打赏
  • 举报
回复
代码里是不是加了Form_Resize的事件?
xuzuning 2016-08-06
  • 打赏
  • 举报
回复
引用 25 楼 zks911 的回复:
[quote=引用 24 楼 yuankaiwsl 的回复:] 上传一个新的解决方案,让大家看看到底怎么回事
http://download.csdn.net/detail/zks911/9596166 你看看,就新建一个窗体就是这样的问题![/quote]这么快就删掉了?问题解决了吗?
巴士上的邂逅 2016-08-06
  • 打赏
  • 举报
回复
看form.design.cs文件,最大最小值变了没
zks911 2016-08-05
  • 打赏
  • 举报
回复
引用 26 楼 yuankaiwsl 的回复:
你发的程序,窗体的最大最小尺寸都是675, 382。 我把backgroundImage设置好,窗体最大最小尺寸都改成900, 477,运行起来还是900, 477。 你确定这个程序运行时会出现问题
这么奇怪?我设置了最大最小是900*477,但是运行出来的就是675, 382,怎么你那里变成675, 382,,,那到底是哪里的原因啊。。。
robake 2016-08-05
  • 打赏
  • 举报
回复
引用 21 楼 robake 的回复:
form里maxsize和minsize选择,把值设上
加载更多回复(25)

111,078

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧