Einfaches Programm zum Fenstererstellen mit Buttons
-
Hallo, haben in der FH jetzt grad das Thema "Gui mit c"
hab hier ein Beispielprogramm mit Visual Studio 2005 erstellt.
/*----------------------------------------------------------------------- HELLOWIN.C Zeigt "Hello, World!" in einem Dialogfenster an vgl. Petzold Kap. 3 -----------------------------------------------------------------------*/ #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; //Deklaration der Windows-Nachrichten-Prozedur int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("HelloWin") ; HWND hwnd ; // Window handle MSG msg ; // MSG Nachrichten Struktur WNDCLASS wndclass ; // WNDCLASS Struktur //Anwendungsbereich (client area) wndclass.style = CS_HREDRAW | CS_VREDRAW ; // Neuzeichnen des Fensters wndclass.lpfnWndProc = WndProc ; // Nachrichtenverarbeitung CALLBACK WndProc wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; // Cursor wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; // Hintergrund wndclass.lpszMenuName = NULL ; // Zeiger auf null-term. char string, der Ressourcen-Namen des Menüs festlegt 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_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, // Name der Fensterklasse TEXT ("Das erste echte Programm"), // Fenstertitel WS_OVERLAPPEDWINDOW, // Fensterstil - Art des Fensters CW_USEDEFAULT, // X-Position des Fensters CW_USEDEFAULT, // Y-Position des Fensters CW_USEDEFAULT, // Fensterbreite CW_USEDEFAULT, // Fensterhöhe NULL, // übergeordnetes Fenster NULL, // Menü hInstance, // Programm-Kopiezähler (Programm-ID) NULL) ; // zusätzliche Parameter ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) // Nachrichten-Schleife { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } // Windows-Nachrichten-Prozedur LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; HWND hwndButton1 ; HWND hwndButton2 ; switch (message) { /*case WM_CREATE: PlaySound (TEXT ("yippee.wav"), NULL, SND_FILENAME | SND_ASYNC) ; // WinMM.lib einbinden return 0 ; // ...nicht vergessen*/ case WM_CREATE: hwndButton1 = CreateWindow ( "button", "OK", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 490, 400, 100, 40, hwnd, (HMENU)1,((LPCREATESTRUCT) lParam)->hInstance, NULL); hwndButton2 = CreateWindow ( "button", "Cancel", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 600, 400, 100, 40, hwnd, (HMENU)2,((LPCREATESTRUCT) lParam)->hInstance, NULL); return 0 ; case WM_COMMAND: switch(LOWORD(wParam)) { case 1: MessageBox(hwnd,"Der Button OK wurde gedrückt", "Message", MB_OK); break; case 2: MessageBox(hwnd,"Der Button Cancel wurde gedrückt", "Message", MB_OK); break; } return 0; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT ("Hello, World!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; TextOut (hdc, 20, 20, "Ich bin ein Fenster.", 20); // device context, x, y, string, string-Länge EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }Eigentlich sollte es ja 2 Buttons erstellen, aber anstelle bekomme ich nur ein Fenster mit Chinesischen Zeichen.
http://img241.imageshack.us/img241/2272/templa5.th.jpg
Bin mit dem WinAPI aber auch noch recht unerfahren, aber das versteh ich jetzt wirklich net

edit: der selbe Code scheint bei Visual Studio 2003 zu funktionieren, versteh das jetzt gar nicht mehr
-
In VC2005 ist das Default UNICODE!!!!
Also bitte *ALLE* String mit dem TEXT oder _T Macro umgeben!!!hwndButton1 = CreateWindow ( TEXT("button"), TEXT("OK"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 490, 400, 100, 40, hwnd, (HMENU)1,((LPCREATESTRUCT) lParam)->hInstance, NULL); hwndButton2 = CreateWindow ( TEXT("button"), TEXT("Cancel"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 600, 400, 100, 40, hwnd, (HMENU)2,((LPCREATESTRUCT) lParam)->hInstance, NULL);