WND: Minimize, Maximize, Sysmenu, etc. sperren (nach Erstellung)
-
Ich habe ein fix und fertiges Fenster (hat allerdings Sysmenu,etc.). Da ich leider auf CreateWindow() keinen Zugriff habe kann ich es nicht schon bei der Erstellung angeben. Das Systemmenü zu löschen muss eigentlich gar nicht sein, wichtig ist mir nur folgender Punkt:
Jegliche Veränderung der Größe durch den User (auch Minimieren, Maximieren) soll nicht möglich sein.
Wie kann ich das im Nachhinein einstellen?
MfG SideWinder
-
GetWindowLong(Ptr) / SetWindowLong(Ptr) mit GWL_STYLE
-
flenders schrieb:
GetWindowLong(Ptr) / SetWindowLong(Ptr) mit GWL_STYLE
Kein Wunder, dass ich es bei dem Namen nicht gefunden habe - aber danke, danke,danke :).
MfG SideWinder
-
:p
-
Bringt mir leider nicht ganz den erwünschten Effekt :(. Es ist weiterhin eine Titelleiste mit den Symbolen und dem Systemmenü zu sehen.
Liegt das daran, dass es eine Konsole ist?
Bloß mit dem Pfeil kann man es nicht mehr in die Breite/Länge ziehen.
MfG SideWinder
-
MSDN schrieb:
If you have changed certain window data using SetWindowLong, you must call SetWindowPos to have the changes take effect. Use the following combination for uFlags: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED.
-
-King- schrieb:
MSDN schrieb:
If you have changed certain window data using SetWindowLong, you must call SetWindowPos to have the changes take effect. Use the following combination for uFlags: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED.
Bringt leider auch nichts. Ich glaube es liegt daran, dass das Konsolenfenster selbst in ihrer WndProc das wieder zurücksetzt. Also will ich meine WndProc einsetzen:
SetWindowLong(itsHWnd,GWL_WNDPROC,ConWndProc);
Das gibt mir aber nur den schönen Fehler:
Konvertierung des Parameters 3 von 'long (struct HWND__ *,unsigned int,unsigned int,long)' in 'long' nicht moeglich
Hab mich bisher mit Funktionspointern noch nicht auseinandergestzt - was mach ich falsch?
MfG SideWinder
-
SetWindowLong(itsHWnd,GWL_WNDPROC,(LONG)ConWndProc);
-
flenders schrieb:
SetWindowLong(itsHWnd,GWL_WNDPROC,(LONG)ConWndProc);
Will auch nicht.
Liegt das vielleicht daran, dass ConWndProc eine private Methode dieser Klasse ist?
MfG SideWinder
-
Achso. SetWindowLong funktioniert nicht mit dem Konsolenfenster.
-
TIPP schrieb:
Achso. SetWindowLong funktioniert nicht mit dem Konsolenfenster.
Wo steht das? In der MSDN kann ich keinen Hinweis dazu finden.
MfG SideWinder
-
Steht nirgendwo. Aber ich habe es selber ausprobiert und GetLastError() lieferte immer "ungültiger Index" zurück.
-
Aber was für Style hast du eigentlich bei der ersten Variante genommen? Ich denke, da liegt eher der Fehler
Zu WndProc in einer Klasse findest du was in den FAQ -> static
-
warum darf der User das Konsolen-Fenster eigentlich nicht in der Größe ändern?
-
flenders schrieb:
Aber was für Style hast du eigentlich bei der ersten Variante genommen? Ich denke, da liegt eher der Fehler
Zu WndProc in einer Klasse findest du was in den FAQ -> staticDer Block sieht nun so aus:
SetWindowLong(itsHWnd,GWL_STYLE,WS_BORDER|WS_VISIBLE); SetWindowLong(itsHWnd,GWL_WNDPROC,(LONG)ConWndProc); SetWindowPos(itsHWnd,NULL,itsPosOnScreen.get_x(),itsPosOnScreen.get_y(),itsSize.get_x(),itsSize.get_y(),SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED);
itsPosOnScreen und itsSize sind richtig gefüllt. Und sind beide vom Typ "coordinate" - selber gebaut.
MfG SideWinder
-
Ich hab nochmal ein kleines Testprogramm geschrieben:
#define _WIN32_WINNT 0x0500 #include <windows.h> LRESULT CALLBACK ConsoleProc(HWND Window, UINT Message, WPARAM wParam, LPARAM lParam) { return DefWindowProc(Window, Message, wParam, lParam); } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, INT) { AllocConsole(); HWND ConsoleWindow = GetConsoleWindow(); if(ConsoleWindow == NULL) { MessageBox(NULL, TEXT("ConsoleWindow == NULL"), NULL, MB_OK); } if(SetWindowLongPtr(ConsoleWindow, GWLP_WNDPROC, (LONG_PTR) ConsoleProc) == 0) { TCHAR ErrorMessage[256]; wsprintf(ErrorMessage, TEXT("SetWindowLongPtr failed! GetLastError(): %d"), GetLastError()); MessageBox(NULL, ErrorMessage, NULL, MB_OK); } }
GetLastError(): 1413 -> Ungültiger Index.
-
ich denke du solltest eher die Style mit GetWindowLong(Ptr) auslesen, die entsprechenden Flags löschen und dann wieder setzen.
btw: Bei SetWindowPos brauchst du dich bei dieser Flagkombination nicht groß um Position und Größe kümmern - 0 tut's auch - wird ja ignoriert
-
Ich habe als letzten Fehler:
87 The parameter is incorrect. ERROR_INVALID_PARAMETER
MfG SideWinder
-
Ach, hier steht auch noch was dazu:
-
Bei welchem Aufruf?