Problem it char variable
-
hi, ich hab ein problem mit meiner winapi anwendung. und zwar bekomme ich beim kompilieren diesen fehler:
[C++ Fehler] Main.cpp(7): E2277 L-Wert erwartetich verwende den Borland Turbo C++
hier ist der programm header
#include<windows.h> #define IDR_XPSTYLE 1 #define ID_MENU 501 #define IDM_NEWVOK 200 #define IDM_OPENVOK 201 #define IDM_PRACTICEVOK 202 #define IDM_EXIT 203 #define IDM_HELP 204 #define IDM_ABOUT 205 #define IDM_SAVEVOK 206 class App //Programm Klasse { public: App(); //Konstruktor ~App(); //Destruktor LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM); //Window Procedure char szClassName[15]; //Klassenname int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR); // Main Funktionfunction int Vokabeldatei_erstellen(); //Funktion zum erstellen einer Vokabeldatei int Vokabeldatei_erweitern(); //Funktion zum erweitern einer Vokabeldatei int Vokabeln_abfragen(); //Funktion zum abfragen von Vokabeln aus einer Vokabeldatei char szUeberschrift1[]; //Überschrift für das eingabefeld für die englischen Vokabeln char szUeberschrift2[]; //Überschrift für das Eingabefeld für die deutschen Vokabeln char szUeberschrift3[]; //Überschrift für das Eingabefeld zur ausgabe des Inhalts der Vokabeldatei char szUeberschrift4[]; //Überschrift für das Eingabefeld zur ausgabe der bereits abgefragten Vokabeln char szUeberschrift5[]; //Überschrift für das Eingabefeld zur eingabe des Dateinamens private: HWND hWnd; // Window Handle MSG message; //Messages WNDCLASSEX wc; //Window class HMENU menu; // Menu Handle static HWND hEdit1; //Editfeld für die ausgabe der Vokabeldatei bzw. der bereits abgefragten Vokabeln static HWND hEdit2; //Editfeld zur eingabe der Englischen Vokabel static HWND hEdit3; //Editfeld zur eingabe der deutschen Vokabel static HWND hEdit4; //editfeld zur Eingabe des Dateinamens static HWND hButton1; //Button zum eintragen der Vokabel in die vokabeldatei static HWND hButton2; //Button zum speichern der Vokabeldatei static HBRUSH hBrush; //Brush für den schrifthintergrund static RECT rect; //Fenstergröße bool optionen[10]; //0 = Vokabeln abfragen? 1 = speichern?, 2, 3, 4, 5, 6, 7, 8, 9, 10 = unbelegt };Und hier die main.cpp
#include<windows.h> #include"Main.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); App::App() //Konstruktorfunktion { szClassName = "Vokabeltrainer"; //fehler bezieht sich hier drauf } App::~App() //Destruktorfunktion { } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) { return 0; }ich hoffe, ihr könnt mir helfen.
-
strcpy(szClassName, "Vokabeltrainer");
-
thx, aber wofür das strcpy?
dit: ok, funzt.
-
Die Funktion strcpy() kopiert die Zeichenkette, auf die der Zeiger src zeigt, inklusive des Endzeichens '\0' an die Stelle, auf die der Zeiger dst zeigt.
-
Danke für die erklärung. Wieder etwas schaluer.^^
-
allerdings hab ich jetzt zwei neue probs:
1. Ich muss mehreren chars einen string zuweisen und wenn ich das mit stdcpy mache haben alle chars den string, den ich der letzten zugewiesen habe...
2. wenn ich mein programm starte passiert nix.... obwohl ein fenster angezeigt werden müsste. hier sind mal alle dateien des projekts:1.main.h
#include<windows.h> #define IDR_XPSTYLE 1 #define ID_MENU 501 #define IDM_NEWVOK 200 #define IDM_OPENVOK 201 #define IDM_PRACTICEVOK 202 #define IDM_EXIT 203 #define IDM_HELP 204 #define IDM_ABOUT 205 #define IDM_SAVEVOK 206 class App //Programm Klasse { public: App(); //Konstruktor ~App(); //Destruktor char szClassName[]; //Klassenname int Vokabeldatei_erstellen(); //Funktion zum erstellen einer Vokabeldatei int Vokabeldatei_erweitern(); //Funktion zum erweitern einer Vokabeldatei int Vokabeln_abfragen(); //Funktion zum abfragen von Vokabeln aus einer Vokabeldatei char szUeberschrift1[]; //Überschrift für das eingabefeld für die englischen Vokabeln char szUeberschrift2[]; //Überschrift für das Eingabefeld für die deutschen Vokabeln char szUeberschrift3[]; //Überschrift für das Eingabefeld zur ausgabe des Inhalts der Vokabeldatei char szUeberschrift4[]; //Überschrift für das Eingabefeld zur ausgabe der bereits abgefragten Vokabeln char szUeberschrift5[]; //Überschrift für das Eingabefeld zur eingabe des Dateinamens private: };main.cpp
#include<windows.h> #include"Main.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); App::App() //Konstruktorfunktion { strcpy(szClassName, "Vokabeltrainer"); strcpy(szUeberschrift1, "Englische Vokabel: "); //überschrift für die englischen Vokabeln strcpy(szUeberschrift2, "Deutsche Vokabel: "); //überschrift für die deutschen Vokabeln strcpy(szUeberschrift3, "Inhalt der Vokabeldatei: "); //überschrift für den Inhalt der Vokabeldatei strcpy(szUeberschrift4, "Berreits abgefragte Vokabeln: "); //überschrift für die berreits abgefragten Vokabeln strcpy(szUeberschrift5, "Dateiname: "); //überschrift für den dateinamen } App::~App() //Destruktorfunktion { } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) { HWND hWnd; // Window Handle MSG message; //Messages WNDCLASSEX wc; //Window class HMENU menu; // Menu Handle App Program; wc.hInstance = hInstance; wc.lpszClassName = Program.szClassName; wc.lpfnWndProc = WndProc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbSize = sizeof(WNDCLASSEX); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpszMenuName = NULL; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH) COLOR_BACKGROUND; if(!RegisterClassEx(&wc)) { return 0; } hWnd = CreateWindowEx( WS_EX_CLIENTEDGE, Program.szClassName, "Vokabeltrainer", WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 600, 400, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); menu = LoadMenu(hInstance, MAKEINTRESOURCE(ID_MENU)); SetMenu(hWnd, menu); while (GetMessage (&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } return message.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { //static HWND hEdit1; //Editfeld für die ausgabe der Vokabeldatei bzw. der bereits abgefragten Vokabeln //static HWND hEdit2; //Editfeld zur eingabe der Englischen Vokabel //static HWND hEdit3; //Editfeld zur eingabe der deutschen Vokabel //static HWND hEdit4; //editfeld zur Eingabe des Dateinamens //static HWND hButton1; //Button zum eintragen der Vokabel in die vokabeldatei //static HWND hButton2; //Button zum speichern der Vokabeldatei //static HBRUSH hBrush; //Brush für den schrifthintergrund //static RECT rect; //Fenstergröße //bool optionen[10]; //0 = Vokabeln abfragen? 1 = speichern?, 2, 3, 4, 5, 6, 7, 8, 9, 10 = unbelegt switch (message) { /*case WM_CREATE: { hButton1 = CreateWindow( "button", "Eintragen", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); MoveWindow(hButton1, 70, 150, 160, 22, TRUE); break; }*/ case WM_DESTROY: { /*if (hBrush) { DeleteObject(hBrush); }*/ PostQuitMessage (0); break; } } return DefWindowProc(hWnd, message, wParam, lParam); }Rsrc.rc
#include <windows.h> #include "Main.h" 501 MENU BEGIN POPUP "&Aufgaben" BEGIN MENUITEM "&Neue Vokabeldatei anlegen", IDM_NEWVOK MENUITEM "&Vokabeldatei bearbeiten", IDM_OPENVOK MENUITEM "&Vokabeldatei speichern", IDM_SAVEVOK MENUITEM SEPARATOR MENUITEM "&Vokabeln abfragen", IDM_PRACTICEVOK MENUITEM SEPARATOR MENUITEM "&Programm beenden", IDM_EXIT END POPUP "&Hilfe" BEGIN MENUITEM "&Hilfe", IDM_HELP MENUITEM "&Über das Programm", IDM_ABOUT END END IDR_XPSTYLE 24 DISCARDABLE "style.bin"style.bin
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity processorArchitecture="x86" version="5.1.0.0" type="win32" name="AUTORNAME"/> <description>PROGRAMMNAME</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="x86"/> </dependentAssembly> </dependency> </assembly>den tipp mit der style.bin zum verwenden es xpstyles hab ich hier i-wo gefunden.
-
Bitte leute. ich muss das prob bis freitag gelöst ham.( ist für die schule)
-
zu 1.) Ich würde mal speicher deinen char arrays zuweisen.
zu 2.) Ich habe beim überfliegen nix gesehen aber du hast garkeine Fehlerbehandlung. Werte GetLastError aus und lass dir Fehler wenn du sie hast anzeigen.schirrmie
-
Möglichkeit 1: du verwendest tatsächlich char-Arrays - aber dann bitte mit Größenangabe (erstaunlich, daß diese "char xyz[];" durch den Compiler kommen) - und füllst diese mit strcpy() und Co. auf.
Möglichkeit 2: du ersetzt die char-Arrays durch "echte" Strings (std::string), dann kannst du sogar mit Zuweisungsoperatoren arbeiten.
-
1. frage: kann man da wo szClassName hinkommt strings verwenden und kann man strings mit TextOut ausgeben?
geil, nachdem ich GetLastError eingefügt hab, funzts^^ aber dazu bleibt eine frage: wie soll ich den error code ausgeben einfach den return wert in ner variable speichern und ausgeben, oder wie?
-
Nein, da braucht man (afaik) char-Zeiger. (wobei - an Stellen, wo der Wert nur lokal benötigt wird, z.B. für TextOut(), kannst du auch mit c_str() auf die Daten zugreifen)
Mein Vorschlag: Nimm die MFC, da ersparst du dir eine Menge Stress.
-
Ich könnte auch die VCL nehmen( verwende Borland) aber ich hab das GUI und auch ein paar andere sachen schon in einem anderen projekt fertig.
aja, wie kann ich den standart öffnen/speichern dialog aufrufen?
edit: äh, wieso ist s t a n d a r t zensiert?
-
weil es hinten mit d geschrieben wird und nicht mit t
das ist die gezwungene rechtschreib-korrektur
{[zum glueck nicht ausgereift, sonst wuerde man meine posts nicht mehr lesen koennen vor lauter * #gg}
-
ah thx. wusst ich garnicht... trotzdem bleibt meine frage:
wie kann ich den Standard Öfnen/Speicherdialog einbinden?
-
Such nach GetOpenFileName und GetSaveFileName.
-
THX. ich such mal.( du minst doch in der msdn, oder?)
-
So, wieder ein prob( ich hasse es). jett werden die childs nicht angezeigt. wieder keinerleih fehler. hier ist mal nur die WndProc, weil sich nix von edm anderen verändert hat.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hEdit1; //Editfeld für die ausgabe der Vokabeldatei bzw. der bereits abgefragten Vokabeln static HWND hEdit2; //Editfeld zur eingabe der Englischen Vokabel static HWND hEdit3; //Editfeld zur eingabe der deutschen Vokabel //static HWND hEdit4; //editfeld zur Eingabe des Dateinamens static HWND hButton1; //Button zum eintragen der Vokabel in die vokabeldatei //static HWND hButton2; //Button zum speichern der Vokabeldatei static HBRUSH hBrush; //Brush für den schrifthintergrund static RECT rect; //Fenstergröße const char szUeberschrift1[] = "Englische Vokabel:"; // Überschrift für das eingabefelde der englischen vokabel const char szUeberschrift2[] = "Deutsche Vokabel:"; // Das selbe für die deutsche Vokabel const char szUeberschrift3[] = "Inhalt der Vokabeldatei:"; // jo, nomal für das dritte editfeld const char szUeberschrift4[] = "Bereits abgefragte Vokabeln:"; // <- const char szUeberschrift5[] = "Dateiname (ohne Endung):"; //Überschrift des savewindows Program.optionen[1] = FALSE; Program.optionen[2] = FALSE; switch (message) { case WM_SIZE: { rect.left = 0; rect.top = 0; rect.right = LOWORD(lParam); rect.bottom = HIWORD(lParam); return 0; } case WM_COMMAND: { switch (LOWORD (lParam)) { case IDM_NEWVOK: case IDM_OPENVOK: case IDM_SAVEVOK: case IDM_PRACTICEVOK: case IDM_HELP: { MessageBox(hWnd, (LPSTR) "Funktion noch nicht eingebaut.", (LPSTR) Program.szClassName, MB_ICONINFORMATION | MB_OK); return 0; } case IDM_ABOUT : { MessageBox(NULL, "Vokabeltrainer \n Copyright bei Martin 'Arathorns Sohn' Alsfasser \n Dark Grass Software", "Über das Programm", MB_OK); return 0; } case IDM_EXIT : { PostQuitMessage(0); return 0; } } return 0; } case WM_CREATE: { hBrush = CreateSolidBrush(RGB(255, 255, 255)); hEdit1 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", NULL, WS_CHILD | WS_VISIBLE | ES_READONLY | WS_VSCROLL | ES_AUTOVSCROLL | ES_MULTILINE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); MoveWindow(hEdit1, 310, 30, 270, 310, TRUE); hEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); MoveWindow(hEdit2, 40, 70, 230, 22, TRUE); hEdit3 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); MoveWindow(hEdit3, 40, 120, 230, 22, TRUE); hButton1 = CreateWindow( "button", "Eintragen", WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); MoveWindow(hButton1, 70, 150, 160, 22, TRUE); UpdateWindow(hWnd); return 0; } case WM_DESTROY: { if (hBrush) { DeleteObject(hBrush); } PostQuitMessage (0); break; } } return DefWindowProc(hWnd, message, wParam, lParam); }habs auch schon mit showWindow und allem probiert, wieder nix gebracht.
aja, wenn ich im menü auf die einträge klicke, wird die messageBox, die da erscheinen sollte nicht angezeigt....
-
switch (LOWORD (wParam)) {
-
thx dafür, aber anscheinend hat mein pc was dagegen neue fenster zu öffnen. ich hör zwar sounds, aber die messageboxen werden nicht geöffnet...
-
Einmal aufgeräumt ... zwar nicht getestet, aber egal:P
#define IDC_EDIT_1 1001 #define IDC_EDIT_2 1002 #define IDC_EDIT_3 1003 #define IDC_BTN_INSERT 1004 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_COMMAND: { switch (LOWORD(wParam)) { case IDM_NEWVOK: case IDM_OPENVOK: case IDM_SAVEVOK: case IDM_PRACTICEVOK: case IDM_HELP: { MessageBox(hWnd, TEXT("Funktion noch nicht implementiert"), Program.szClassName, MB_OK | MB_ICONWARNING); } break; case IDM_\1: { MessageBox(NULL, TEXT("Vokabeltrainer\nCopyright bei Martin 'Arathorns Sohn' Alsfasser\nDark Grass Software"), TEXT("Über das Programm"), MB_OK | MB_ICONINFORMATION); } break; case IDM_EXIT: { PostQuitMessage(0); } break; } } break; case WM_CREATE: { if (CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE | ES_READONLY | WS_VSCROLL | ES_AUTOVSCROLL | ES_MULTILINE, 310, 30, 270, 310, hWnd, (HMENU)IDC_EDIT_1, ((LPCREATESTRUCT)lParam)->hInstance, NULL) == NULL || CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE, 40, 70, 230, 22, hWnd, (HMENU)IDC_EDIT_2, ((LPCREATESTRUCT)lParam)->hInstance, NULL) == NULL || CreateWindowEx( WS_EX_CLIENTEDGE, TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE, 40, 120, 230, 22, hWnd, (HMENU)IDC_EDIT_3, ((LPCREATESTRUCT)lParam)->hInstance, NULL) == NULL || CreateWindowEx( 0, TEXT("button"), TEXT("Eintragen"), WS_CHILD | WS_VISIBLE, 70, 150, 160, 22, hWnd, (HMENU)IDC_BTN_INSERT, ((LPCREATESTRUCT)lParam)->hInstance, NULL) == NULL) { MessageBox(NULL, TEXT("Es ist ein Fehler beim erstellen des Fensters aufgetreten!"), TEXT("Fehler"), MB_OK | MB_ICONERROR); return -1; } } break; case WM_DESTROY: { PostQuitMessage(0); } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0L; }... dann hast du die bescheuerten static's mal alle raus -.- Das Handle auf die Fenster bekommst du per GetDlgItem(hWnd, IDC_EDIT_1) bsw. bei hEdit1 ...