Witam,
mam następujący problem. Stworzyłem na potrzeby aplikacji taki mini-framework gui. Okna mają swoje własne wyglądy, przyciski zamknij, minimalizuj itp. W związku z tym wszystkie okna mają ustawione
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
Jest jedno główne okno, na którym jest panel CenterPanel z ustawionym tłem:
this.CenterPanel.BackgroundImage = Styl.Obraz("CenterPanel");
Pozostałe okna aplikacji mają zaimplementowaną własną obsługę przesuwania i zmiany rozmiaru (ponieważ nie mają standardowej ramki). Na przykład obsługa przesuwania okna odbywa się na zasadzie, że obsługujemy zdarzenie przesuwania myszki na górnym panelem takiego okna (pełniącym rolę własnej "belki" z przyciskami i tytułem okna) z jednoczesnym naciśnięciem przycisku lewego myszy nad nim, czyli mniej więcej tak:
/// <summary>
/// Zdarzenie naciśnięcia przycisku myszy na górnym panelu okna (pasku)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void TopPanel_MouseDown(object sender, MouseEventArgs e)
{
this.Focus();
if (e.Button == MouseButtons.Left)
{
this.Przesun = true;
this.PrzesunPunkt = new Point(e.X, e.Y);
}
}
/// <summary>
/// Zdarzenie puszczenia wciśniętego przycisku myszy na górnym panelu okna (pasku)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void TopPanel_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
this.Przesun = false;
}
}
/// <summary>
/// Zdarzenie zmiany położenia kursora myszy na górnym panelu okna (pasku)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void TopPanel_MouseMove(object sender, MouseEventArgs e)
{
this.Focus();
try
{
if (this.Przesun && this.WindowState == FormWindowState.Normal && e.Button == MouseButtons.Left)
{
MainWindow oknoGlowne = this.Owner as MainWindow; // Referencja do okna głównego
Point aktualne = PointToScreen(e.Location); // Aktualna pozycja kursora myszy
// Określamy wstępne, nowe położenie okna
Int32 X, Y;
X = aktualne.X - this.PrzesunPunkt.X;
Y = aktualne.Y - this.PrzesunPunkt.Y;
// W poniższych warunkach sprawdzamy, czy wystąpiło zetknięcie przesuwanego okna
// z krawędzią panelu głównego (centralnego) okna głównego,
// uwzględniając mechanizm przyciągania do krawędzi
// Krawędź lewa
if (X <= oknoGlowne.ObszarRoboczy.Left + WindowController.SnapToEdgeDistance)
X = oknoGlowne.ObszarRoboczy.Left;
// Krawędź górna
if (Y <= oknoGlowne.ObszarRoboczy.Top + WindowController.SnapToEdgeDistance)
Y = oknoGlowne.ObszarRoboczy.Top;
// Krawędź prawa
if (X + this.Width >= oknoGlowne.ObszarRoboczy.Right - WindowController.SnapToEdgeDistance)
X = oknoGlowne.ObszarRoboczy.Right - this.Width;
// Krawędź dolna
if (Y + this.Height >= oknoGlowne.ObszarRoboczy.Bottom - WindowController.SnapToEdgeDistance)
Y = oknoGlowne.ObszarRoboczy.Bottom - this.Height;
// Zmieniamy położenie okna
this.Location = new Point(X, Y);
}
}
catch { }
}
No i teraz problem. Gdy przesuwamy takie okno nad oknem głównym (zawierającym ten panel z tłem jpg), panel ten (okna głównego) się nie odświeża za dobrze, to znaczy w miejscach, w których znajdowało się okno przesuwane, pozostają prostokąty jednolite (w kolorze okna głównego) i wygląda to bardzo nieładnie. Natomiast, gdy przesuwane okno uczynimy standarowym z ramką (np. FormBorderStyle.FixedSingle) i zaczniemy je przesuwać na głównym oknem "ciągnąc" za standardową belkę, główne okna odświeża się prawidłowo.
Czy ktoś ma pojęcie, co może być przyczyną. Przypuszczam, że domyślny mechanizm przesuwanie okien może wysyłać jakiś komunikat do okna głównego (może do wszystkich innych okien w systemie), ale w sumie analizowałem wysyłane komunikaty w obu przypadkach przeładowując metodę WndProc okna głównego i wszystko jest raczej tak samo.
Będę wdzięczny za pomoc, bo walczę z tym od tygodnia... Z góry dzięki za odpowiedzi.