Laden...

Problem mit Platz im Form reservieren

Erstellt von Mazo vor 16 Jahren Letzter Beitrag vor 15 Jahren 4.437 Views
M
Mazo Themenstarter:in
255 Beiträge seit 2006
vor 16 Jahren
Problem mit Platz im Form reservieren

Hallo,
nachdem ich hier ein bisschen gesucht habe, hab ich code gefunden womit man platz für eine Anwendung reservieren kann... allerdings wird bei mir meine anwendung immer genau über den reservierten Platz und nich darin gezeichnet. Was mach ich falsch?


[StructLayout(LayoutKind.Sequential)]
public struct APPBARDATA
{
public uint cbSize;
public IntPtr hWnd;
public uint uCallbackMessage;
public uint uEdge;
public RECT rc;
public int lParam;
}

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}

const int ABM_NEW = 0x00000000;
const int ABM_REMOVE = 0x00000001;
const int ABM_SETPOS = 0x00000003;
const int ABM_QUERYPOS = 0x00000002;

const int ABE_BOTTOM = 3;

public TaskleisteMain()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
this.Cursor = Cursors.WaitCursor;

this.Location = new Point(0, (Screen.PrimaryScreen.WorkingArea.Height - this.Height));
this.Width = Screen.PrimaryScreen.WorkingArea.Width;

APPBARDATA abd = new APPBARDATA();
abd.cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA));
abd.hWnd = this.Handle;
abd.uCallbackMessage = RegisterWindowMessage(Guid.NewGuid().ToString()); ;

SHAppBarMessage(ABM_NEW, ref abd);

abd.rc = new RECT();
abd.uEdge = ABE_BOTTOM;
abd.rc.top = SystemInformation.PrimaryMonitorSize.Height - 60;
abd.rc.left = 0;
abd.rc.bottom = SystemInformation.PrimaryMonitorSize.Height;
abd.rc.right = SystemInformation.PrimaryMonitorSize.Width;
SHAppBarMessage(ABM_QUERYPOS, ref abd);
SHAppBarMessage(ABM_SETPOS, ref abd);
}

915 Beiträge seit 2006
vor 16 Jahren

Hrm, sehe da kein this.Size = new Size(abd.rc.right - abd.rc.left,abd.rc.bottom - abd.rc.top).

Kann auch an etwas anderen liegen, aber hier ein Link der dir weiterhelfen sollte 🙂

[Edit]
Grml.. 2 mal den falschen Link gepostet..

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

M
Mazo Themenstarter:in
255 Beiträge seit 2006
vor 16 Jahren

Hallo Andreas.May,
das mit dem this.Size = new Size(abd.rc.right - abd.rc.left,abd.rc.bottom - abd.rc.top) hab ich auch probiert das hilft nichts...
und der Link lädt grad bei mir nicht fertig, versuch ich dann nochmal.

einige Minuten später:
so ich hab es jetzt mit den Klassen von Codeprojekt versucht - gleiches Ergebniss es wird Platz reserviert, allerdings rutscht die Leiste raus 🙁 . Kann das ein Problem von Vista sein? oder liegt es evtl. am FormBorderStyle =None , was kann man dagegen tun?

M
Mazo Themenstarter:in
255 Beiträge seit 2006
vor 16 Jahren

ok es lag wirklich am FormBorderStyle... Ich hab jetzt vor dem Verankern den FormBorderStyle auf FixedToolWindow gesetzt und dann wieder auf None und es geht 🙂

915 Beiträge seit 2006
vor 16 Jahren

Hrm, muss dann etwas mit Vista zu tun haben.

Das Beispiel bei CodeProjectklappt geht bei mir reibungslos. Wäre also interessant was bei deinem Code unter WinXP nun passiert. Kannst das ja mal auf einen anderen Rechner mal testen. 🙂

/PS
Bei meinen kleinen codebeispiel ging es unter Vista wie XP, habe allerdings die Windows Border Styles über SetWindowPos anderst gesetzt.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

M
Mazo Themenstarter:in
255 Beiträge seit 2006
vor 16 Jahren

Hallo,
ich muss nochmal nachfragen...
Mein Problem, ich will das Fenster zwischen 2 Bildschirmen wechseln, der reservierte Bereich wechselt auch korrekt, allerdings wechselt das Fenster nicht egal wo ich die Location setzte mache es funktioniert einfach nicht 🙁 kann mir wer helfen?
Hier der Code:


[DllImport("shell32.dll);]
static extern IntPtr SHAppBarMessage(uint dwMessage,
ref APPBARDATA pData);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint RegisterWindowMessage(string lpString);

[DllImport("user32.dll";);]
static extern int GetForegroundWindow();

[DllImport("user32.dll";);]
static extern int GetWindowText(int hWnd, StringBuilder text, int count);

[StructLayout(LayoutKind.Sequential)]
public struct APPBARDATA
{
public uint cbSize;
public IntPtr hWnd;
public uint uCallbackMessage;
public uint uEdge;
public RECT rc;
public int lParam;
}

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
const int ABM_NEW = 0x00000000;
const int ABM_REMOVE = 0x00000001;
const int ABM_SETPOS = 0x00000003;
const int ABM_QUERYPOS = 0x00000002;

private void toolStripMenuItemPosition_Click(object sender, EventArgs e)
{
ReservierungAufheben();
if (Datenverwaltung.Use().SekundärenBildschirm)
{
Datenverwaltung.Use().SekundärenBildschirm = false;
}
else
{
Datenverwaltung.Use().SekundärenBildschirm = true;
}

if (Datenverwaltung.Use().SekundärenBildschirm)
{
Location = new Point(Screen.AllScreens[1].WorkingArea.X, Screen.AllScreens[1].WorkingArea.Height - 59);
this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
Reservieren(3, Screen.AllScreens[1].WorkingArea.Height - 59, Screen.AllScreens[1].WorkingArea.X, 0, Screen.AllScreens[1].WorkingArea.Y + Screen.AllScreens[1].WorkingArea.Width);
this.FormBorderStyle = FormBorderStyle.None;
Size = new Size(Screen.AllScreens[1].WorkingArea.Width, 59);
//Location = new Point(Screen.AllScreens[1].WorkingArea.X, Screen.AllScreens[1].WorkingArea.Height - 59);

}
else
{
Location = new Point(Screen.AllScreens[0].WorkingArea.X, Screen.AllScreens[0].WorkingArea.Height - 59);
this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
Reservieren(3, Screen.AllScreens[0].WorkingArea.Height - 59, Screen.AllScreens[0].WorkingArea.X, 0, Screen.AllScreens[0].WorkingArea.Y + Screen.AllScreens[0].WorkingArea.Width);
this.FormBorderStyle = FormBorderStyle.None;
Size = new Size(Screen.PrimaryScreen.WorkingArea.Width, 59);
//Location = new Point(Screen.AllScreens[0].WorkingArea.X, Screen.AllScreens[0].WorkingArea.Height - 59);
}
ButtonsGrößeBestimmen();
}

public void Reservieren(uint Bildschirmseite, int top, int left, int bottom, int right)
{
APPBARDATA abd = new APPBARDATA();
abd.cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA));
abd.hWnd = this.Handle;
abd.uCallbackMessage = RegisterWindowMessage(Guid.NewGuid().ToString()); ;

SHAppBarMessage(ABM_NEW, ref abd);

abd.rc = new RECT();
abd.uEdge = Bildschirmseite;
abd.rc.top = top;
abd.rc.left = left;
abd.rc.bottom = bottom;
abd.rc.right = right;
SHAppBarMessage(ABM_QUERYPOS, ref abd);
SHAppBarMessage(ABM_SETPOS, ref abd);
//Location = new Point(abd.rc.left, abd.rc.top);
}

public void ReservierungAufheben()
{
APPBARDATA abd = new APPBARDATA();
abd.cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA));
abd.hWnd = this.Handle;

SHAppBarMessage(ABM_REMOVE, ref abd);
}


L
553 Beiträge seit 2007
vor 15 Jahren

Hallo ich arbeite mit dem selben Beispiel, alles klappt wunderbar, aber wenn ich jetzt den FormBorderStyle auf None setze, geht garnichts mehr, das fenster dockt nicht mehr an, warum?
Auch wenn ich das jetzt nachträglich mache über einen Button, sobald ich den FormBorderStyle auf None setze ist das mit docken vorbei.. aber warum????