SetWindowLong() ! Was mach ich falsch ??
-
Hi!
Ich habe eine Win32 Aplliaction und erstelle von der WinMain ein ResourceDialog. Dieser beinhaltet ein Edit-feld. Und ich möchte auf
verschiedenen Eingaben reagieren. Ich habe schon überall gesucht, jedoch ist jeglicher Code den ich finde stets der gleiche.Könnt ihr mir helfen ?
Code:
#include <windows.h> #include <conio.h> #include "resource.h" BOOL bQuit = FALSE; HWND hWnd; LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); int CALLBACK DlgProc( HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam ); LRESULT CALLBACK EditProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstace, LPSTR lpCmdLine, int nShowCmt ) { WNDCLASSEX winclass; const char chKlassenname[] = "D3DClass"; // Define window class winclass.cbSize = sizeof(WNDCLASSEX); winclass.style = CS_CLASSDC | CS_VREDRAW | CS_VREDRAW; //CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0L; winclass.cbWndExtra = 0L; winclass.hInstance = hInstance; // GetModuleHandle(NULL); winclass.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_ICON) ); winclass.hCursor = LoadCursor(hInstance, IDC_APPSTARTING ); winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);// Schwarze Farbe winclass.lpszMenuName = NULL; winclass.lpszClassName = chKlassenname; winclass.hIconSm = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_ICON) ); // Register defined window class if (!RegisterClassEx(&winclass)) return 0; // Create window with defined window class settings if (!( hWnd = CreateWindowEx( NULL, chKlassenname, "Console Test, tpn", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME , 100,100, 500,500, NULL, NULL, hInstance, NULL))) return 0; // Show created window // This Zeiger übergeben ShowWindow( hWnd, SW_SHOW ); HWND dhWnd = CreateDialog( NULL, MAKEINTRESOURCE(IDD_DIALOG1), 0, DlgProc ); ShowWindow( dhWnd, SW_SHOW ); //SetFont(hEdit, "MS Sans Serif", 10, FW_NORMAL, FALSE, FALSE, FALSE); SetWindowLong( GetDlgItem( dhWnd, IDC_EDIT ), GWL_WNDPROC, EditProc); while (!bQuit) { MSG message; while(PeekMessage(&message, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&message); DispatchMessage(&message); } } return 0; } LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { // Können wir die Message selbst verarbeiten? switch(message) { // Das Fenster wurde beendet case WM_DESTROY: { bQuit = TRUE; PostQuitMessage(0); return 0; } break; // Eine Taste wurde gedrückt case WM_KEYDOWN: MessageBox(0, "", "", MB_OK ); switch (wparam) { // Welche Taste? // Falls Escape Taste... case VK_ESCAPE: { //...dann Beenden Nachricht posten! PostMessage(hwnd, WM_CLOSE, 0, 0); return 0; } break; } break; default:break; } // switch // Sonst Windows-Standardverarbeitung aufrufen! return (DefWindowProc(hwnd, message, wparam, lparam)); } // WindowProc ///////////////////////////////////////////////////////////////////////// // DlgProc // // ///////////////////////////////////////////////////////////////////////// int CALLBACK DlgProc( HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_LBUTTONDOWN: { return TRUE; }break; case WM_LBUTTONUP: { return TRUE; }break; case WM_DESTROY: { return TRUE; }break; case WM_INITDIALOG: { return TRUE; } break; case WM_COMMAND: { switch( LOWORD( wParam )) { case IDCANCEL: { exit( 0 ); return TRUE; }break; } }break; } return FALSE; } LRESULT CALLBACK EditProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch(iMsg) { case WM_SETFOCUS: MessageBox(GetParent(hwnd), "SETFOCUS", "", MB_OK); break; } return DefWindowProc(hwnd, iMsg, wParam, lParam); } ERROR: ------ ...\Main.cpp(69) : error C2664: 'SetWindowLongA' : Konvertierung des Parameters 3 von 'long (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,long)' in 'long' nicht moeglich
Grüsse vom Gast
-
Probier mal EditProc bei SetWindowLong noch auf long zu casten.
cya
-
Genau,
SetWindowLong( GetDlgItem( dhWnd, IDC_EDIT ), GWL_WNDPROC, (long)EditProc);
und ich schreibe das eigentlich immer in WM_CREATE von WindowProc!
-
Hi!
Jo, danke! Funktioniert.
Jedoch nicht so ganz. Vc++6 kompiliert zwar den Code ohne probleme.
Jedoch ist das Editfeld jetzt "deaktivier" also ich kann es nicht mehr "ansprechen" !!
Muss ich in den WndProc irgent etwas setzten ?
ich habe schon probiert mit EnableWindow() es zu aktivieren. Funktioniert aber leider nicht?
Grüsse
-
Ja, würd ich auch machen, ist einfach übersichtlicher, da sieht man dann auf den _ersten_ Blick, dass das ganze aufgerufen wird, wenn das Fenster erstellt wird. (Oder wird WM_CREATE nachdem das Fenster erstellt wurde gepostet?)
cya
-
Ah, jetzt! Du musst die alte WndProc des Edit-Controls speichern, und die dann am Ende der EditProc aufrufen, nicht DefWindowProc. SetWindowLong gibt dir da einen Zeiger auf die alte WndProc zurück, speicher den und ruf sie dann mit CallWndProc auf.
Siehe dazu auch: http://home.t-online.de/home/pikfloete/schnipsel/subclassing.html
cya
-
Hi!
Danke!. Funktioniert wunderbar.
-
Gern geschehen
!
cya