inaktive Dialoge?
-
Hab ein prob mit meiner winapi-anwendung
Nach dem ich mein cconnect-Dialog aufgerufen habe ruft es den nächste dialog auf aber daran sind alle Fenster inaktiv??? mein Code:#include <windows.h> #include "resource.h" #include "main.h" static int icport; static client clienta; static char*cip=(char*)malloc(sizeof(char)*100); /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK abschicken(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK cconnect(HWND, UINT, WPARAM, LPARAM); static HWND hwndw; HINSTANCE hInst; /* Make the class name into a global variable */ char szClassName[ ] = "Server Client"; int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow) { HWND hwnd; /* This is the handle for our window */ MSG messages; /* Here messages to the application are saved */ WNDCLASSEX wincl; /* Data structure for the windowclass */ /* The Window structure */ wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */ wincl.style = CS_DBLCLKS; /* Catch double-clicks */ wincl.cbSize = sizeof (WNDCLASSEX); /* Use default icon and mouse-pointer */ wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor (NULL, IDC_ARROW); wincl.lpszMenuName =MAKEINTRESOURCE(IDR_MENU1); /* No menu */ wincl.cbClsExtra = 0; /* No extra bytes after the window class */ wincl.cbWndExtra = 0; /* structure or the window instance */ /* Use Windows's default colour as the background of the window */ wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND; /* Register the window class, and if it fails quit the program */ if (!RegisterClassEx (&wincl)) return 0; /* The class is registered, let's create the program*/ hwnd = CreateWindowEx ( 0, /* Extended possibilites for variation */ szClassName, /* Classname */ "Server Client", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); /* Make the window visible on the screen */ ShowWindow (hwnd, nCmdShow); hwndw=hwnd; hInst=hThisInstance; /* Run the message loop. It will run until GetMessage() returns 0 */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is 0 - The value that PostQuitMessage() gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_COMMAND: { switch(LOWORD(wParam)) { case ID_CONNECT: { DialogBox( hInst,MAKEINTRESOURCE(IDR_CONNECT),hwnd,(DLGPROC)cconnect ); return 0; } case ID_CLOSE: { SendMessage(hwnd,WM_QUIT,0,0); return 0; } } } case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ break; default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } LRESULT CALLBACK abschicken (HWND hwnd1, UINT message, WPARAM wParam, LPARAM lParam) { static char*text=(char*)malloc(sizeof(char)*500); char*buffer=(char*)malloc(sizeof(char)*500); char*request=(char*)malloc(sizeof(char)*500); switch (message) /* handle the messages */ { case WM_QUIT: { EndDialog( hwnd1, 0); return 0; } case WM_INITDIALOG: { clienta.start_init(1,500,icport,cip); int err; char*errstr=(char*)malloc(sizeof(char)*40); err=clienta.client_connect(); if((err)>0) { sprintf(errstr,"connect failed err: %d",err); MessageBox(hwnd1,errstr,"Err",MB_OK); } clienta.client_recv(buffer); strcpy(text,buffer); SetDlgItemText(hwnd1,IDC_RECV,text); return 0; } case WM_COMMAND: { if(LOWORD(wParam)==IDC_OK) { GetDlgItemText(hwnd1,IDC_EDIT1,request,500); sprintf(request,"%s\r\n",request); clienta.client_send(request); sprintf(text,"%s \r\n %s",text,request); SetDlgItemText(hwnd1,IDC_RECV,text); clienta.client_recv(buffer); sprintf(text,"%s \r\n %s",text,buffer); SetDlgItemText(hwnd1,IDC_RECV,text); return 0; } } default: /* for messages that we don't deal with */ return DefWindowProc (hwnd1, message, wParam, lParam); } return 0; } LRESULT CALLBACK cconnect (HWND hwnd2, UINT message2, WPARAM wParam, LPARAM lParam) { hwndw=hwnd2; switch (message2) /* handle the messages */ { case WM_CLOSE: { return 0; } case WM_COMMAND: { if(LOWORD(wParam)==IDC_SUBMIT) { char*cport=(char*)malloc(sizeof(char)*100); GetDlgItemText(hwnd2,IDC_SERV,cip,100); GetDlgItemText(hwnd2,IDC_PORT,cport,100); sscanf(cport,"%d",&icport); DialogBox( hInst,MAKEINTRESOURCE(IDR_DIALOG),hwndw,(DLGPROC)abschicken); EndDialog( hwnd2, 0); return 0; } } default: /* for messages that we don't deal with */ return DefWindowProc (hwnd2, message2, wParam, lParam); } return 0; }
-
Du must jedes Element einzeln aktivieren:
EnableWindow( GetDlgItem( hDlg, /*Item*/ ), TRUE );Beispiel:
EnableWindow( GetDlgItem( hwnd1, IDC_RECV ), TRUE );Das sollte gehen

-
hab es probiert es funktioniert aber leider ni is immer noch derselbe effekt irgendwie liegt dass an meinem Quellcode weiß nur ni wo

wenn ich auf die anderen Fenster gehe hört man nur ein bing sonst passiert nichts
-
Was hast du für Flags bei dem Dialog gesetzt? alkso in der Resourcendatei?
-
also dass is mein ressourcenquelltext
#include <windows.h> #include "resource.h" IDR_MENU1 MENU BEGIN POPUP "Verbindung" BEGIN MENUITEM "&Verbinden", ID_CONNECT MENUITEM "&Beenden", ID_CLOSE END END IDR_DIALOG DIALOGEX 20, 20, 270, 200 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "Serververbindung" FONT 8, "MS Sans Serif" BEGIN LTEXT "Nachricht : ", -1, 10, 8, 45, 8 EDITTEXT IDC_EDIT1, 45,6,61,13, ES_AUTOHSCROLL | WS_BORDER PUSHBUTTON "Abschicken", IDC_OK, 110, 6, 50, 14 EDITTEXT IDC_RECV,6,35,200,150,ES_AUTOHSCROLL |ES_MULTILINE| NOT WS_TABSTOP END IDR_CONNECT DIALOGEX 20, 20, 170, 100 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "connect" FONT 8, "MS Sans Serif" BEGIN LTEXT "Server : ", -1, 10, 8, 45, 8 LTEXT "Port : ", -1, 10, 20, 45, 8 EDITTEXT IDC_SERV, 45,6,61,13, ES_AUTOHSCROLL | WS_BORDER PUSHBUTTON "&Bestätigen", IDC_SUBMIT, 50, 80, 50, 14 EDITTEXT IDC_PORT,45,20,61,13,ES_AUTOHSCROLL | WS_BORDER ENDVielleicht noch ne Information ich verwende ne dll soll ich den Quellcode für die auch posten?
-
WO hast du die neue Zeile eingefügt ?
-
wie meinst du dass?
und nochwas:derselbe fehler tritt auch bei Messageboxen auf also wenn im 2. Dialog die Fehlermeldung aufgerufen wird sieht die zwar wie ein aktives fenster aus ich kann sie aber nicht anklicken
-
case WM_INITDIALOG: { clienta.start_init(1,500,icport,cip); int err; char*errstr=(char*)malloc(sizeof(char)*40); err=clienta.client_connect(); if((err)>0) { sprintf(errstr,"connect failed err: %d",err); MessageBox(hwnd1,errstr,"Err",MB_OK); } clienta.client_recv(buffer); strcpy(text,buffer); SetDlgItemText(hwnd1,IDC_RECV,text); EnableWindow( GetDlgItem( hwnd1, IDC_RECV ), TRUE ); //Sollte eigentlich gehen return 0; }Wenn das nicht geht, versuch's mal so:
LRESULT CALLBACK abschicken (HWND hwndX, UINT message, WPARAM wParam, LPARAM lParam) //neu { static char*text=(char*)malloc(sizeof(char)*500); char*buffer=(char*)malloc(sizeof(char)*500); char*request=(char*)malloc(sizeof(char)*500); HINSTANCE hwnd1; //neu switch (message) /* handle the messages */ { case WM_QUIT: { EndDialog( hwnd1, 0); return 0; } case WM_INITDIALOG: { clienta.start_init(1,500,icport,cip); int err; char*errstr=(char*)malloc(sizeof(char)*40); err=clienta.client_connect(); if((err)>0) { sprintf(errstr,"connect failed err: %d",err); MessageBox(hwnd1,errstr,"Err",MB_OK); } clienta.client_recv(buffer); strcpy(text,buffer); SetDlgItemText(hwnd1,IDC_RECV,text); EnableWindow( GetDlgItem( hwnd1, IDC_RECV ), TRUE ); //Sollte eigentlich gehen return 0; } case WM_COMMAND: { if(LOWORD(wParam)==IDC_OK) { GetDlgItemText(hwnd1,IDC_EDIT1,request,500); sprintf(request,"%s\r\n",request); clienta.client_send(request); sprintf(text,"%s \r\n %s",text,request); SetDlgItemText(hwnd1,IDC_RECV,text); clienta.client_recv(buffer); sprintf(text,"%s \r\n %s",text,buffer); SetDlgItemText(hwnd1,IDC_RECV,text); return 0; } } default: /* for messages that we don't deal with */ return DefWindowProc (hwnd1, message, wParam, lParam); } return 0; }EDIT: DirectX verwendet nämlich auch "HINSTANCE" für Dialogfelder

-
klg71 schrieb:
LRESULT CALLBACK abschicken (HWND hwnd1, UINT message, WPARAM wParam, LPARAM lParam) { static char*text=(char*)malloc(sizeof(char)*500); char*buffer=(char*)malloc(sizeof(char)*500); char*request=(char*)malloc(sizeof(char)*500);Dieser Code ist eine einzige Katastrophe.
Werde Dir mal klar was es beudetet IN JEDER Nachricht diesen Code zu durchlaufen.
Außerdem: Warm verwendest Du hier keine Arrays Variablen auf dem Stack.
-
es klappt irgendwie ni aber ich glaube ich hab es nicht gut genug beschrieben was mein problem ist: nämlich ist dass fenster nicht direkt inaktiv sondern sehen alle Elemente aktiv aus aber sie reagieren irgendwie nicht auf meine befehle....
PS:Würd ja gern screenshot einfügen weiß nloß ni wie^^
-
OK hab ne Lösung gefunden weiß zwar nicht ob dir irgendjemand was bringt aber ich poste sie trotzdem mal
Irgendwie hatte ich im 2. Dialog(cconect) ein fenster dass nicht mehr da war aber trotzdem noch nachrichten bekommen hat
also hab ich nach EndDialog() noch DestroyWindow() eingebaut und es funktionierte^^LRESULT CALLBACK cconnect (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_CLOSE: { EndDialog( hwnd, 0); DialogBox( hInst,MAKEINTRESOURCE(IDR_DIALOG),hwndw,(DLGPROC)abschicken); return 0; } case WM_COMMAND: { if(LOWORD(wParam)==IDC_SUBMIT1) { char*cport=(char*)malloc(sizeof(char)*100); GetDlgItemText(hwnd,IDC_SERV,cip,100); GetDlgItemText(hwnd,IDC_PORT,cport,100); sscanf(cport,"%d",&icport); EndDialog( hwnd, 0); //hier der Dialog sollte eigentlich jetz zerstört werden aber er tut es nicht DestroyWindow(hwnd);//weshalb ich dies eingebaut habe^^ DialogBox( hInst,MAKEINTRESOURCE(IDR_DIALOG),hwndw,(DLGPROC)abschicken); return 0; } } default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; }Schöne Weihnachten und danke für eure Hilfe :xmas1: :xmas1: :xmas2:
-
... ich habe selten so einen Unfug gesehen.
Vieleicht solltest Du Dich etwas mit der Windows API auseinandersetzen.
EndDialog ist nicht dafür da den Dialog zu zerstören. Er beendet den Dialog. D.h. er wird versteckt und erstbeendet, wenn die Nachrichtenschleife beendet. Die kann aber nicht beendet werden weil Du ja schon den nächsten Dialog modal erzeugst.
-
hab mich mit der winapi auseinandergesetzt hab aber trotzdem noch ne frage dasselbe passiert auch wenn ich aus meinem Dialog ne MessageBox() aufrufen will und davor muss ich doch keine Nachrichtenschleife beenden odER?
-
hallo! auf WM_INITDIALOG solltest du wohl mit (INT_PTR)TRUE antworten...
-
hab ich versucht so
WM_INITDIALOG: { .... .... .... return (INT_PTR)TRUE; }so bleibt das problem das gleiche
-
habe noch etwas heruasgefunden
wenn ich.default: /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam);weglasse siehr mein dialog ganz komisch aus irgendwie hat er dann keinen rahmen mehr und außeredem gibt es manche Fenster doppelt?????

-
habe fehler gefunden,oder jedenfalls gehts jetzt

Ich habe jedes return 0; durch ein break; ersetzt und bei der Message Switch anweisung default:return false gesetzt jetzt geht es weiß bloß ni warum

Frohe Weihnachten
-
von speicher wieder freigeben hälst du wohl auch nichts. ein statisches
array würde den selben zweck erfüllen, schneller sein, und automatisch freigegeben
werden. trotzdem malloc's du überall ein paar 100 bytes. das is nicht schön
-
ok werde es ändern
