1

わかりました、何が起こっているのか正確にわからないという問題があります。基本的に:ボタンをクリックするためのマウスアップイベントがあります。そのイベントは 1 つのボタンを削除し、画面上のすべてのボタンを物理的に移動してギャップを埋めます。したがって、2つのボタンの2行がある場合

Button1 Button2
Button3 Button4

Button1 をクリックすると、最後の 3 つが移動するので、次のようになります。

Button2 Button3
Button4

このイベント ハンドラーの最後で、スクリーンショットを取得して保存します (ボタン 1 ~ 4 の前の画像をボタン 2 ~ 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 つのボタンは新しい場所に移動されます。なぜか移動すると画面から消えてしまう。それらが表示されるかどうかを変更したことがないにもかかわらず、マウスアップ機能が完了するまで再表示されません。私は彼らの場所を変えるだけです。スクリーンショットにこれらの 3 つのボタンを含めたいのですが、何らかの理由で、マウスアップ機能全体が終了するまでそれらが元に戻りません。>_> つまり、私のスクリーンショットは空の画面で、ボタンがありません

4

3 に答える 3

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();
于 2013-04-09T14:58:59.890 に答える
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
}
于 2013-04-09T16:29:56.907 に答える