屏幕不重新绘制,直到结束的鼠标up事件处理程序



好的,我有一个问题,我甚至不确定到底发生了什么。基本上:我有一个鼠标点击按钮事件。该事件将删除一个按钮,并物理移动屏幕上的所有按钮以填补空白。如果你有两行两个按钮

Button1 Button2
Button3 Button4

然后点击Button1,它会移动最后3个所以现在有

Button2 Button3
Button4

好的,那么,在这个事件处理程序结束时,它截取一个屏幕截图并保存它(用按钮2-4的新图像替换按钮1-4的旧图像)。

事件处理程序如下所示

    public void Handle_Button_MouseUp(object sender, MouseEventArgs e)
    {
         //Get rid of the button that was clicked
         ...some unnecessary to the question code here...
        //Rearrange the remaining buttons to fill the gap
        Rearrange_Buttons_In_Tray(element);
        //Save the screenshot
        imageBox.Image = SavePanel1Screenshot();
    }

截图代码为

    public Image SavePanel1Screenshot()
    {
        int BorderWidth = (this.Width - this.ClientSize.Width) / 2;
        int TitlebarHeight = this.Height - this.ClientSize.Height - BorderWidth;
        Rectangle rect = new Rectangle(0, 0, panel1.Width, panel1.Height);
        Bitmap bmp = new Bitmap(panel1.Width, panel1.Height, PixelFormat.Format32bppArgb);
        Graphics g = Graphics.FromImage(bmp);
        g.CopyFromScreen(this.Left + panel1.Left + BorderWidth, this.Top + panel1.Top + TitlebarHeight, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
        Image screenShot;
        screenShot = (Image)bmp;
        return screenShot;
    }

.

    public void Rearrange_Buttons_In_Tray(int element)
    {
        for (int i = element; i < buttonList.Count; i++)
        {
            Place_Button_In_Tray(buttonList[i].buttonSaved, i, true);
            buttonList[i].element = i;
        }
    }

清理了一些不必要的问题部分,避免混乱。抱歉,缩进搞砸了。注意:按钮不在面板中,只是在它的顶部。我只是为了测量和美观而使用面板

private void Place_Button_In_Tray(Button button, int element, bool isReArrange)
    {
            button.Width = bigButtonWidth;
            button.Height = bigButtonHeight;
            Image buttonImage = button.Image;
        int numButtonsHoriz = panel1.Width / button.Width;
        int numButtonsVerti = panel1.Height / button.Height;
        int extraSpaceHoriz = (panel1.Width % button.Width) / (numButtonsHoriz);
        int extraSpaceVerti = (panel1.Height % button.Height) / numButtonsHoriz;
        int buttonCount;
        if (!isReArrange)
            buttonCount = buttonList.Count - 1;
        else
            buttonCount = element;
        if ((buttonCount) < numButtonsHoriz)
        {
            button.Location = new Point(panel1MinX + (button.Width * (buttonCount)) + extraSpaceHoriz, (panel1MinY + extraSpaceVerti));
        }
        else
        {
            int newLine = (buttonCount) % numButtonsHoriz;
            button.Location = new Point(panel1MinX + (button.Width * (newLine)) + extraSpaceHoriz, ((panel1MinY + extraSpaceVerti) + (button.Height * ((buttonCount) / 2) - ((buttonCount) % 2))));
        }

现在我的问题:图像是一个空白的屏幕。这并不是说它没有拍照——它是在按钮2-4在屏幕上可见之前拍照的(我可以在程序的步骤中明显地看到这一点)。在截图的时候,屏幕是完全空白的。只有在它采取按钮重新出现在屏幕上)!由于某种原因,它们直到事件处理程序完成后才呈现。一旦事件处理程序中的最后一段代码完成(屏幕截图保存),按钮就会重新出现在各自的位置上,尽管在整个过程中按钮的可见性根本没有被修改(因此它们在整个过程中都是可见的)。

我有点困惑,到底发生了什么,更重要的是,如何去获得截图后的事件处理程序发生。>_>有没有人对可能发生的事情有任何建议,更重要的是,如何获得截图?

编辑:我的描述有点难以理解。我真的很抱歉。我很难准确地说出我在努力做什么,发生了什么。下面是一个更简洁、更切题的版本:

基本上,我只试图隐藏4个按钮中的1个。屏幕上的其他3个移动到新的位置。由于某种原因,当它们被移动时,它们就会从屏幕上消失。直到鼠标up函数完成后,它们才重新出现,尽管我从未修改过它们是否可见。我只改变他们的位置。我希望屏幕截图包含这3个按钮,但由于某种原因,他们没有弹出到存在,直到整个鼠标上升功能结束后。>_>所以我的截图是一个空屏幕,没有按钮

你所描述的有点令人困惑。我点击一个按钮来隐藏它,运行你的屏幕截图代码,图像没有显示按钮。

无论如何,要将屏幕截图"延迟"到事件调用之后,您可以尝试使用BeginInvoke:

this.BeginInvoke(new Action(() => { imageBox.Image = SavePanel1Screenshot(); }));

我认为你需要调用刷新后移动你的控件:

if ((buttonCount) < numButtonsHoriz) {
  button.Location = new Point(panel1MinX + (button.Width * (buttonCount)) + extraSpaceHoriz, (panel1MinY + extraSpaceVerti));
} else {
  int newLine = (buttonCount) % numButtonsHoriz;
  button.Location = new Point(panel1MinX + (button.Width * (newLine)) + extraSpaceHoriz, ((panel1MinY + extraSpaceVerti) + (button.Height * ((buttonCount) / 2) - ((buttonCount) % 2))));
}
panel1.Refresh();

你正在UI线程中做你的工作。参见c#中如何在消息框关闭后强制按钮、文本框在窗体上重新绘制。如果可以的话,我建议你把截图移到后台线程。

您可能还需要等待,直到按钮渲染完成,或者使用100毫秒左右的睡眠,或者通过调查Paint事件并使用某种标志来指示所需的事件已经发生,并且可以截取屏幕截图。

或者,您可以强制它重新绘制:我如何调用paint event?

只要你只需要你自己的表单像素…

private void button1_Click(object sender, EventArgs e)
{
    //Button magic
    button1.Visible = false;
    button2.Location = button1.Location;
    Bitmap bmp = new Bitmap(this.Width, this.Height);
    this.DrawToBitmap(bmp, new Rectangle(0, 0, this.Width, this.Height));
    pictureBox1.Image = bmp;
    //or do whatever you want with the bitmap
}

相关内容

  • 没有找到相关文章

最新更新