παπι Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Απο template ειναι. >// test2.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "test2.h" #include <vector> #define MAX_LOADSTRING 100 // Global Variables: HINSTANCE hInst; // current instance TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name std::vector<POINT> points; // Forward declarations of functions included in this code module: 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: Place code here. MSG msg; HACCEL hAccelTable; // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_TEST2, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST2)); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // FUNCTION: MyRegisterClass() // // PURPOSE: Registers the window class. // // COMMENTS: // // This function and its usage are only necessary if you want this code // to be compatible with Win32 systems prior to the 'RegisterClassEx' // function that was added to Windows 95. It is important to call this function // so that the application will get 'well formed' small icons associated // with it. // 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_TEST2)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TEST2); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // FUNCTION: InitInstance(HINSTANCE, int) // // PURPOSE: Saves instance handle and creates main window // // COMMENTS: // // In this function, we save the instance handle in a global variable and // create and display the main program window. // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) // // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // // 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); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: 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: Add any drawing code here... //ena tetragwno etsi gia na blepoyme tis perioxes Rectangle(hdc,0,0,600,600); //to kartaisiano MoveToEx(hdc,300,0,NULL); LineTo(hdc,300,600); MoveToEx(hdc,0,300,NULL); LineTo(hdc,600,300); HGDIOBJ hOld = SelectObject( hdc, CreatePen(PS_SOLID,2,RGB(255,0,0))); POINT p; for(float pi = (3.14*2.0f)* -1.0f ; pi < 3.14f * 2.f; pi += 0.1f) { //f(x) = cos(x) float x = pi; float y = cos(x); //reverse top y -> -y y *= -1.0f; //scale [-2π,2π] -> [-300,300] float f = 300.0f / (2.f * 3.14f); x *= f; y *= f; //transpose top left x,y = 0 -> top-left x,y = 600/2 x += 600.0f /2.0f; y += 600.0f /2.0f; //convert p.x = (long) x; p.y = (long) y; points.push_back(p); } //draw Polyline(hdc,points.data(),points.size()); DeleteObject( SelectObject(hdc,hOld)); EndPaint(hWnd, &ps); } break; case WM_MOUSEMOVE: { static int lastX = GET_X_LPARAM(lParam); if(lastX != GET_X_LPARAM(lParam)) { lastX = GET_X_LPARAM(lParam); } } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Message handler for about box. 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; } Αν το κανω dialog based θα ειναι λιγοτερες απο 50 γραμμες... να και με dialog based >#include <Windows.h> #include <vector> #include "resource.h" BOOL CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI wWinMain(HINSTANCE hInst,HINSTANCE,LPWSTR,int nShow) { return DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,WndProc); } BOOL CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; std::vector<POINT> points; switch(msg) { case WM_PAINT: { hdc = BeginPaint(hWnd,&ps); //ena tetragwno etsi gia na blepoyme tis perioxes Rectangle(hdc,0,0,600,600); //to kartaisiano MoveToEx(hdc,300,0,NULL); LineTo(hdc,300,600); MoveToEx(hdc,0,300,NULL); LineTo(hdc,600,300); HGDIOBJ hOld = SelectObject( hdc, CreatePen(PS_SOLID,2,RGB(255,0,0))); POINT p; for(float pi = (3.14*2.0f)* -1.0f ; pi < 3.14f * 2.f; pi += 0.1f) { //f(x) = cos(x) float x = pi; float y = cos(x); //reverse top y -> -y y *= -1.0f; //scale [-2π,2π] -> [-300,300] float f = 300.0f / (2.f * 3.14f); x *= f; y *= f; //transpose top left x,y = 0 -> top-left x,y = 600/2 x += 600.0f /2.0f; y += 600.0f /2.0f; //convert p.x = (long) x; p.y = (long) y; points.push_back(p); } //draw Polyline(hdc,points.data(),points.size()); DeleteObject( SelectObject(hdc,hOld)); EndPaint(hWnd,&ps); }break; default: return 0; } return 1; }
migf1 Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Ωραία, συνέκρινε τώρα το "Hello World" σε Win32 API: http://msdn.microsoft.com/en-us/library/bb384843.aspx με το "Hello World" σε FLTK: http://www.fltk.org/doc-2.0/html/example1.html
παπι Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Τι να συγκρινω ρε συ mig; Εγω μιλησα για abstraction, και εσυ μου λες για διαφορα vs.. Α ναι, δεν μιλαω γενικα μιλαω για το συγκεκριμενο νημα που κατα τυχη θελει stand alone exe, φυσικα ποσταρα οτι ποστρα επειδη ειδα GL! ΥΓ Αν θες τι γνωμη μου για ολα αυτα τα frameworks.. Μπουρδες. Οπως και τα cross-platform-native-whatever ΜΠΟΥΡΔΕΣ. Απλα πραγματα Windows -> gdi ξερο! Linux-> gtk/gnome ξερο! Mac -> δεν εχω λεφτα ξερο! Cross-Platform -> java ξερο! Ολα αυτα περι του cross-platform-native-whatever μου φερνει στο μυαλο ενα τυπα που πηρε linux με xp thems
migf1 Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Δεν μίλησα καθόλου για vs φίλε παπι, μίλησα και μιλάω για πολύ λιγότερο και πολύ πιο απλό κώδικα που φέρνει το ίδιο αποτέλεσμα. Btw, σε QT... > #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton helloButton("Hello World"); helloButton.resize(80, 20); helloButton.show(); return app.exec(); }
παπι Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Μπα.. κλασικα μιλας με βαση cross-platform. Δεν ειναι η πρωτη φορα
migf1 Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Εγώ φταίω που το GUI programming σε Win32 θέλει 3πλάσιο κώδικα από σχεδόν οποιοδήποτε cross-platform GUI; > #include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_container_add(GTK_CONTAINER(window), gtk_label_new("Hello, world!") ); gtk_widget_show_all(window); gtk_main(); return 0; }
tzouperman Δημοσ. 22 Δεκεμβρίου 2011 Μέλος Δημοσ. 22 Δεκεμβρίου 2011 Για όλα τα παραπάνω που τώρα μόλις διάβασα δεν μπορώ να εκφέρω γνώμη! Το μόνο που είδα και κατάλαβα είναι το μέγεθος τον κωδικών (για fltk,gtk,qt) για να βγάλει το HELLO WORLD!! Έχω κατεβάσει ήδη το Qt creator και έχω τρέξει κάποια demos που περιλαμβάνει και χωρίς να πολυκαταλαβαίνω των κώδικα ψιλοβγάζω άκρη(ή τουλάχιστον έτσι νομίζω)! Το παρακάτω video είναι ένα από τα πολλά που έχω δεί (το πιο απλό μάλλον) και με έβαλε λίγο πολύ στην ιδέα του τι χρειάζομαι!! εδώ Αυτό που δεν έχω καταλάβει είναι ποια η διαφορά του Qt creator από το Qt designer! Όσο για τα GTK και FLTK έτυχε να μην τα κατεβάσω πρώτα οπότε δεν έχω ασχοληθεί και πολύ μαζί τους!Αν πιστεύετε ότι κάποιο από τα τρια είναι πιο εύκολο για κάποιον με τις δικές μου "απειροελάχιστες γνώσεις" πείτε το μου να ξεκινήσω με αυτό! Πάντως το Qt creator πιστεύω ότι είναι ότι πρέπει για την περίπτωσή μου και μου φαίνεται βατό! Τώρα το πόσο θα βρώ δυσκολίες μπροστά μου με το Qt είναι μεγάλο θέμα! Αλλά από κάπου πρέπει να ξεκινήσω!
migf1 Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Εφόσον το βρίσκεις βατό το QT συνέχισε με αυτό (το FLTK είναι πιο απλό, αλλά το FLUID που είναι για σχεδιασμό ui είναι πολύ cryptic... το GTK+ δεν το χρειάζεσαι σε C++). QT Creator είναι το IDE, QT-Designer είναι για σχεδιασμό ui (μέσα στο QT-Creator).
tzouperman Δημοσ. 22 Δεκεμβρίου 2011 Μέλος Δημοσ. 22 Δεκεμβρίου 2011 Εφόσον το βρίσκεις βατό το QT συνέχισε με αυτό (το FLTK είναι πιο απλό, αλλά το FLUID που είναι για σχεδιασμό ui είναι πολύ cryptic... το GTK+ δεν το χρειάζεσαι σε C++). QT Creator είναι το IDE, QT-Designer είναι για σχεδιασμό ui (μέσα στο QT-Creator). Σε ευχαριστώ που μου έλυσες ακόμη μια απορία!! Σας είμαι υπερευγνώμων!!
Directx Δημοσ. 22 Δεκεμβρίου 2011 Δημοσ. 22 Δεκεμβρίου 2011 Μίας και πιάσατε τα GUIs.. Ευτυχώς υπάρχει και ο C++ Builder που παράγει native (WinAPI) κώδικα σε C++, δίχως πολλά - πολλά (εξωτερικές βιβλιοθήκες DLL κλπ): > __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { TButton *btnHello = new TButton(this); btnHello->Parent = this; btnHello->Caption= "Hello!"; btnHello->SetBounds( ClientRect.CenteredRect(btnHello->ClientRect).Left, ClientRect.CenteredRect(btnHello->ClientRect).Top, btnHello->ClientRect.Width(), btnHello->ClientRect.Height()); }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα