DialogBox wird nicht erstellt und Fenster friert ein, wieso?
-
hi... ich moechte eine DialogBox() erstellen doch jedes mal wenn ich sie aufrufen will via menuitem friert mir des fenster ein und es passiert nichts... was is da net richtig?
// main.cpp // includ #include <windows.h> #include <ctime> #include "test.h" // declar HINSTANCE hInst; HWND hWnd; WNDCLASS wc; HDC hDC; LRESULT CALLBACK WinProc( HWND, UINT, WPARAM, LPARAM ); bool CALLBACK DiaProc( HWND, UINT, WPARAM, LPARAM ); // initia char szAppName[] = " Testing"; #pragma hdrstop #pragma argsused WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; wc.style = CS_VREDRAW | CS_HREDRAW; wc.lpfnWndProc = WinProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( 0, IDI_APPLICATION ); wc.hCursor = LoadCursor( 0, IDC_ARROW ); wc.hbrBackground = (HBRUSH) GetStockObject( WHITE_BRUSH ); wc.lpszMenuName = "MYMENU"; wc.lpszClassName = szAppName; if( !( RegisterClass( &wc ) ) ) { MessageBox( 0, " Couldn't register window. You need Windows NT or" " better!", " Shutdown error!", MB_OK | MB_ICONERROR ); return 0; } hWnd = CreateWindow( szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, 0, 0, hInst, 0 ); ShowWindow( hWnd, SW_SHOW ); UpdateWindow( hWnd ); while( GetMessage( &msg, 0, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } return 0; } LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_CREATE: { return 0; } case WM_TIMER: { return 0; } case WM_SIZE: { return 0; } case WM_COMMAND: { switch( LOWORD( wParam ) ) { case IDM_TESTDIA: { DialogBox( hInst, MAKEINTRESOURCE( IDD_MYDIALOG ), hWnd, (DLGPROC)DiaProc ); break; } case IDM_QUIT: { SendMessage( hWnd, WM_CLOSE, 0, 0 ); break; } } return 0; } case WM_PAINT: { return 0; } case WM_DESTROY: { PostQuitMessage( 0 ); return 0; } } return( DefWindowProc( hWnd, message, wParam, lParam ) ); } bool CALLBACK DiaProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_INITDIALOG: { return true; } case WM_COMMAND: { switch( LOWORD( wParam ) ) { case IDOK: case IDCANCEL: { EndDialog( hDlg, 0 ); return true; } } return true; } } return false; }// herder #ifndef TEST_H #define TEST_H #define IDM_TESTDIA 1000 #define IDM_QUIT 1100 #define IDD_MYDIALOG 1200 #endif// .rc #include "test.h" IDD_MYDIALOG DIALOG DISCARDABLE 100, 100, 200, 120 STYLE DS_MODALFRAME | WS_POPUP FONT 12, "Arial" BEGIN DEFPUSHBUTTON "O.K.", IDOK, 70, 90, 50, 15 END MYMENU MENU BEGIN POPUP "&File" BEGIN MENUITEM "Open &Dialog", IDM_TESTDIA MENUITEM "&Quit", IDM_QUIT END ENDwenn ich DialogBox() in WM_CREATE rein setze funktioniert es...
gruß Tobi
-
T0bi schrieb:
DialogBox( hInst, MAKEINTRESOURCE( IDD_MYDIALOG ), hWnd, (DLGPROC)DiaProc );Lass da mal den Cast weg, vllt fällt es Dir dann selbst auf ...
.
-
Negativ!
wenn ich (DLGPROC) weglasse erscheinen folgende Fehler:[C++ Error] _test.cpp(100): E2034 Cannot convert 'bool (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()' [C++ Error] _test.cpp(100): E2342 Type mismatch in parameter 'lpDialogFunc' (wanted 'int (__stdcall *)()', got 'bool (__stdcall *)(void *,unsigned int,unsigned int,long)')also daran scheint es net zu liegen.
-
T0bi schrieb:
Negativ!
wenn ich (DLGPROC) weglasse erscheinen folgende Fehler:Nix "Negativ!".
Ist dir ein Laufzeitfehler lieber als ein Compilezeitfehler? Genau das erreichst du nämlich mit diesem Cast. Du verbietest dem Compiler die Typprüfung, also knallt's eben bei der Ausführung.also daran scheint es net zu liegen.
Aua, aua.

Mit Casts lassen sich Compilefehler prima unterdrücken. Aber Casts sind nur ganz ganz ganz selten die richtige Lösung, um Compilefehler zu beheben.
Schau dir in der MSDN Library an, wie die Signatur der DialogProc aussehen muss.
-
Hi T0bi! Wenn du den BCB benutzt, dann ist der Cast schon ganz richtig.
Was passiert, wenn deine DiaProc wie folgt aussieht?
bool CALLBACK DiaProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { return false; }
-
Hmm wie wäre es wenn ihr mal einfach euch anguckt wie die DLGPROC momentan definiert ist?
INT_PTR DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; default: break; } return (INT_PTR)FALSE; }
-
Ich glaube nicht, dass das das (3x 'das'
) Problem ist...
-
WebFritzi schrieb:
Hi T0bi! Wenn du den BCB benutzt, dann ist der Cast schon ganz richtig.
Was passiert, wenn deine DiaProc wie folgt aussieht?
bool CALLBACK DiaProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam ) { return false; }dann friert mein fenster trotzdem ein ... kommisch ich hatte doch schon mal nen dialog gemacht und da bgabs auch keine probleme, bis auf das ich casten musste
-
WebFritzi schrieb:
Ich glaube nicht, dass das das (3x 'das'
) Problem ist...Doch! Genau daran liegt es!
Mein Gott, ich geb den Hinweis, in der Hoffnung T0bi kommt selbst drauf, MFK erläutert das noch, (D)Evil gibt sogar den korrekten Code an und ihr laabert weiter son Müll. Sry, aber da fällt mir nicht mehr viel ein
.Vermeidet doch einfach diese unsinnigen Casts. *kopfschüttel*
-
hae? *behnhof*
-
Ist eine Blume die keine Blätter hat nur ein Grashalm?
-
Scheinbar haben einige mehr Info's als ich.
Was passiert bei ersten Code, wenn bei "eingefrorenem" Fenster die ALT-Taste
gedrückt wird.MfG
-
*lol* ? dann erscheint die DialogBox.... aber wieso ?
-
Schreib mal BOOL, TRUE und FALSE statt der Kleinbuchstaben und es geht auch
ohne DLGPROC.MfG
-
Hmm ihr scheint ja auf einem ziemlich hohen geistigen Niveau zu sein. Vllt guckt ihr euch einfach mal meine Antwort an. Deine DialogProc muss so aussehen wie ich sie dir gepostet hab. Kannst du auch in der MSDN nachlesen.
-
nein muss sie nich :P, ich hatte schon oeffters Dialoge gebastelt und sie haben bislang auch immer ohne deine möglichkeit funktioniert, doch irgendwie gehts net mehr ... -.- Borland is kaputt.
und es bringt auch nix wenn ich da true bool false ect klein oder groß schreibe ...grr... komisch find ichs ja des wenn das fenster gefreezed ist und ich alt druecke die DBox ershceint ...
-
Aus MSDN zu Dialogboxen:
char szItemName[80]; // receives name of item to delete. BOOL CALLBACK DeleteItemProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: if (!GetDlgItemText(hwndDlg, ID_ITEMNAME, szItemName, 80)) *szItemName=0; // Fall through. case IDCANCEL: EndDialog(hwndDlg, wParam); return TRUE; } } return FALSE; }
-
*freufreufreu* ich habe es jetzt auch kapiert, wie das mit dem Resourcencompiler von Borland geht
Ich hab die Lösung: Es liegt nicht daran, daß HINSTANCE hInst; nie initialisiert wird, es liegt auch nicht an szAppName[] = " Testing" mit Leerzeichen.
Die Lösung liegt in der WinProc():
/*case WM_PAINT: return 0;*/Der Grund: Windows sendet die PAINT-Nachricht (d.h. der Clientbereich des Hauptfensters wird für ungültig erklärt) und die Reaktion ist ein mageres return 0;. Darum "friert" das Fenster ein, weil der Arbeitsbereich nie wieder für gültig erklärt wird.
Also entweder ganz weglassen oder
case WM_PAINT: hdc = BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); return 0;
-
alter ich glaub es hackt... krasse sach wie lange hasten daran jetzt getüfftel... also bei mir gehts jetzs auch, also aller herzlichsten dank fuer den TIPP des Jahr 100's

Gruß und gn8 Tobi
-
BOOL CALLBACK DeleteItemProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)Das ist auch veraltet ...
TObi
Ist schon ziemlich dreist was du hier ablieferst. Solltest dir vllt nochmal überlegen was du schreibst ... man kann viele Sachen durch Casts beheben. Aber der einzigst richtige Funktionsrump besteht ausINT_PTR DialogProc(HWND, UINT, WPARAM, LPARAM). Ob du das nun einsiehst oder nicht ... theoretisch kannst du auch aus nem Menschen auch nen Affen machen -.-