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


  • Mod

    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.


  • Mod

    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


Anmelden zum Antworten