小编Tre*_*ott的帖子

ComboBox在下拉时如何捕获鼠标?

我试图模拟ComboBox下拉列表的行为(或其他下拉菜单的行为,包括上下文菜单),当您点击其他任何地方时,下拉关闭,即使在无法聚焦的事情上也是如此.

我已经尝试订阅MouseCaptureChanged,LostFocus和Leave等事件.我有一个自定义UserControl作为下拉列表,我只想在用户点击其他任何地方时关闭它.

这似乎是在许多控件中完成的事情,所以如果没有一个简单的方法,我会感到惊讶.

到目前为止,我可以提出的过于复杂的方法是使用pinvoke和SetCapture()函数,或者创建一个MessageFilter.如果这些是唯一的选择,我不确定哪个更好.

.net c# mouse combobox capture

7
推荐指数
1
解决办法
2098
查看次数

如何使用ScrollableControl并将AutoScroll设置为false

我有一个自定义控件,可以放大自定义绘制的文档画布.

我尝试使用AutoScroll,但它没有给出满意的结果.当我将AutoScrollPosition和AutoScrollMinSize背靠背(以任何顺序)设置时,它会强制绘画并在每次变焦时引起抖动.我假设这是因为它修改了两个属性时调用了Update而不是Invalidate.

我现在手动设置Horizo​​ntalScroll和VerticalScroll属性,AutoScroll设置为false,因为每次缩放级别或客户端大小更改时:

int canvasWidth = (int)Math.Ceiling(Image.Width * Zoom) + PageMargins.Horizontal;
int canvasHeight = (int)Math.Ceiling(Image.Height * Zoom) + PageMargins.Vertical;

HorizontalScroll.Maximum = canvasWidth;
HorizontalScroll.LargeChange = ClientSize.Width;

VerticalScroll.Maximum = canvasHeight;
VerticalScroll.LargeChange = ClientSize.Height;

if (canvasWidth > ClientSize.Width)
{
    HorizontalScroll.Visible = true;
}
else
{
    HorizontalScroll.Visible = false;
    HorizontalScroll.Value = 0;
}

if (canvasHeight > ClientSize.Height)
{
    VerticalScroll.Visible = true;
}
else
{
    VerticalScroll.Visible = false;
    VerticalScroll.Value = 0;
}

int focusX = (int)Math.Floor((FocusPoint.X * Zoom) + PageMargins.Left);
int focusY = …
Run Code Online (Sandbox Code Playgroud)

c# controls winforms scrollable

7
推荐指数
1
解决办法
5644
查看次数

与Backbone-Relational实现多对多关系

我有一个简单的应用程序,它定义了两个类,a Person和a PersonGroup,其中存在多对多关系.一个人可以没有任何组,或者被分配给所有组,以及介于两者之间的任何组.

backbonerelational.org上的示例建议使用中间模型来实现多对多关系,但是我不能将此模式用于获取(反序列化)和保存(序列化).

我想要做的是使用Backbone来反序列化类似于以下内容的JSON:

{
    People:
    [
        {
            "ID": 1,
            "Name": "John"
        },
        {
            "ID": 2,
            "Name": "Bob"
        },
        {
            "ID": 3,
            "Name": "Tim"
        },
    ],
    PeopleGroups:
    [
        {
            "ID": 1,
            "Name": "Owners",
            "People":
            [
                1,
                2
            ],
        },
        {
            "ID": 2,
            "Name": "Everyone",
            "People":
            [
                1,
                2,
                3
            ],
        },
    ]
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Knockback/Knockout进行数据绑定,所以问题是我需要能够通过引用访问关系.除非我能创建一个Knockback.CollectionObservable来包装集合并将ID解析为引用,否则ID数组对我没有任何帮助.

javascript backbone.js backbone-relational knockback.js

7
推荐指数
1
解决办法
2557
查看次数

.NET Framework 2.0 vs 3.5/4.0 ...使用旧版本有任何可能的优势吗?

我的项目负责人坚持使用仅针对.NET 2.0框架并且仅支持C#2.0语法的Visual Studio 2005.

他坚持认为2.0框架对于旧计算机具有更高的兼容性和性能.旧的,我的意思是5-8岁的Windows XP机器.

假设我们只支持最少的Windows XP/Server 2003,那么使用.NET 2.0是否有任何优势?

我很确定即使针对.NET 2.0,如果我们升级到VS2005,我们也可以在代码中使用C#3.0语法(lambdas,自动实现的属性等).

.net c# frameworks

6
推荐指数
2
解决办法
7137
查看次数

从半透明位图创建GraphicsPath

我想创建一个GraphicsPath和一个Points列表,以形成位图的非透明区域的轮廓.如果需要,我可以保证每个图像只有一个非透明像素的固体集合.因此,例如,我应该能够沿着像素的边缘顺时针或逆时针记录点并执行完全闭环.

该算法的速度并不重要.但是,如果我可以在较小且较不复杂的GraphicsPath中跳过某些点来减少,那么结果点的效率是非常重要的.

我将列出下面的当前代码,它与大多数图像完美配合.但是,一些更复杂的图像最终会出现以错误顺序连接的路径.我想我知道为什么会这样,但我无法想出解决方案.

public static Point[] GetOutlinePoints(Bitmap image)
{
    List<Point> outlinePoints = new List<Point>();

    BitmapData bitmapData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

    byte[] originalBytes = new byte[image.Width * image.Height * 4];
    Marshal.Copy(bitmapData.Scan0, originalBytes, 0, originalBytes.Length);

    for (int x = 0; x < bitmapData.Width; x++)
    {
        for (int y = 0; y < bitmapData.Height; y++)
        {
            byte alpha = originalBytes[y * bitmapData.Stride + 4 * x + 3];

            if (alpha != 0)
            {
                Point p = new Point(x, y); …
Run Code Online (Sandbox Code Playgroud)

c# gdi+ bitmap graphicspath

6
推荐指数
1
解决办法
3731
查看次数

结合WPF + WCF +实体框架的好例子

我计划创建一个新的数据驱动的客户端/服务器应用程序,具有WPF,Silverlight和移动客户端的灵活性.我已经精通WPF了,需要学习如何实现后端.我读过的所有内容都指向我使用WCF +实体框架.

我还没有找到结合这三种技术的现实例子.我想使用WPF的数据绑定能够以避免尽可能多的过程代码的方式轻松绑定到数据库对象.

我看了这个基于Prism的例子,但看起来它从未完成,它没有真正做任何事情,它基本上是一个美化的"Hello World!"

c# wpf wcf entity-framework azure

6
推荐指数
2
解决办法
3万
查看次数

调整大小,同时保持纵横比并四舍五入为偶数

我允许用户调整图像大小,同时尝试保持图像的原始纵横比。

对于每个调整大小操作,我都有一个“偏移”变量,它指示宽度和高度的变化。这是基于鼠标移动的,因此它可以是任意值的组合,具体取决于调整大小时移动鼠标的程度。

我现在正在做的是取两个值(x 和 y 变化)中较大的一个,并使用它来计算相同纵横比的另一个值。这是我的代码:

if (Math.Abs(offset.X) > Math.Abs(offset.Y))
{
    offset.Y = (int)(offset.X / AspectRatio);
}
else
{
    offset.X = (int)(offset.Y * AspectRatio);
}
Run Code Online (Sandbox Code Playgroud)

长宽比是标准宽度/高度值。

我的代码的问题在于它使用整数值,因此它会四舍五入并导致纵横比扭曲。

我假设我需要做的是捕捉到可被纵横比整除的整数值,或者为此目的。但我不知道如何通过修改这些 x 和 y“偏移”值来做到这一点。

c# resize image aspect-ratio

5
推荐指数
1
解决办法
2876
查看次数

使用DrawString将单个角色居中

我已经尝试了所有建议的方法来居中文本,但我似乎无法得到我想要的结果,同时居中一个人的角色.

我有一个矩形.在那个矩形中,我用DrawEllipse绘制一个圆圈.现在我想使用相同的矩形和DrawString在圆圈内绘制一个单个字符,使其完美居中.

这是我的基本代码:

StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;

using (Graphics g = Graphics.FromImage(xImage))
{
    g.SmoothingMode = SmoothingMode.AntiAlias;
    g.TextRenderingHint = TextRenderingHint.AntiAlias;
    g.CompositingQuality = CompositingQuality.HighQuality;
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    g.PixelOffsetMode = PixelOffsetMode.HighQuality;

    g.FillEllipse(fillBrush, imageRect.X, imageRect.Y, imageRect.Width - 1, imageRect.Height - 1);

    g.DrawString(Text, font, Brushes.White, imageRect, stringFormat);
}
Run Code Online (Sandbox Code Playgroud)

文本水平居中......但它没有正确地居中.使用像大写"I"这样的对称字符,我发现字符的顶部总是比字符的底部更接近矩形的边缘.距离可能至少增加50%.

我假设它正在为字符测量足够的空间,比如小写的"j",它会挂得更低.但是,由于我试图用单个字母创建一个图形图标,我想要更精确的居中.

c# gdi+ drawstring winforms centering

5
推荐指数
1
解决办法
2129
查看次数

更快的位图对比度算法

我有一个带有轨迹栏滑块控件的工具,用于调整图像的亮度,对比度,伽玛等.

当用户拖动滑块时,我试图获取我的图像的实时更新.亮度和伽马算法是可接受的速度(大约170ms).但对比度算法约为380ms.

基本上我的表单是一个带滑块的工具窗口.每次更新图像时,它都会向父项发送一个重绘新图像的事件.工具窗口将原始未修改的图像锁定在内存中,因此我始终可以访问它的字节.因此,每次更改滑块的ValueChanged事件(例如"对比度"滑块)时,我都会这样做.

  • 工作(目标)位图的LockBits为Format24bppRgb(原始位图在Format32bppPArgb中)
  • Marshal.将位复制到byte []数组
  • 检查我正在做的操作(选择了哪个滑块)
  • 对比度使用以下代码:

码:

double newValue = 0;
double c = (100.0 + contrast) / 100.0;

c *= c;

for (int i = 0; i < sourcePixels.Length; i++)
{
    newValue = sourcePixels[i];

    newValue /= 255.0;
    newValue -= 0.5;
    newValue *= c;
    newValue += 0.5;
    newValue *= 255;

    if (newValue < 0)
        newValue = 0;
    if (newValue > 255)
        newValue = 255;

    destPixels[i] = (byte)newValue;
}
Run Code Online (Sandbox Code Playgroud)

我读了一次关于使用整数而不是浮点值来提高对比度的速度,但我再也找不到那篇文章了.

我尝试使用不安全的代码(指针),但实际上注意到速度降低.我假设这是因为代码使用嵌套for循环来迭代x和y而不是单个循环.

c# performance bitmap contrast

5
推荐指数
2
解决办法
1万
查看次数

从3个点检索正角度或负角度

我在2D空间的中心点周围旋转点.这些点是中心点,旧鼠标位置和新鼠标位置.我的旋转功能工作正常,我可以完美地计算角度.但是如果用户将鼠标移动到应该被解释为逆时针的方向,我想计算负角度.

例如,如果您高于(小于)中心点的y值,则向右移动鼠标(正x轴)应该顺时针旋转,但如果实际低于(大于),它应逆时针旋转中心点的y值.

这就是我所拥有的:

PointF centerPoint;
PointF oldPoint;
PointF newPoint;

double Xc = centerPoint.X;
double Yc = centerPoint.Y;
double Xb = oldPoint.X;
double Yb = oldPoint.Y;
double Xa = newPoint.X;
double Ya = newPoint.Y;

double c2 = (Math.Pow(Xb - Xa, 2) + Math.Pow(Yb - Ya, 2));
double a2 = (Math.Pow(Xb - Xc, 2) + Math.Pow(Yb - Yc, 2));
double b2 = (Math.Pow(Xa - Xc, 2) + Math.Pow(Ya - Yc, 2));

double a = Math.Sqrt(a2);
double b = Math.Sqrt(b2);

double val = …
Run Code Online (Sandbox Code Playgroud)

c# math point angle rotation

5
推荐指数
1
解决办法
4565
查看次数