[Warning] passing NULL used for non-pointer converting 1 of `HWND__* CreateWindowExA...
-
Ich glaub', ich mach dazu mal direkt einen neuen topic auf.
Ich habe folgenden code, wo ein edit control
ins hauptfenster gesetzt wird.
wird das fenster gestreckt/gezerrt, soll das edit control von der breite und
Größe her mitwachsenHier mein source
main.cpp
#include <windows.h> LPCSTR MainClassName = "Texteditor"; // Zum Empfangen und Auswerten der messages LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // Generelle Fensterstruktur registrieren WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(0)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = MAKEINTRESOURCE(1); wc.lpszClassName = MainClassName; wc.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(0), IMAGE_ICON, 16, 16, 0); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Konnte das Hauptfenster nicht registrieren!", "Fehler!", MB_ICONEXCLAMATION | MB_OK); return 0; } // Fenster erstellen HWND hWnd = CreateWindowEx( WS_EX_CLIENTEDGE, MainClassName, "Texteditor", WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL ); // Textbox ins Fenster setzen HWND hEdit = CreateWindowEx( NULL, "EDIT", "Gib was ein", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 3, 3, 400, 300, hWnd, NULL, NULL, NULL ); // Fenster anzeigen ShowWindow(hWnd, iCmdShow); // Auf Messages reagieren MSG wmsg; while( GetMessage(&wmsg, NULL, 0, 0) ) { TranslateMessage(&wmsg); DispatchMessage(&wmsg); } return wmsg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { char string[255]; switch (iMsg) { case WM_SIZE: HWND hEdit = GetTopWindow(hWnd, GW_CHILD | GW_HWNDLAST); MoveWindow(hEdit, 3, 3, wParam, lParam, true); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case 11: LoadString(GetModuleHandle(NULL), 21, string, sizeof(string)); MessageBox(hWnd, string, "Öffnen", MB_ICONINFORMATION); break; case 12: LoadString(GetModuleHandle(NULL), 22, string, sizeof(string)); MessageBox(hWnd, string, "Speichern", MB_ICONINFORMATION); break; case 13: DestroyWindow(hWnd); break; } break; } // An Windows weitergeben und dessen Antwort als Rückgabewert zurück return DefWindowProc(hWnd, iMsg, wParam, lParam); }Projekt1_private.rc
//Ressourcen-Skriptedatei *.rc #include <windows.h> ///////////////////////////////////////////////////////////////// // //Icon // 0 ICON "goofy.ico" ///////////////////////////////////////////////////////////////// // // Menü // 1 MENU BEGIN POPUP "Datei" BEGIN MENUITEM "Öffnen", 11 MENUITEM "Speichern", 12 MENUITEM "Beenden", 13 END END ///////////////////////////////////////////////////////////////// // //Stringtabelle // STRINGTABLE BEGIN 21, "Funktioniert noch nicht!" 22, "Funktioniert noch nicht!" ENDHier der compile error
[Warning] passing NULL used for non-pointer converting 1 of `HWND__* CreateWindowExA(DWORD, const CHAR*, const CHAR*, DWORD, int, int, int, int, HWND__*, HMENU__*, HINSTANCE__*, void*)'Mit
HWND hEdit = GetTopWindow(hWnd, GW_CHILD | GW_HWNDLAST);versuche ich ein handle zum edit control abzurufen.
Aber es kommt durch diese Anweisung zu einem compile error
in Zeile 55, wobei sie damit ja eigentlich nichts zutun hat.Kommentiere ich das ganze aus
case WM_SIZE: //HWND hEdit = GetTopWindow(hWnd, GW_CHILD | GW_HWNDLAST); //MoveWindow(hEdit, 3, 3, wParam, lParam, true); break;Lässt es sich compilieren. Nur brauche ich doch aber die Skallierung...
Was mache ich falsch?// edit
Jetzt habe ich versucht, das handle zum edit control global zu definieren#include <windows.h> LPCSTR MainClassName = "Texteditor"; HWND hEdit; // Zum Empfangen und Auswerten der messages LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // Generelle Fensterstruktur registrieren WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(0)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = MAKEINTRESOURCE(1); wc.lpszClassName = MainClassName; wc.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(0), IMAGE_ICON, 16, 16, 0); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Konnte das Hauptfenster nicht registrieren!", "Fehler!", MB_ICONEXCLAMATION | MB_OK); return 0; } // Fenster erstellen HWND hWnd = CreateWindowEx( WS_EX_CLIENTEDGE, MainClassName, "Texteditor", WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL ); // Textbox ins Fenster setzen hEdit = CreateWindowEx( NULL, "EDIT", "Gib was ein", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0, 0, 400, 300, hWnd, NULL, NULL, NULL ); // Fenster anzeigen ShowWindow(hWnd, iCmdShow); // Auf Messages reagieren MSG wmsg; while( GetMessage(&wmsg, NULL, 0, 0) ) { TranslateMessage(&wmsg); DispatchMessage(&wmsg); } return wmsg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { char string[255]; switch (iMsg) { case WM_SIZE: MoveWindow(hEdit, 0, 0, wParam, lParam, true); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case 11: LoadString(GetModuleHandle(NULL), 21, string, sizeof(string)); MessageBox(hWnd, string, "Öffnen", MB_ICONINFORMATION); break; case 12: LoadString(GetModuleHandle(NULL), 22, string, sizeof(string)); MessageBox(hWnd, string, "Speichern", MB_ICONINFORMATION); break; case 13: DestroyWindow(hWnd); break; } break; } // An Windows weitergeben und dessen Antwort als Rückgabewert zurück return DefWindowProc(hWnd, iMsg, wParam, lParam); }Es compiliert, stockt aber wie sau.
Das edit control ist auch nicht zu sehen.Jetzt habe ich schon recharchiert und recharchier, probier und probiert.
Es muss doch wohl möglich sein, ein mehrzeiliges Eingabefeld als child
des Hauptfensters zu skalieren!? Und woran liegt dieser VERF!xX73
compile error!!!!!!!!????ßßß

// edit 2
Habe jetzt auch versucht, das edit control als Hauptfenster zu nehmen
und das vorherige Hauptfenster zu entfernen.#include <windows.h> LPCSTR MainClassName = "Texteditor"; // Zum Empfangen und Auswerten der messages LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // Generelle Fensterstruktur registrieren WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(0)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = MAKEINTRESOURCE(1); wc.lpszClassName = MainClassName; wc.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(0), IMAGE_ICON, 16, 16, 0); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Konnte das Hauptfenster nicht registrieren!", "Fehler!", MB_ICONEXCLAMATION | MB_OK); return 0; } // Edit-Fenster erstellen HWND hWnd = CreateWindowEx( WS_EX_CLIENTEDGE | WS_EX_APPWINDOW, "EDIT", "Texteditor", WS_OVERLAPPEDWINDOW | ES_MULTILINE | WS_VSCROLL | WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL ); // Fenster anzeigen ShowWindow(hWnd, iCmdShow); // Auf Messages reagieren MSG wmsg; while( GetMessage(&wmsg, NULL, 0, 0) ) { TranslateMessage(&wmsg); DispatchMessage(&wmsg); } return wmsg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { char string[255]; switch (iMsg) { case WM_CLOSE: // Problemchen MessageBox(hWnd, "Kommt nie!", "Problem!", MB_OK); DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case 11: LoadString(GetModuleHandle(NULL), 21, string, sizeof(string)); MessageBox(hWnd, string, "Öffnen", MB_ICONINFORMATION); break; case 12: LoadString(GetModuleHandle(NULL), 22, string, sizeof(string)); MessageBox(hWnd, string, "Speichern", MB_ICONINFORMATION); break; case 13: DestroyWindow(hWnd); break; } break; } // An Windows weitergeben und dessen Antwort als Rückgabewert zurück return DefWindowProc(hWnd, iMsg, wParam, lParam); }Mehrzeiliges Eingabefeld mit Skrollbalken al Hauptfenster mit
clientedge flag und der titleleiste halt.Problem: Icons werden aus der resource scheinbar nicht beachtet
und die WM_CLOSE message tritt nicht ein...
Hilfe, ich verzweifle langsam!
-
Ich hab zwar jetzt nicht alles durchgelesen, aber wenn du eine Nachricht behandelst solltest du DefWindowProc() eigentlich nicht mehr aufrufen.
Bei deiner zweiten Variante wundert mich nicht das WM_CLOSE nicht kommt - Das Edit-Control hat seine eigene WindowProc und wird deine daher nicht benutzen.
-
Wird
DestroyWindow(hWnd);in WinDef() etwa schon ausgeführt oder was meinst du?
Die MessageBox ist ja nur zum Verdeutlichen, dass sie nicht aufgerufen wird.Ich habe der Fensterklasse doch auch hier wieder WndProc
als Callback-Funktion zugewiesen. Ich habe im 2ten
source doch nur die edit box als Hauptfenstr genommen,geeky schrieb:
Das Edit-Control hat seine eigene WindowProc und wird deine daher nicht benutzen.
Also kann ich das Edit control nicht als Hauptfenster nehmen,
sondenr es muss ein Dialog sein. Ich bekomm die Skallierung
ja nichtmal compiliert!// edit
Das vorher compilierte Prog lief noch im Hintergrund... (acces denied)jetzt compiliert dev c++ das hier schonmal
#include <windows.h> LPCSTR MainClassName = "Texteditor"; // Zum Empfangen und Auswerten der messages LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // Generelle Fensterstruktur registrieren WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(0)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = MAKEINTRESOURCE(1); wc.lpszClassName = MainClassName; wc.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(0), IMAGE_ICON, 16, 16, 0); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Konnte das Hauptfenster nicht registrieren!", "Fehler!", MB_ICONEXCLAMATION | MB_OK); return 0; } // Fenster erstellen HWND hWnd = CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, MainClassName, "Titletext", WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL ); // Textbox ins Fenster setzen HWND hEdit = CreateWindowEx( NULL, "EDIT", "Gib was ein", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0, 0, 400, 300, hWnd, NULL, NULL, NULL ); // Fenster anzeigen ShowWindow(hWnd, iCmdShow); // Auf Messages reagieren MSG wmsg; while( GetMessage(&wmsg, NULL, 0, 0) ) { TranslateMessage(&wmsg); DispatchMessage(&wmsg); } return wmsg.wParam; } HWND hEdit; LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { char string[255]; switch (iMsg) { case WM_SIZE: MessageBox(NULL, "noch siehst du das edit control", "noch zu sehen", MB_OK); hEdit = GetTopWindow(hWnd); MoveWindow(hEdit, 0, 0, wParam, lParam, true); MessageBox(NULL, "und weg ist es", "jetzt nicht mehr", MB_OK); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case 11: LoadString(GetModuleHandle(NULL), 21, string, sizeof(string)); MessageBox(hWnd, string, "Öffnen", MB_ICONINFORMATION); break; case 12: LoadString(GetModuleHandle(NULL), 22, string, sizeof(string)); MessageBox(hWnd, string, "Speichern", MB_ICONINFORMATION); break; case 13: DestroyWindow(hWnd); break; } break; } // An Windows weitergeben und dessen Antwort als Rückgabewert zurück return DefWindowProc(hWnd, iMsg, wParam, lParam); }Aber wie man den letzten 2 MessageBoxes folgen kann, lässt MoveWindow
das edit control verschinden. Anstatt die Größe anzupassen.
Enthält wParam also doch nicht die neue Breite des Fensters oder
woran liegt das?
-
Laut msdn stehen in lParam sowohl Höhe als auch Breite!
MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), true);
-
#include <windows.h> LPCSTR MainClassName = "Texteditor"; // Zum Empfangen und Auswerten der messages LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // Generelle Fensterstruktur registrieren WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(0)); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = MAKEINTRESOURCE(1); wc.lpszClassName = MainClassName; wc.hIconSm = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(0), IMAGE_ICON, 16, 16, 0); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Konnte das Hauptfenster nicht registrieren!", "Fehler!", MB_ICONEXCLAMATION | MB_OK); return 0; } // Fenster erstellen HWND hWnd = CreateWindowEx( WS_EX_OVERLAPPEDWINDOW, MainClassName, "Titletext", WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL ); // Textbox ins Fenster setzen HWND hEdit = CreateWindowEx( NULL, "EDIT", "Gib was ein", WS_CHILD | WS_VISIBLE | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0, 0, 400, 300, hWnd, NULL, NULL, NULL ); // Fenster anzeigen ShowWindow(hWnd, iCmdShow); // Auf Messages reagieren MSG wmsg; while( GetMessage(&wmsg, NULL, 0, 0) ) { TranslateMessage(&wmsg); DispatchMessage(&wmsg); } return wmsg.wParam; } HWND hEdit; LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { char string[255]; switch (iMsg) { case WM_SIZE: MessageBox(NULL, "noch siehst du das edit control", "noch zu sehen", MB_OK); hEdit = GetTopWindow(hWnd); MoveWindow(hEdit, 0, 0, LOWORD(wParam), HIWORD(lParam), true); MessageBox(NULL, "und weg ist es", "jetzt nicht mehr", MB_OK); break; case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case 11: LoadString(GetModuleHandle(NULL), 21, string, sizeof(string)); MessageBox(hWnd, string, "Öffnen", MB_ICONINFORMATION); break; case 12: LoadString(GetModuleHandle(NULL), 22, string, sizeof(string)); MessageBox(hWnd, string, "Speichern", MB_ICONINFORMATION); break; case 13: DestroyWindow(hWnd); break; } break; } // An Windows weitergeben und dessen Antwort als Rückgabewert zurück return DefWindowProc(hWnd, iMsg, wParam, lParam); }Selbes Problem. Verändert sich nichts.
-
Guck nochmal was geeky als letztes gepostet hat.
-
Au mann! Die breite und Höhe wird als eine einzige Long übergeben!
LOWORD() spaltet die long und gibt die WORD, die sich aus den
linken bytes ergibt, während HIWORD() eine WORD aus den rechten
bytes holt. So, wie er geantwortet hat, funktioniert es immerhin.Anders kann ich es mir ja nicht erklären...