Dialog schließen
-
Hallo,
entweder bin ich zu blöd oder...ja nix oder, ich bin blöd
Habe mir das Buch Windows Programmierung von Charles Petzold geholt, und bin dabei einen Dialog zu erstellen, hier mein Code (teilweise entnommen aus dem Buch):test.cpp
#include <windows.h> #include "config.h" LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("LCDCon") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = DLGWINDOWEXTRA ; // Achtung! wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (hInstance, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), szAppName, MB_ICONSTOP) ; return 0 ; } hwnd = CreateDialog (hInstance, szAppName, 0, NULL) ; ShowWindow (hwnd, iCmdShow) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND : switch(LOWORD(wParam)) { case IDC_EXIT : PostQuitMessage(0); return 0; } return 0; case WM_DESTROY : PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
test.rc
LCDCon DIALOG 84, 73, 161, 127 STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX CAPTION "LCD Show Config" FONT 8, "MS Sans Serif" { LTEXT "LCD Show Config Tool Ver. 0.01", -1, 12, 6, 135, 10 PUSHBUTTON "Beenden", IDC_EXIT, 29, 102, 109, 17 }
config.h
#define DIALOG_1 1 #define LCDCon LCDCon #define IDC_EXIT 101 #define CONFIG Config
Nur wenn ich auf den Button klicke, passiert nix...selbst wenn ich das kreuz oben rechts anklicke passiert nix...
Ich bin NewBie, daher bitte nicht lachen
Kann mir auch nebenbei bitte einer sagen, wie ich den Hintergrund von dem Dialog ändern kann?Danke
-
Kannst du mir mal sagen warum du dir ne Klasse registrierst und dann doch CreateDialog nutzt?
-
Hi,
Diese Zeile müsstest du noch ändern hwnd = CreateDialog (hInstance, szAppName, 0, NULL) ;
Denn statt NULL musst du die Prozedur dieser Dialogbox übergeben, wie z.B.
... hwnd = CreateDialog (hInstance, szAppName, 0, DlgProc );... BOOL CALLBACK DlgProc (HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) // Dialogprozedur { ...... }
Schau mal genauer beim Petzold nach, da wird beschrieben wie es geht
MfG Unwissender
-
case IDCANCEL: // Achtung PostQuitMessage(0); return 0;
-
Das war gerade für das Kreuz oben rechts
-
komisch...Petzold hat die Klasse aber auch Registriert...naja, da muss ich wohl noch lesen...
jetzt bekomme ich diese Fehlermeldung :
Error LCDCON.CPP 16: Cannot convert 'int (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()' in function __stdcall WinMain(void *,void *,char *,int)
betreffende Zeile :
hwnd = CreateDialog (hInstance, szAppName, NULL, DlgProc);
und DlgProc :
BOOL CALLBACK DlgProc (HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case IDCANCEL: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hdlg, message, wParam, lParam) ; }
sorry, ich kapier das nicht...in der Hilfe steht, die API
thx
-
erwartet als letzten Parameter die Adresse der DialogProc, die gebe ich ihm doch oder?
ausversehen auf Enter gedrückt...
-
Wenn der Petzold da schon DLGWINDOWEXTRA angibt dann soll bestimmt auch DefDlgProc aufgerufen werden und nicht DefWindowProc.
-
Original erstellt von <fadfreak>:
erwartet als letzten Parameter die Adresse der DialogProc, die gebe ich ihm doch oder?Nö. Du gibst ihm einen Pointer auf eine Window-Proc.
-
funktioniert immernoch nicht :
#include <windows.h> #include "config.h" BOOL CALLBACK DlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("LCDCon") ; HWND hwnd ; MSG msg ; hwnd = CreateDialog (hInstance, szAppName, 0, DlgProc); ShowWindow (hwnd, iCmdShow) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefDlgProc (hwnd, message, wParam, lParam) ; }
-
nimm doch den quellcode von der cd. der wird wohl richtig sein und funktionieren?
-
ja...ich glaube das werde ich wohl machen müssen...schade...
Mein Ziel : Eine Dialog-Box öffnen, ohne vor ein Fenster geöffnet zu haben...also kein CreateWindow, ist das überhaupt möglich?Danke
-
Natürlich ist sowas möglich
-
Original erstellt von <fadfreak>:
**ja...ich glaube das werde ich wohl machen müssen...schade...
Mein Ziel : Eine Dialog-Box öffnen, ohne vor ein Fenster geöffnet zu haben...also kein CreateWindow, ist das überhaupt möglich?Danke**
Geh auf http://www.winapi.net unter "Codeschnipsel" findest Du "Eine rein dialog-basierte Anwendung erzeugen"
Das ist genau DAS, was Du suchst!
-
Ja, habe ich gemacht, immernoch der gleiche Fehler :
Compiling LCDCON.CPP:
Error LCDCON.CPP 15: Cannot convert 'int (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()' in function __stdcall WinMain(void *,void *,char *,int)Ist das mein Compiler?
aber das wars eigentlich, was ich suchte...
-
Lösch deinen kompletten Quelltext und füge das Beispiel von Winapi.net ein!
Du bist der erste, der mit dem dort abgedruckten (kompletten) Quelltext Fehler hat!
-
HALT DIE KLAPPE
-
Nein, nein. Hör nicht auf die anderen! Du musst den letzten Parameter in CreateDialog() nach DLGPROC casten. Also so:
CreateDialog(..., (DLGPROC)DialogProc);
-
Wenn man das richtig macht braucht man den Cast NICHT!
-
@<Ars>: Halt dein Maul, du kleiner IDIOT !!!!!!!! Du hast ja keine Ahnung! Im BCB z.B. MUSS man das casten!
-
DANN IST DER BCB EIN ASOZIALER COMPILER!! ICH WERDE DAS GLEICH TESTEN, OB DU WIRKLICH RECHT HATTEST, NOTFALLS ENTSCHULDIGE ICH MICH EIN BISSCHEN