WinAPI, Bild öffnen und bearbeiten
-
Hey,
ich versuche mich grade an WinAPI. Doch bei zwei Sachen meldet sich der Compiler CreateWindow und szTitel.
Das Programm soll das Bild laden in 512*512 Fenstergroeße. Soll nen Titel haben und die Anzeigewerte sollen etwas abgeändert werden. Die Datenpunkte müssen dann mit setpixel() gezeichnet werden.
#include "stdafx.h" #include "test.h" #include <windows.h> #include <stdio.h> #define MAX_LOADSTRING 100 void OnPaint(HWND hWnd); // Globale Variablen: HINSTANCE hInst; // Aktuelle Instanz TCHAR szTitle[MAX_LOADSTRING]; // Titelleistentext TCHAR szWindowClass[MAX_LOADSTRING]; // Klassenname des Hauptfensters HINSTANCE hInst=0; char szTitle[] = "CT-Viewer"; char szAppName[] = "CT-Viewer"; // Vorwärtsdeklarationen der in diesem Codemodul enthaltenen Funktionen: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: Hier Code einfügen. MSG msg; HACCEL hAccelTable; // Globale Zeichenfolgen initialisieren LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_TEST, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Anwendungsinitialisierung ausführen: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST)); // Hauptnachrichtenschleife: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // FUNKTION: MyRegisterClass() // // ZWECK: Registriert die Fensterklasse. // // KOMMENTARE: // // Sie müssen die Funktion verwenden, wenn Sie möchten, dass der Code // mit Win32-Systemen kompatibel ist, bevor die RegisterClassEx-Funktion // zu Windows 95 hinzugefügt wurde. Der Aufruf der Funktion ist wichtig, // damit die kleinen Symbole, die mit der Anwendung verknüpft sind, // richtig formatiert werden. // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TEST); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // FUNKTION: InitInstance(HINSTANCE, int) // // ZWECK: Speichert das Instanzenhandle und erstellt das Hauptfenster. // // KOMMENTARE: // // In dieser Funktion wird das Instanzenhandle in einer globalen Variablen gespeichert, und das // Hauptprogrammfenster wird erstellt und angezeigt. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Instanzenhandle in der globalen Variablen speichern hWnd = CreateWindow(szAppName, szTitle, WS_OVERLAPPED |WS_CAPTION |WS_SYSMENU |WS_MINIMIZEBOX, CW_USEDEFAULT, 0, 512, 544, NULL, NULL, hInst, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // FUNKTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // ZWECK: Verarbeitet Meldungen vom Hauptfenster. // // WM_COMMAND - Verarbeiten des Anwendungsmenüs // WM_PAINT - Zeichnen des Hauptfensters // WM_DESTROY - Beenden-Meldung anzeigen und zurückgeben // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Menüauswahl bearbeiten: switch (wmId) { case IDM_\1: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Hier den Zeichnungscode hinzufügen. EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Meldungshandler für Infofeld. INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; } void OnPaint(HWND hWnd) { FILE *input; input = fopen("kopf.ima","rb"); sprintf(szTitle,"kopf.ima"); SetWindowText(hWnd,szTitle); if(input==NULL) printf("Ein Dateifehler ist aufgetreten!\n\n"); else { short buffer; short center = 50, window = 100; long offset; PAINTSTRUCT ps; HDC hdc; int i,j,value; offset = (512*512+7)*sizeof(short); fseek(input,-offset,SEEK_END); hdc=BeginPaint(hWnd, &ps); for(i=0;i<512;i++) { for(j=0;j<512;j++) { fread(&buffer, sizeof(short), 1, input); if(buffer-1024<center-window) value = 0; else if(buffer-1024>center+window) value = 255; else value = (short)((buffer-1024-(center-window))*255/2/window); SetPixel(hdc,j,i,RGB(value,value,value)); } } EndPaint(hWnd, &ps); fclose(input); } }
lg Zermy
-
Du hast szTitle zweimal definiert. Einmal als TCHAR und einmal als char.
Evtl. solltest Du Dich erstmal klug machen ob Du Dein Programm in MBCS (char), Unicode (wchar_t), oder allgemein vopr beides schreiben willst (TCHAR).
-
Ich muss mich dann wohl entscheiden. TCHAR solls sein aber das gabe es bei VS 2006 noch nicht oder ich hab es übersehen. Weiß grade nicht wie ich damit umgehen soll.
-
KJlar gibt es TCHAR. Wenn Du auch tchar.h includest.
Seitdem es Unicode mit Windows NT 3.1 gibt gibt es auch TCHAR
-
das heißt das ist irgendein struct xD und wie gebe ich da den namen ein? Dann muss ich mein szTitel ja nur ersetzen oder? Sry API ist noch net so mein Ding, allgemein C hakt noch an allen Ecken!
-
nein schau dir mal die definition von TCHAR an dann sieht ma folgendes:
typedef WCHAR TCHAR, *PTCHAR;
und die definition von WCHAR:
typedef wchar_t WCHAR;das heißt das TCHAR genau das gleiche ist wie wchar_t!
um sich die definition von etwas anzuschauen einfach auf das Wort rechtsklichen und "Gehe zu Definition" auswählen
Zum unterschied von wchar_t und char:
char hat 8 bits also 1Byte
wchar_t hat 16 bits also 2 Bytes (glaube ich) kann also mehr Schriftzeichen (Chinesisch usw.) definieren.wchar_t *meine_zeichenkette = L"meine zeichenkette";
das L zeigt Unicode an!
-
Hey danke für die Antworten,
noch hab ich das für mein Beispiel nicht hinbekommen... aber ich muss das ja auch noch lernen xD
-
floorball schrieb:
das heißt das TCHAR genau das gleiche ist wie wchar_t!
Nur, wenn UNICODE definiert ist! Anderenfalls entspricht TCHAR char.
-
Titel fehlt noch
-
Heyho,
hab mich mal bissel eingefuchst! Ein Problem hab ich noch,
wie bekomme ich diese Zeile in den Titel.
case WM_LBUTTONDOWN: { int x = LOWORD(lParam); int y = HIWORD(lParam); //-------->(WinClassName,"%s x=%d y=%d Wert=%d",title,x,y,matrix[x][y]); SetWindowText(hWnd,WinClassName); break; }
Um den Titel allgemein zu ändern hab ich const TCHAR* WinClassName = _T("CT-Viewer"); eingefügt.
Nur wie ich das jetzt anstellen muss damit die ganzen Werte dort angezeigt werden ferstehe ich noch nicht!
Wäre über Hilfe sehr dankbar!
lg Zermy