Fensterverwaltung, Doppelklick auf Titelleiste

gehrti

Mitglied
Hallo!

Meine Anwendung startet maximiert. Ich habe den Maximierbutten deaktiviert, dass heißt also, dass man die Anwendung entweder maximiert hat oder sie minimiert in der Taskleiste ist.

Mein Problem ist, dass durch das Doppelklicken der Mouse auf die Titelleiste das Fenster verkleinert wird. Wie kann ich das verhindern?
Ich will also, dass es entweder maximiert oder minimiert ist.

MfG. Thomas
 
Leider nicht!

Die Titelleiste ist nicht über Koordinaten ansprechbar.

Ich such mir hier schon die Finger wund :(

MfG. Thomas
 
Du könntest in WM_SYSCOMMAND auf SC_RESTORE lauschen, und die Nachricht dann einfach nicht weitergeben.
Achtung, bei WM_SYSCOMMAND sind in wParam noch ein paar Bits drin, die man beim Prüfen wegmaskieren muss.
 
Kleiner Ausschnitt aus dem MSDN:
afx_msg void OnNcLButtonDblClk( UINT nHitTest, CPoint point );
Parameters
nHitTest
Specifies the hit-test code. A hit test is a test that determines the location of the cursor.
point
Specifies a CPoint object that contains the x and y screen coordinates of the cursor position. These coordinates are always relative to the upper-left corner of the screen.
nHitTest kann folgende Werte annehmen:




  • HTBORDER In the border of a window that does not have a sizing border.
  • HTBOTTOM In the lower horizontal border of the window.
  • HTBOTTOMLEFT In the lower-left corner of the window border.
  • HTBOTTOMRIGHT In the lower-right corner of the window border.
  • HTCAPTION In a title-bar area.
  • HTCLIENT In a client area.
  • HTERROR On the screen background or on a dividing line between windows (same as HTNOWHERE except that the DefWndProc Windows function produces a system beep to indicate an error).
  • HTGROWBOX In a size box.
  • HTHSCROLL In the horizontal scroll bar.
  • HTLEFT In the left border of the window.
  • HTMAXBUTTON In a Maximize button.
  • HTMENU In a menu area.
  • HTMINBUTTON In a Minimize button.
  • HTNOWHERE On the screen background or on a dividing line between windows.
  • HTREDUCE In a Minimize button.
  • HTRIGHT In the right border of the window.
  • HTSIZE In a size box (same as HTGROWBOX).
  • HTSYSMENU In a Control menu or in a Close button in a child window.
  • HTTOP In the upper horizontal border of the window.
  • HTTOPLEFT In the upper-left corner of the window border.
  • HTTOPRIGHT In the upper-right corner of the window border.
  • HTTRANSPARENT In a window currently covered by another window.
  • HTVSCROLL In the vertical scroll bar.
  • HTZOOM In a Maximize button.
Die NC-Funktionen sind extra für den Zugrif auf die Nonclient-Bereiche da. nHitTest sagt Dir, wo geklickt wurde (Dich wird HTCAPTION interessieren), point sind die Mauskoordinaten bezogen auf den Bildschirm.
Ich hab's ausprobiert und bei mir hat's geklappt. Wenn Du den Aufruf der Basisklassenfunktion wegläßt, dann reagiert das Programm nicht mehr auf den Doppelklick auf die Titelleiste (oder sonstwohin im NC-Bereich).
 
Hi!

Sorry, das habe ich das letzte mal irgendwie falsch gelesen.
Leider ist es mir trotzdem nicht gelungen es hinzubekommen.
Hab die Funktion eingebunden. Aber durch kleinwenig rumexperimentieren ist mir aufgefallen, dass diese Funktion überhaupt nicht aufgerufen wird.

Hast du noch nen Rat für mich?

MfG. Thomas

PS.: mit OnSysCommand und SC_RESTORE habe ich es auch nicht hinbekommen.
 
Es reicht nicht, wenn Du die Funktion anlegst. Das ist eine Funktion, die vom Framework aufgerufen wird, wenn sie in der MessageMap eingetragen ist. Dazu machst Du einen Rechtsklick auf Dein CMainFrame im Klassenbrowser und wählst 'Behandlungsroutine für Windows-Nachrichten hinzufügen'. In folgenden Dialog suchst Du in der linken Liste nach WM_NCLBUTTONDBLCLK, markierst es und klickst auf 'Behandlungsroutine hinz.' (doppelklicken auf WM_NCLBUTTONDBLCLK macht das gleiche). Dann ist die Nachricht in der rechten, oberen Liste aufgeführt, die Funktion wurde vom Wizard angelegt und in die MessageMap eingetragen. Wenn Du jetzt auf 'vorhandene bearbeiten' klickst, schließt sich das Fenster und die entsprechende Quellcodedatei wird so geöffnet, daß Du den neu angelegten Funktionsrumpf siehst. Den änderst Du dann dahingehend, daß die Funktion der Basisklasse nur dann aufgerufen wird, wenn nHitTest != HTCAPTION ist.
Ich gehe hier von VS6 in Deutsch aus, da ich mom. nur das auf dem Rechner habe. Wie das in VS.NET läuft, weiß ich nicht auswendig, wie die englischen Bezeichnungen lauten auch nicht..
Du kannst natürlich auch per Hand
Code:
ON_WM_NCLBUTTONDBLCLK()
in die MessageMap Deines CMainFrames eintragen. Dann mußt Du noch im Headerfile
Code:
afx_msg void OnNcLButtonDblClk(UINT nHitTest, CPoint point);
zwischen den Zeilen '//{{AFX_MSG(CMainFrame)' und '/}}AFX_MSG' einfügen. Den Funktionsrumpf mußt Du natürlich dann auch selber anlegen.
 
Bei mir gibt es kein WM_NCLBUTTONDBLCLK, sondern nur WM_LBUTTONDBLCLK und das geht natürlich nicht.
Ich erstelle eine dialogbasierte MFC-Anwendung, kein SDI oder MDI.

Mit manuell eintragen geht nicht, weil er dann meckert, dass er die Funktion nicht kennt, obwohl sie korrekt implementiert ist.
Muss ich vll. irgendetwas einbinden?

MfG. Thomas
 
Hättest Du ja auch gleich sagen können, daß Du eine Dialogbasierte Anwendung hast.
Da gibt's diese Message tatsächlich nicht. Ich hab's hier allerdings ausprobiert und bei mir reagiert der Dialog nicht mehr auf den Doppelklick auf die Titelzeile, wenn ich den Maximieren-Button deaktiviert habe. Ich hab dann mal einen Breakpoint in OnSysCommand gesetzt. Der schlug zu, wenn ich auf die Titelleiste doppelgeklickt habe. In On SysCommand mußt Du dann auf
Code:
(nID & 0xFFF0) == SC_MINIMIZE
bzw.
Code:
(nID & 0xFFF0) == SC_MAXIMIZE
testen. So kannst Du die Nachrichten dann ausfiltern.
 
Sorry, dass ich das nicht gleich erwähnt habe!

Mit SC_MINIMIZE und SC_MAXIMIZE geht es nicht sondern nur mit SC_RESTORE.
Und SC_RESTORE brauche ich aber, damit ich das Fenster nachdem minimieren mit klicken auf den Task in der Taskleiste wieder groß bekomme, ohne erst mit rechter Maustaste und dann maximieren das Fenster wieder groß zu bekommen.

Habs jetzt hinbekommen:

Code:
if ((nID & 0xFFF0) == SC_RESTORE) {
		if (!ShowWindow(SW_SHOWMAXIMIZED)) CDialog::OnSysCommand(nID, lParam);
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}

Sorry nochmal, bin jetzt erst drauf gekommen.

Vielen Dank nochmal.
Mfg. Thomas
 
Zurück