WND: Minimize, Maximize, Sysmenu, etc. sperren (nach Erstellung)
-
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?
-
flenders schrieb:
Bei welchem Aufruf?
Zum falschen Zeitpunkt GetLastError() abgefragt - nein bekomme nun auch 1413.
Wie kann ich das nun anders lösen? Es ist übrigens keine Win-Anwendung die eine Konsole alloziert sondern eine Konsolenanwendung.
Wenn alle Stricke reißen muss ich die Std-Konsole löschen und ein eigenens Fenster mit dem Verhalten der Konsole basteln *omfg* HILFE!
MfG SideWinder
-
Es ist übrigens keine Win-Anwendung die eine Konsole alloziert sondern eine Konsolenanwendung.
ist im endeffekt genau das gleiche. die konsole wird vom compiler auch mit AllocConsole erstellt.
-
Wenn ich diese Aufrufe lösche bekomme ich übrigens immer noch einen Fehler:
183 Cannot create a file when that file already exists. ERROR_ALREADY_EXISTS
Ich erstelle allerdings nirgends eine Datei - was hat das schon wieder zu bedeuten?
MfG SideWinder
-
Frag die Werte nur direkt nach dem Aufruf der API-Funktion (die SetLastError benutzen) auf, sonst nützt dir der Wert nichts.