Posts written by Saffo´

  1. .
    · Nome Script: HiButton
    · Descrizione: Benvenuto automatico ai nuovi utenti sul tuo forum.
    · Autore: Saffo´
    · Demo Live: Click

    Questo script aggiunge a tutti i topic della propria sezione di presentazioni un pulsante che permette agli utenti di salutare in modo automatico il nuovo arrivato con messaggi predefiniti.


    Informazioni

    Lo script è completamente personalizzabile, oltre che tramite il codice, tramite i seguenti id:
    - #hiButton per il pulsante
    - #loader_hiButton per la barra di caricamento




    Installazione


    · Compatibilità: Nuovo Layout/Vecchio Layout
    Inserire in Amministrazione>Grafica>Codice HTML in fondo al forum se non già presente
    CODICE
    <script type="text/javascript" src="http://scripts.ffmagazine.net/saffo/library.js"></script>


    Inserire in Amministrazione>Grafica>Codice HTML in cima alla sezione (selezionare la sezione "Benvenuto" o similia, avendo cura di togliere il segno di spunta da "Nascondi nelle discussioni")
    CODICE
    <script type="text/javascript">
    var messages = new Array(
           "Bevenuto sul forum!",
           "Benvenuto!",
           "Welcome!"
    );
    hiButton = {
    active : true,
    image : "http://dumpshare.net/images/4171638chat.png",
    bMessage : "Dai Benvenuto",
    f : "8586647",
    message : messages,  // NON TOCCARE
    done : "Messaggio inviato correttamente!",
    error : "Errore durante l'invio del messaggio!"
    };
    </script>

    active (true/false) determina se lo script è attivo o meno
    image è il link all'immagine da usare nel bottone
    bMessage è il testo del bottone
    f è l'id della sezione nel quale è attivo lo script (esempio: in http://dominio.forumfree.net/?f=8586647 l'id è 8586647)
    done è il messaggio da dare a messaggio inviato (il testo "Ricarica la Pagina" compare automaticamente)
    fail è il messaggio da dare nel caso il messaggio non potesse essere inviato (il testo "Ricarica la Pagina" compare automaticamente)

    Modificando l'array messages potrete inserire più di un messaggio predefinito; ogni messaggio è da inserire fra le virgolette "così" e separato dagli altri con una virgola.




    Altri Usi

    Questo script, opportunamente modificato, può avere anche altri usi: ad esempio, può essere usato come bottone che, oltre al benvenuto, inserisce anche un messaggio predefinito dallo staff.
    Si deve dunque modificare il codice in questo modo:
    CODICE
    <script type="text/javascript">
    if (document.compatMode == "CSS1Compat") {staff=document.querySelector('.menuwrap .left .menu:nth-child(4) > a[href*="?cid="]'); } else {staff=document.querySelector('#left .menu:nth-child(4) > a[href*="?cid="]');}
    if(staff) {
    var messages = new Array(
           "Bevenuto sul forum da parte di tutto lo staff! Ti consiglio di leggere il regolamento <a href='?t=xxxxx'>qui</a>!",
    );
    hiButton = {
    active : true,
    image : "http://dumpshare.net/images/4171638chat.png",
    bMessage : "Invia Messaggio Benvenuto Staff",
    f : "8586647",
    message : messages,  // NON TOCCARE
    done : "Messaggio inviato correttamente!",
    error : "Errore durante l'invio del messaggio!"
    };
    }
    </script>

    In questo modo il bottone verrà visualizzato solamente se l'utente è uno staffer :) Grazie a Yuffie per il suggerimento.




    HiButton realizzato da Saffo´
    Guida rilasciata sotto una Licenza Creative Commons 3.0.


  2. .

    FastNotification v2.0
    6535638Cattura
    Il tuo forum è pieno di topic caldi, dove arriva una nuova risposta ogni cinque secondi? Eccoti sfornata la soluzione, uno script che ti consente di caricare le nuove risposte senza dover aggiornare la pagina.
    [ANTEPRIMA]



    Questo script carica le nuove risposte di un topic senza che venga aggiornata la pagina, alla pressione del comodo pulsante posto vicino a "Invia la Risposta"; comodo per i topics "caldi" in cui arrivano risposte molto velocemente.

    Installazione

    Inserire questo codice in Amministrazione>Grafica>Codice HTML in fondo a tutte le pagine se non già presente:
    CODICE
    <script type="text/javascript" src="http://scripts.ffmagazine.net/saffo/library.js"></script>


    Inserite questo codice in Amministrazione>Grafica>Codice HTML in cima a tutte le pagine:
    CODICE
    <script type="text/javascript">fastNotification = {
    active:true // Modificare in false se si vuole disattivare lo script
    };</script>


    Informazioni
    Lo script non funziona nei topic delle sezioni protette, per ovvi motivi di sicurezza Lo script ora funziona anche nelle sezioni protette grazie ai nuovi sistemi di autenticazione.
    Non compatibile con il vecchio layout: si vedrà se utile estendere la compatibilità

    Questo script andrà a sostituire questo.
    Lo script carica i messaggi contenuti nelle API, che si aggiornano ogni 2 minuti.


    Credits
    Il ForumFree Magazine non pretende crediti obbligatori con link e banner da inserirsi sul vostro forum. Tuttavia, dal momento che il codice ha richiesto uno sforzo non indifferente, chiunque volesse inserirli può trovarli qui di seguito (è fatto invece severo divieto di rimuovere i crediti presenti nel codice):
    HTML
    <a href="http://ffmagazine.forumfree.it/?t=67048204">FastNotification</a> creato da <a href="http://ffmagazine.forumfree.it/?act=Profile&MID=5949881">Saffo&#180;</a>


    E' possibile, come indicato nei termini di utilizzo, ridistribuire questa guida sui vostri forum lasciandone inalterati integrità e contenuti/crediti ed inserendo il seguente codice in fondo al messaggio:
    HTML
    <div class="textinput" style="margin:1px;padding:4px;display:block;text-align:center"><a title="FastNotification" href="http://ffmagazine.forumfree.it/?t=66947246"><b>FastNotification</b></a>
    Realizzata da <a href="http://ffmagazine.forumfree.it/?act=Profile&MID=5949881">Saffo&#180;</a> del <a title="Forumfree Magazine - Stai al passo con Forumfree!" href="http://ffmagazine.forumfree.it/"><b>ForumFree Magazine</b></a>.
    Guida rilasciata sotto una <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/3.0/">Licenza Creative Commons 3.0</a>.</div>

    FastNotification
    Realizzata da Saffo´ del ForumFree Magazine.
    Guida rilasciata sotto una Licenza Creative Commons 3.0.


    Edited by Saffo´ - 26/9/2013, 17:20
  3. .
    Grazie :)
  4. .

    Default Avatar



    Con questo codice sarà possibile inserire un avatar nei topic e nel profilo degli utenti che non ce l'hanno. Questo script torna utile nei layouts nei quali la mancanza dell'avatar causerebbe problemi

    Installazione

    Inserire in Amministrazione>Grafica>Codice HTML in cima al forum
    CODICE
    <script type="text/javascript">
    dfAvatar = { active : true,
    avatar : "http://dumpshare.net/images/1928573default-avatar.jpg"
    };
    </script>
    <script type="text/javascript" src="http://scripts.ffmagazine.net/saffo/library.js"></script>

    Sostituire il valore di "avatar" con l'avatar che volete inserire

    Credits
    Il ForumFree Magazine non pretende crediti obbligatori con link e banner da inserirsi sul vostro forum. Tuttavia, dal momento che il codice ha richiesto uno sforzo non indifferente, chiunque volesse inserirli può trovarli qui di seguito (è fatto invece severo divieto di rimuovere i crediti presenti nel codice):
    HTML
    <a href="http://ffmagazine.forumfree.it/?t=66971426">DefaultAvatar</a> creato da <a href="http://ffmagazine.forumfree.it/?act=Profile&MID=5949881">Saffo´</a>


    E' possibile, come indicato nei termini di utilizzo, ridistribuire questa guida sui vostri forum lasciandone inalterati integrità e contenuti/crediti ed inserendo il seguente codice in fondo al messaggio:
    HTML
    <div class="textinput" style="margin:1px;padding:4px;display:block;text-align:center"><a title="DefaultAvatar" href="http://ffmagazine.forumfree.it/?t=66971426"><b>DefaultAvatar</b></a>
    Realizzata da <a href="http://ffmagazine.forumfree.it/?act=Profile&MID=5949881">Saffo´</a> del <a title="Forumfree Magazine - Stai al passo con Forumfree!" href="http://ffmagazine.forumfree.it/"><b>ForumFree Magazine</b></a>.
    Guida rilasciata sotto una <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/3.0/">Licenza Creative Commons 3.0</a>.</div>

    DefaultAvatar
    Realizzata da Saffo´ del ForumFree Magazine.
    Guida rilasciata sotto una Licenza Creative Commons 3.0.


    Edited by Saffo´ - 25/9/2013, 19:08
  5. .
    Certamente :))
  6. .
    Nome programma: iCodiceFiscale
    Linguaggio di programmazione: C#
    Versione: 1.0b
    Descrizione: il programma permette di calcolare il codice fiscale inserendo i dati opportuni. I comuni d'Italia e le relative province sono prese dal database allegato.
    Data di pubblicazione: 16/05/2013
    Licenza: Freeware
    Download: Mediafire
    Screenshot:
    Altro:
    Requisiti Minimi:
    .NET 4.0 e OLEDB x86
  7. .
    Nome programma: Simple HTML Editor
    Linguaggio di programmazione: C++
    Versione: 0.1a
    Descrizione: piccolo editor html con browser preview webkit e possibilità di navigare in internet.
    Data di pubblicazione: 27/03/2013
    Licenza: Open Source
    Download: QUI
    Screenshot:
    Source:
  8. .
    "Cosa? Saffo crea un altro notepad? Ma basta con 'sti notepad eh, io voglio conquistare il mondo!" (Tipica frase dell'informatico medio che accede a questo topic)

    Fatta la premessa (e che premessa), in questo tutorial vorrei vedere con voi come creare un simpatico notepad sfruttando la libreria Qt (qt.digia.com) e utilizzando il nuovo stile Fusion (per chi non è pratico di QT, dico velocemente che prima erano disponibili molti più stili, ora unificati sotto Fusion).
    Per prima cosa, creiamo un nuovo progetto QApplication, che io chiamerò GFN (ovvero "Good for Nothing", "Buono a nulla" :asd:) e definiamo la struttura del software, facendo doppio click su mainwindow.ui e accedendo così al designer. Per semplicità, vi posto direttamente il codice XML del form, a voi basta clikkare su edit per poterlo modificare:

    CODICE
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
    <class>MainWindow</class>
    <widget class="QMainWindow" name="MainWindow">
     <property name="geometry">
      <rect>
       <x>0</x>
       <y>0</y>
       <width>400</width>
       <height>300</height>
      </rect>
     </property>
     <property name="windowTitle">
      <string>Good For Nothing</string>
     </property>
     <property name="windowIcon">
      <iconset>
       <normaloff>icon.ico</normaloff>icon.ico</iconset>
     </property>
     <property name="styleSheet">
      <string notr="true"/>
     </property>
     <widget class="QWidget" name="centralWidget">
      <widget class="QTextEdit" name="textEdit">
       <property name="geometry">
        <rect>
         <x>10</x>
         <y>10</y>
         <width>381</width>
         <height>261</height>
        </rect>
       </property>
      </widget>
     </widget>
     <widget class="QMenuBar" name="menuBar">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>400</width>
        <height>21</height>
       </rect>
      </property>
      <widget class="QMenu" name="menu_File">
       <property name="title">
        <string>&amp;File</string>
       </property>
       <addaction name="actionProcessa"/>
       <addaction name="actionSalva"/>
       <addaction name="separator"/>
       <addaction name="actionEsci"/>
      </widget>
      <widget class="QMenu" name="menu">
       <property name="title">
        <string>&amp;?</string>
       </property>
       <addaction name="actionAbout"/>
      </widget>
      <addaction name="menu_File"/>
      <addaction name="menu"/>
     </widget>
     <action name="actionProcessa">
      <property name="text">
       <string>Apri...</string>
      </property>
     </action>
     <action name="actionEsci">
      <property name="text">
       <string>Esci</string>
      </property>
     </action>
     <action name="actionAbout">
      <property name="text">
       <string>About</string>
      </property>
     </action>
     <action name="actionSalva">
      <property name="text">
       <string>Salva...</string>
      </property>
     </action>
    </widget>
    <layoutdefault spacing="6" margin="11"/>
    <resources/>
    <connections/>
    </ui>

    In poche parole, un semplice form principale con una TextEdit al centro e 4 pulsanti sulla barra (Apri, Salva, Esci, About). Facendo click con il destro sugli events di tali pulsanti, è possibile collegare i loro segnali trigged con del codice, in questo modo:

    e facendo doppio click su "trigged()". Possiamo quindi aggiungere ad ogni tasto il suo codice:
    CODICE
    void MainWindow::on_actionEsci_triggered()
    {
       qApp->quit();
    }

    void MainWindow::on_actionAbout_triggered()
    {
       QMessageBox::about(this, tr("About"), tr("Creato da Saffo, Copyright 2013."));
    }

    void MainWindow::on_actionProcessa_triggered()
    {
       QString fileName = QFileDialog::getOpenFileName(this, tr("Apri un file"), QString(), tr("File di testo (*.txt);; Tutti i files (*.*)"));
       if(!fileName.isEmpty()) {
           QFile file(fileName);
           if(!file.open(QIODevice::ReadOnly)) {
               QMessageBox::critical(this, tr("Errore"), tr("Impossibile aprire il file"));
               return;
           }
           QTextStream in(&file);
           ui->textEdit->setText(in.readAll());
           file.close();
       }
    }

    void MainWindow::on_actionSalva_triggered()
    {
       QString fileName = QFileDialog::getSaveFileName(this, tr("Salva con nome"), QString(), tr("File di testo (*.txt);; Tutti i files (*.*)"));
       if(!fileName.isEmpty()) {
           QFile file(fileName);
           if(!file.open(QIODevice::WriteOnly)) {
               QMessageBox::critical(this, tr("Errore"), tr("Impossibile salvare il file"));
               return;
           }
           QTextStream in(&file);
           in << ui->textEdit->toPlainText();
           in.flush();
           file.close();
       }
    }

    (Vi consiglio di pensarci due volte prima di fare copia&incolla: se non fate tutte le volte l'operazione sopra descritta il programma non funzionerà ;) ) (ricordatevi di includere QFile, QFileDialog, QMessageBox, QTextStream)

    Il programma è ora perfettamente funzionante, ma noi vogliamo aggiungervi un tocco di stile; iniziamo impedendo all'utente di poter ingrandire la finestra modificando il MainWindow:
    CODICE
    ui->setupUi(this);
       Qt::WindowFlags flags;
       flags = Qt::Window | Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint;
       setWindowFlags( flags );

    Possiamo continuare aggiungendo un'icona: inserite un file .ico (icon.ico) nella cartella del progetto e aggiungete un file .rc con il seguente codice:
    CODICE
    IDI_ICON1 ICON DISCARDABLE "icon.ico"

    Nel file .pro, invece, aggiungete la dichiarazione del file di risorse:
    CODICE
    RC_FILE = gfn.rc

    Se compilerete dunque in release mode, al programma verrà aggiunta anche l'icona.

    Infine, come promesso, nel main.cpp aggiungiamo la dichiarazione dello stile fusion, semplicemente aggiungendo:
    CODICE
    QApplication::setStyle("fusion");


    Il risultato finale è


    Sulla base di questo, potrete allenarvi aggiungendo due semplicissime funzioni:

    • Fare in modo che appaia il nome del file aperto/salvato nella barra del titolo

    • Creare un'opzione "Nuovo" nel menu (che resetta anche il titolo)

  9. .
    Oggi mi sono divertito a creare un codice che ripetesse una stringa nello stile Matrix. Ho usato C++ ma ho riscritto lo stesso codice anche in C (sì, oggi avevo tempo da buttare xD)

    Ma veniamo al codice...

    CODICE
    #include <iostream>
    #include <stdlib.h>

    using namespace std;

    int main(int argc, char *argv[])
    {
    string rpString = "011010"; // Stringa da ripetere
    int k = 1;
    int rp = 2000; // Numero di ripetizioni
    system ("color 0a");
    while ( k != rp ) {
    k += 1;
    cout << rpString << " ";
    _sleep (5);
    }
    system("CLS");
    system("PAUSE");
    return 0;
    }


    oppure in C
    CODICE
    #include <stdio.h>

    int main()
    {
    char* rpString = "011010"; // Stringa da ripetere
    int k = 1;
    int rp = 2000; // Numero di ripetizioni
    system ("color 0a");
    while ( k != rp ) {
    k += 1;
    printf("%­s ", rpString);
    _sleep (5);
    }
    system("CLS");
    system("PAUSE");
    return 0;
    }
  10. .

    Nome programma: PassGuard DB 1.0
    Linguaggio di programmazione: VB.NET
    Versione: 1.0
    Descrizione: piccolo programma per gestire le proprie password inserendole in un database locale. Il programma funziona con una chiave AES. Include un Crypter/Decrypter AES basato sul programma, scaricabile qui
    Data di pubblicazione: 11/03/2013
    Licenza: GNU
    Download: Click
    Screenshot:
    (Basato in mima parte su Pass Guard di Matteo Lancia)
  11. .
    In questo tutorial vedremo come creare un Notepad scrivendolo totalmente in C, utilizzando le Graph API del sistema (windows.h). Come IDE, per mera comodità, io utilizzerò Visual Studio settato per lavorare in C (dopo aver creato un nuovo progetto Win32 per C++, andate sulle proprietà del suddetto andate in C/C++>Advanced>Compile As e mettete C).

    Eliminate pure il primo file creato e inserite il vostro main.c (o come preferite chiamarlo).
    Dobbiamo in primis importare le librerie che ci serviranno e scrivere il main:
    CODICE
    #include <windows.h>
    #include <commctrl.h>

    const char g_szClassName[] = "noteClass";

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
           LPSTR lpCmdLine, int nCmdShow)
    {
           WNDCLASSEX wc;
           HWND hwnd;
           MSG Msg;

           InitCommonControls();

           wc.cbSize                 = sizeof(WNDCLASSEX);
           wc.style                 = 0;
           wc.lpfnWndProc         = WndProc;
           wc.cbClsExtra         = 0;
           wc.cbWndExtra         = 0;
           wc.hInstance         = hInstance;
           wc.hIcon                 = LoadIcon(NULL, 0);
           wc.hCursor                 = LoadCursor(NULL, IDC_ARROW);
           wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
           wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MAINMENU);
           wc.lpszClassName = g_szClassName;
           wc.hIconSm                 = LoadIcon(NULL, 0);

           if(!RegisterClassEx(&wc))
           {
                   MessageBox(NULL, "Impossibile avviare il programma", "Errore!",
                           MB_ICONEXCLAMATION | MB_OK);
                   return 0;
           }

           hwnd = CreateWindowEx(
                   0,
                   g_szClassName,
                   "Saffo's Notepad",
                   WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
                   CW_USEDEFAULT, CW_USEDEFAULT, 480, 320,
                   NULL, NULL, hInstance, NULL);

           if(hwnd == NULL)
           {
                   MessageBox(NULL, "Impossibile avviare il programma", "Errore!",
                           MB_ICONEXCLAMATION | MB_OK);
                   return 0;
           }

           ShowWindow(hwnd, nCmdShow);
           UpdateWindow(hwnd);

           while(GetMessage(&Msg, NULL, 0, 0) > 0)
           {
                   TranslateMessage(&Msg);
                   DispatchMessage(&Msg);
           }
           return Msg.wParam;
    }

    (Ho messo il codice sotto spoiler di modo che i neofiti di C prendessero un coccolone, perdonate la crudeltà gratuita)
    What a terrible code? Sicuramente c'è molto da spiegare: le prime due librerie, ci consentono di interagire con la parte grafica del sistema, mentre la nuova dicitura per il main ci fa comprendere che ci troviamo in un ambiente grafico e non sulla console. Per i nostri scopi, vi spiego solamente l'argomento "hInstance", ovvero il nostro programma stesso.

    Per prima cosa, creiamo tre variabili:
    CODICE
    WNDCLASSEX wc;
           HWND hwnd;
           MSG Msg;

    La prima è la nostra finestra, la classe che la definisce, il secondo è il HWND, che serve per "registrarla sul sistema" e il MSG potete intenderlo come una sorta di event listener che vi spiego dopo.

    CODICE
    wc.cbSize                 = sizeof(WNDCLASSEX);
           wc.style                 = 0;
           wc.lpfnWndProc         = WndProc;
           wc.cbClsExtra         = 0;
           wc.cbWndExtra         = 0;
           wc.hInstance         = hInstance;
           wc.hIcon                 = LoadIcon(NULL, 0);
           wc.hCursor                 = LoadCursor(NULL, IDC_ARROW);
           wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
           wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MAINMENU);
           wc.lpszClassName = g_szClassName;
           wc.hIconSm                 = LoadIcon(NULL, 0);

    Questa è la parte che definisce la nostra finestra base: cbSize indica la grandezza in memoria dell'istanza, lpfnWndProc è il listener per gli eventi, hIcon e hIconSmall sono le due icone del programma, hCursor è il cursore da visualizzare, hbrBackground è il colore di sfondo, lpszMenuName è il nome del menu nelle resource (che vedremo dopo, lasciatelo così), lpszClassName è il nome della classe del programma, che si trova nella variabile precedentemente dichiarata.

    Fatto ciò possiamo registrare la finestra e inviare un errore in caso di non riuscita
    CODICE
    if(!RegisterClassEx(&wc))
           {
                   MessageBox(NULL, "Impossibile avviare il programma", "Errore!",
                           MB_ICONEXCLAMATION | MB_OK);
                   return 0;
           }


    Ora possiamo, appunto, creare la finestra
    CODICE
    hwnd = CreateWindowEx(
                   0,
                   g_szClassName,
                   "Saffo's Notepad",
                   WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
                   CW_USEDEFAULT, CW_USEDEFAULT, 480, 320,
                   NULL, NULL, hInstance, NULL);

           if(hwnd == NULL)
           {
                   MessageBox(NULL, "Impossibile avviare il programma", "Errore!",
                           MB_ICONEXCLAMATION | MB_OK);
                   return 0;
           }
    ShowWindow(hwnd, nCmdShow);
           UpdateWindow(hwnd);

    480 e 320 sono le dimensioni, "Saffo's Notepad" è il titolo. ShowWindow mostra la finestra e UpdateWindow ne esegue il refresh per assicurarsi l'avvenuta apertura.

    CODICE
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
           {
                   TranslateMessage(&Msg);
                   DispatchMessage(&Msg);
           }
           return Msg.wParam;

    Con questo while infinito, chiediamo ogni volta al listener quali eventi si stanno verificando. GetMessage, se non si verifica nulla, si blocca, finché non arrivano eventi. Ci sono miriadi di eventi, ma molti, per nostra fortuna, sono gestiti dal computer e ora vedremo come.

    La nuova funzione che andiamo ad aggiungere, appunto, è quella per gestire gli eventi, WndProc:
    CODICE
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
           switch(msg)
           {
                   case WM_CREATE:
                   {
                           HFONT hfDefault;
                           HWND hEdit;

                           HWND hTool;
                           TBBUTTON tbb[3];
                           TBADDBITMAP tbab;

                           HWND hStatus;
                           int statwidths[] = {100, -1};

                           hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "",
                                   WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,
                                   0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_EDIT, GetModuleHandle(NULL), NULL);
                           if(hEdit == NULL)
                                   MessageBox(hwnd, "Impossibile avviare il programma!", "Errore", MB_OK | MB_ICONERROR);

                           hfDefault = GetStockObject(DEFAULT_GUI_FONT);
                           SendMessage(hEdit, WM_SETFONT, (WPARAM)hfDefault, MAKELPARAM(FALSE, 0));

                           hTool = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
                                   hwnd, (HMENU)IDC_MAIN_TOOL, GetModuleHandle(NULL), NULL);
                           if(hTool == NULL)
                                   MessageBox(hwnd, "Could not create tool bar.", "Error", MB_OK | MB_ICONERROR);

                           SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
                           
                           tbab.hInst = HINST_COMMCTRL;
                           tbab.nID = IDB_STD_SMALL_COLOR;
                           SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tbab);

                           ZeroMemory(tbb, sizeof(tbb));
                           tbb[0].iBitmap = STD_FILENEW;
                           tbb[0].fsState = TBSTATE_ENABLED;
                           tbb[0].fsStyle = TBSTYLE_BUTTON;
                           tbb[0].idCommand = ID_FILE_NEW;

                           tbb[1].iBitmap = STD_FILEOPEN;
                           tbb[1].fsState = TBSTATE_ENABLED;
                           tbb[1].fsStyle = TBSTYLE_BUTTON;
                           tbb[1].idCommand = ID_FILE_OPEN;

                           tbb[2].iBitmap = STD_FILESAVE;
                           tbb[2].fsState = TBSTATE_ENABLED;
                           tbb[2].fsStyle = TBSTYLE_BUTTON;
                           tbb[2].idCommand = ID_FILE_SAVEAS;

                           SendMessage(hTool, TB_ADDBUTTONS, sizeof(tbb)/sizeof(TBBUTTON), (LPARAM)&tbb);

                           hStatus = CreateWindowEx(0, STATUSCLASSNAME, NULL,
                                   WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0,
                                   hwnd, (HMENU)IDC_MAIN_STATUS, GetModuleHandle(NULL), NULL);

                           SendMessage(hStatus, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths);
                           SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Pronto.");
                   }
                   break;
                   case WM_SIZE:
                   {
                           HWND hTool;
                           RECT rcTool;
                           int iToolHeight;

                           HWND hStatus;
                           RECT rcStatus;
                           int iStatusHeight;

                           HWND hEdit;
                           int iEditHeight;
                           RECT rcClient;

                           hTool = GetDlgItem(hwnd, IDC_MAIN_TOOL);
                           SendMessage(hTool, TB_AUTOSIZE, 0, 0);

                           GetWindowRect(hTool, &rcTool);
                           iToolHeight = rcTool.bottom - rcTool.top;

                           hStatus = GetDlgItem(hwnd, IDC_MAIN_STATUS);
                           SendMessage(hStatus, WM_SIZE, 0, 0);

                           GetWindowRect(hStatus, &rcStatus);
                           iStatusHeight = rcStatus.bottom - rcStatus.top;

                           GetClientRect(hwnd, &rcClient);

                           iEditHeight = rcClient.bottom - iToolHeight - iStatusHeight;

                           hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT);
                           SetWindowPos(hEdit, NULL, 0, iToolHeight, rcClient.right, iEditHeight, SWP_NOZORDER);
                   }
                   break;
                   case WM_CLOSE:
                           DestroyWindow(hwnd);
                   break;
                   case WM_DESTROY:
                           PostQuitMessage(0);
                   break;
                   case WM_COMMAND:
                           switch(LOWORD(wParam))
                           {
                                   case ID_FILE_EXIT:
                                           PostMessage(hwnd, WM_CLOSE, 0, 0);
                                   break;
                                   case ID_FILE_NEW:
                                           SetDlgItemText(hwnd, IDC_MAIN_EDIT, "");
                                   break;
                                   case ID_FILE_OPEN:
                                           DoFileOpen(hwnd);
                                   break;
                                   case ID_FILE_SAVEAS:
                                           DoFileSave(hwnd);
                                   break;
                                   case ID_INFO_ABOUT:
                                           MessageBox(NULL, "Creato da Saffo\r\nCopyright 2013", "About", MB_OK | MB_ICONINFORMATION);
                                   break;
                           }
                   break;
                   default:
                           return DefWindowProc(hwnd, msg, wParam, lParam);
           }
           return 0;
    }

    Eseguendo uno switch su msg, possiamo sapere che tipo di evento si sta verificando e in tal caso gestirlo.
    WM_CREATE è l'evento dell'avvio della finestra, infatti creiamo tutti i controlli.
    WM_SIZE si verifica se viene ridimensionata la finestra, in tal caso tutti gli elementi subiranno un ridimensionamento.
    WM_CLOSE e DESTROY sono di default per chiudere correttamente la finestra mentre WM_COMMAND gestisce gli eventi generati da un pulsante, inviato come wParam. Tutti i nomi che vedete andremo poi ad aggiungerli nei file resource.

    Abbiamo visto che noi gestiamo ben pochi eventi, ma chi gestisce, ad esempio, il mouse che si sposta sul programma? O il fatto che la finestra venga ridimensionata o ridotta ad icona? Per fortuna c'è DefWindowProc() che lo fa per noi ^.^

    Ok, per ora possiamo lasciare da parte questo file e passare alle resource, ovvero la definizione dei menu e dei pulsanti. Creiamo un nuovo file di risorse .rc (nomeprogramma.rc) dove inseriremo questo codice:
    CODICE
    #include "resource.h"

    IDR_MAINMENU MENU DISCARDABLE
    BEGIN
       POPUP "&File"
       BEGIN
           MENUITEM "&Nuovo",                        ID_FILE_NEW
           MENUITEM "&Apri...",                                        ID_FILE_OPEN
           MENUITEM "Salva Come...",                 ID_FILE_SAVEAS
           MENUITEM SEPARATOR
           MENUITEM "Esci",                       ID_FILE_EXIT
       END
           POPUP "&?"
           BEGIN
                   MENUITEM "About" ID_INFO_ABOUT
           END
    END

    Il codice non è molto complesso e infatti si vede che stiamo creando vari menu (File e About) con dei sottomenu. Al posto di "Begin" e "End" potete sostituire benissimo { e }.
    Il nome che viene dopo la dichiarazione dell'item è il nome della risorsa da usare nel programma.
    Avrete notato anche un'inclusione di resource.h: create quel file, che conterrà l'assegnazione degli id ai vari elementi:
    CODICE
    #define IDR_MAINMENU                    102
    #define ID_FILE_EXIT                    40001
    #define ID_FILE_OPEN                    40002
    #define ID_FILE_SAVEAS                  40003
    #define ID_FILE_NEW                     40004
    #define ID_INFO_ABOUT                                        40007

    Gli id possono essere qualsiasi, ma è bene dividerli con delle categorie di numeri (per me, gli 10x sono i principali, 4000x sono gli items del menu)

    Potete salvare tutto e riaprire il vostro file main.c: dobbiamo inserire le funzioni già citate per il salvataggio e l'apertura!
    CODICE
    BOOL LoadTextFileToEdit(HWND hEdit, LPCTSTR pszFileName)
    {
           HANDLE hFile;
           BOOL bSuccess = FALSE;

           hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
                   OPEN_EXISTING, 0, NULL);
           if(hFile != INVALID_HANDLE_VALUE)
           {
                   DWORD dwFileSize;

                   dwFileSize = GetFileSize(hFile, NULL);
                   if(dwFileSize != 0xFFFFFFFF)
                   {
                           LPSTR pszFileText;

                           pszFileText = GlobalAlloc(GPTR, dwFileSize + 1);
                           if(pszFileText != NULL)
                           {
                                   DWORD dwRead;

                                   if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))
                                   {
                                           pszFileText[dwFileSize] = 0; // Add null terminator
                                           if(SetWindowText(hEdit, pszFileText))
                                                   bSuccess = TRUE; // It worked!
                                   }
                                   GlobalFree(pszFileText);
                           }
                   }
                   CloseHandle(hFile);
           }
           return bSuccess;
    }

    BOOL SaveTextFileFromEdit(HWND hEdit, LPCTSTR pszFileName)
    {
           HANDLE hFile;
           BOOL bSuccess = FALSE;

           hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, NULL,
                   CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
           if(hFile != INVALID_HANDLE_VALUE)
           {
                   DWORD dwTextLength;

                   dwTextLength = GetWindowTextLength(hEdit);
                   // No need to bother if there's no text.
                   if(dwTextLength > 0)
                   {
                           LPSTR pszText;
                           DWORD dwBufferSize = dwTextLength + 1;

                           pszText = GlobalAlloc(GPTR, dwBufferSize);
                           if(pszText != NULL)
                           {
                                   if(GetWindowText(hEdit, pszText, dwBufferSize))
                                   {
                                           DWORD dwWritten;

                                           if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
                                                   bSuccess = TRUE;
                                   }
                                   GlobalFree(pszText);
                           }
                   }
                   CloseHandle(hFile);
           }
           return bSuccess;
    }

    E poi le due funzioni che apriranno i fileDialog:
    CODICE
    void DoFileOpen(HWND hwnd)
    {
           OPENFILENAME ofn;
           char szFileName[MAX_PATH] = "";

           ZeroMemory(&ofn, sizeof(ofn));

           ofn.lStructSize = sizeof(ofn);
           ofn.hwndOwner = hwnd;
           ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
           ofn.lpstrFile = szFileName;
           ofn.nMaxFile = MAX_PATH;
           ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
           ofn.lpstrDefExt = "txt";

           if(GetOpenFileName(&ofn))
           {
                   HWND hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT);
                   if(LoadTextFileToEdit(hEdit, szFileName))
                   {
                           SendDlgItemMessage(hwnd, IDC_MAIN_STATUS, SB_SETTEXT, 0, (LPARAM)"Opened...");
                           SendDlgItemMessage(hwnd, IDC_MAIN_STATUS, SB_SETTEXT, 1, (LPARAM)szFileName);
                   }
           }
    }

    void DoFileSave(HWND hwnd)
    {
           OPENFILENAME ofn;
           char szFileName[MAX_PATH] = "";

           ZeroMemory(&ofn, sizeof(ofn));

           ofn.lStructSize = sizeof(ofn);
           ofn.hwndOwner = hwnd;
           ofn.lpstrFilter = "File di Testo (*.txt)\0*.txt\0Tutti i files (*.*)\0*.*\0";
           ofn.lpstrFile = szFileName;
           ofn.nMaxFile = MAX_PATH;
           ofn.lpstrDefExt = "txt";
           ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;

           if(GetSaveFileName(&ofn))
           {
                   HWND hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT);
                   if(SaveTextFileFromEdit(hEdit, szFileName))
                   {
                           SendDlgItemMessage(hwnd, IDC_MAIN_STATUS, SB_SETTEXT, 0, (LPARAM)"Salvato...");
                           SendDlgItemMessage(hwnd, IDC_MAIN_STATUS, SB_SETTEXT, 1, (LPARAM)szFileName);
                   }
           }
    }


    Aggiungete ora alle inclusioni anche resource.h, il codice assomiglierà a questo:
    saffo_notepad.c
    NB: io ho aggiunto anche l'icona.

    Finalmente potete compilare e avviare il vostro progetto e vederlo funzionare. Ho calcolato che per fare una cavolata del genere sono richieste ~315 righe di codice... Immaginate per fare altro...

    Non vi ho descritto tutte le parti del codice, solo quelle salienti ed importanti, presumendo che voi abbiate già una base di developing in C e magari anche con le API di Windows.

    Grazie a tutti per la lettura ^.^

    PS: Download Archivio
  12. .
    Vediamo insieme come creare un semplicissimo Crypter che codifica un file eseguendo operazioni matematiche. Il tutto sarà molto semplice e non costituirà un vero e proprio algoritmo.

    Iniziamo con le funzioni di base: il nostro programma dovrà leggere i dati da un file e inviare ogni singolo carattere alla funzione crypt(), che eseguirà funzioni matematiche, basandosi anche sulla posizione pari/dispari del nostro carattere. Per prima cosa, per trasformare un carattere nel corrispettivo int si usa, anche se pratica sconsigliata:
    CODICE
    int intCh = char ch - '0';

    ove ch è il nostro carattere. Per prima cosa creiamo il nostro main, che prende dei dati da riga di comando (il nome del file) e legge tutto il contenuto; non commento il codice presupponendo che siate già abbastanza esperti:
    CODICE
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #define false 0
    #define true !false

    /* Per il preprocessore ho messo la definizione di true e false, ove per false si intende 0 e per true qualunque numero diverso da 0 */

    int main(int argc, char *argv[]) {
           printf("##################\n");
           printf("# Saffon Crypter #\n");
           printf("##################\n\n");
           if(argc != 2) {
                   printf("[WARNING] Usage %­s filename\n", argv[0]);
           }
           else {
                   printf("Crypting...\n");
           FILE *file = fopen( argv[1], "r" );
           if ( file == 0 )
           {
               printf( "[WARNING] Unable to open the file!\n" );
           }
           else
           {
               int x;
               FILE *new = fopen("crypted.txt","w");
               while  ( ( x = fgetc( file ) ) != EOF )
               {
                   /* codice per il crypting */
               }
               fclose(file);
               fclose(new);
               printf("\n\a[DONE] Created file crypted.txt.\n");
           }
           }
    }


    Creiamo una funzione di crypting che esegua le quattro operazioni sul nostro carattere
    CODICE
    int even = false;

    int crypt(char ch) {
           int intCh = ch - '0';
           intCh *= 32;
           intCh += intCh - 13;
           if(even == true) {
                   intCh /= 3;
           }
           else {
                   intCh *= 2;
           }
           return abs(intCh);
    }


    e possiamo aggiungere la riga
    CODICE
    fprintf(new, "%d", crypt(x));

    al codice precedente.

    Codice finale:
    CODICE
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #define false 0
    #define true !false

    int even = false;

    int crypt(char ch) {
           int intCh = ch - '0';
           intCh *= 32;
           intCh += intCh - 13;
           if(even == true) {
                   intCh /= 3;
           }
           else {
                   intCh *= 2;
           }
           return abs(intCh);
    }

    int main(int argc, char *argv[]) {
           printf("##################\n");
           printf("# Saffon Crypter #\n");
           printf("##################\n\n");
           if(argc != 2) {
                   printf("[WARNING] Usage %­s filename\n", argv[0]);
           }
           else {
                   printf("Crypting...\n");
           FILE *file = fopen( argv[1], "r" );
           if ( file == 0 )
           {
               printf( "[WARNING] Unable to open the file!\n" );
           }
           else
           {
               int x;
               FILE *new = fopen("crypted.txt","w");
               while  ( ( x = fgetc( file ) ) != EOF )
               {
                   fprintf(new, "%d", crypt(x));
               }
               fclose(file);
               fclose(new);
               printf("\n\a[DONE] Created file crypted.txt.\n");
           }
           }
    }


    I più esperti avranno capito che questo non è assolutamente un algoritmo di criptazione valido: si può intenderlo come una base o uno stimolo a fare di meglio, o come un metodo di offuscamento.

    Quale è ora la sfida? Riuscire a creare un programma che farà l'inverso ^.^
    Nel pacchetto qua sotto troverete, oltre al programma creato, anche due tools con relativo sorgente: ctoi e itoc, appunto per convertire un carattere nel corrispettivo int e poter fare delle prove.

    Download
  13. .
    Nome programma: S# Mini-IDE
    Linguaggio di programmazione: C# (EBNF)
    Versione: 0.0.1
    Descrizione: da un piccolo tutorial online, mi sono "divertito" (fra virgolette perché, fidatevi, è un lavoro mooolto lungo) a creare un linguaggio con poche e semplici funzioni comprensivo di compilatore per .NET
    Data di pubblicazione: penso che non rilascerò mai una versione completa xD
    Licenza: Freeware
    Download: Here
    Screenshot:
    Altro:
    Per provarlo, vorrete sapere almeno come funziona... xD
    Alors, per dichiarare una variabile di qualunque tipo, dovete usare "var nome = valore;" (non basta la firma, dovete assegnare sempre un valore).
    Per leggere un numero, potete usare la funzione "read_int number", del tipo
    CODICE
    var x = 0;
    read_int x;

    Per scrivere a video "print string;" e per i cicli for "for i = 0 to finalCount do stmn end;".
    Ricordandosi sempre il punto e virgola alla fine, possiamo scrivere un programma che implementi tutte le funzioni così:
    CODICE
    print "Quante volte eleggerai Saffo presidente?";
    var times = 0;
    read_int times;
    print times;
    var i = 0;
    for i = 0 to times do
    print "Saffo for President";
    end;

    Il programma lo potete avviare da cmd (per non farlo chiudere dopo aver eseguito tutte le istruzioni) semplicemente digitando nomefile.exe (attenzione! Il programma viene compilato nella directory in cui si trova il mio software!
  14. .
    Un mio vecchio amico (Amnes), ha recentemente cominciato un nuovo progetto qui, sul tema videogames. Il progetto, però, non riesce ad iniziare per mancanza di staff: se siete interessati, lasciate un messaggio qui, o passate anche solo per informarvi sul progetto.

    A presto
  15. .
    Ho completato oggi la realizzazione del primo script su Forumcommunity, ovvero uno slider di news (rss) che utilizza unicamente le animazioni CSS. Trovate un'anteprima qui e lo script qui. Auguro buona giornata a tutti
109 replies since 28/4/2010
.