好的,我有一个问题,我甚至不确定究竟发生了什么。基本上:我有一个用于点击按钮的mouseup事件。该事件将删除1个按钮并物理移动屏幕上的所有按钮以填补空白。所以如果你有2行2个按钮
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之前拍照(我可以看到这种情况发生在我逐步完成程序时。截屏的时间,屏幕完全是空白的。只有在它完成后,按钮才会重新出现在屏幕上)!出于某种原因,直到事件处理程序完成后才会呈现它们。一旦事件处理程序中的最后一段代码完成(截屏保存),按钮全部重新出现在各自的位置,尽管在整个过程中根本没有修改按钮的可见性(因此它们仍然可见整个时间。)
我对确切发生的事情感到有些困惑,更重要的是,如何在事件处理程序发生后获取屏幕截图。 &GT; _&GT;有没有人对可能发生的事情有什么建议,更重要的是,如何获得截图?
编辑:我的描述有点难以理解。我很抱歉。很难清楚地表达我想要做什么以及发生了什么。这是一个更紧凑,更简洁的版本:基本上,我只是试图隐藏4个按钮。屏幕上的其他3个按钮被移动到新的位置。出于某种原因,当它们被移动时,它们会从屏幕上消失。它们不会再出现,直到mouseup函数完成后,尽管我从未修改它们是否可见。我只改变他们的位置。我希望屏幕截图包含这3个按钮,但由于某种原因,它们不会重新出现,直到整个鼠标功能结束。 &GT; _&GT;所以我的屏幕截图是一个空屏幕,没有按钮
答案 0 :(得分:1)
你所描述的有点令人困惑。我点击了一个按钮来隐藏它,运行你的屏幕截图代码,图像没有显示按钮。
无论如何,要在调用事件后“延迟”屏幕截图,您可以尝试使用BeginInvoke:
this.BeginInvoke(new Action(() => { imageBox.Image = SavePanel1Screenshot(); }));
我认为你需要在移动控件后调用Refresh:
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();
答案 1 :(得分:1)
您正在UI线程中完成工作。见How to force Buttons, TextBoxes to repaint on form after a MessageBox closes in C#。如果可以,我建议你将截图移动到后台线程。
您可能还需要等到按钮呈现后,或者使用直接睡眠100%左右,或者通过调查Paint事件并使用某种标记来指示两个必需事件都有发生了,截图可以拍摄。
或者,您可以强制重绘:How do I call paint event?
答案 2 :(得分:1)
只要你只需要自己形式的像素......
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
}