Condivisione della tecnologia

"Pratica quotidiana dell'API Windows" 9.1.5 Risorse personalizzate

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Le risorse personalizzate sono un tipo di risorsa utilizzata nei programmi Windows per archiviare dati, immagini, audio, file binari specifici dell'applicazione, ecc. Attraverso risorse personalizzate, gli sviluppatori possono gestire e archiviare centralmente vari file di risorse richiesti dall'applicazione per un facile accesso e utilizzo nel programma.

Ecco alcuni punti chiave sulle risorse personalizzate:

●Tipi di risorse personalizzate:

1. Le risorse personalizzate possono essere qualsiasi dato o file specifico dell'applicazione, come immagini, audio, file di configurazione XML, file di testo, ecc.

2. Le risorse personalizzate possono essere identificate utilizzando un identificatore del tipo di risorsa personalizzato, ad esempio "MY_CUSTOM_RESOURCE".

●Crea e modifica risorse personalizzate:

1. Le risorse personalizzate sono in genere incluse nel file di risorse di un'applicazione (.rc).

2. Le risorse personalizzate possono essere create e modificate utilizzando un editor di risorse, ad esempio Resource View di Visual Studio.

3. Nel file di risorse è possibile specificare un identificatore di risorsa univoco e il percorso del file di risorse corrispondente per ciascuna risorsa.

●Fare riferimento e utilizzare risorse personalizzate:

1. Quando si fa riferimento e si utilizzano risorse personalizzate nel codice, è possibile utilizzare gli identificatori di risorsa per caricare o accedere alle risorse corrispondenti.

2. Utilizza le funzioni API corrispondenti (come LoadResource, FindResource, LockResource e così via) per caricare e gestire risorse personalizzate.

3. A seconda del tipo di risorsa personalizzata, puoi utilizzare diverse funzioni API (ad esempio, le risorse immagine possono utilizzare le funzioni GDI e le risorse audio possono utilizzare le funzioni DirectSound) per elaborare le risorse personalizzate.

■Di seguito è riportato un frammento di codice di esempio che mostra come caricare e utilizzare una risorsa personalizzata:

#includere<Windows.h>

int principale()

{

HINSTANCE hInstance = GetModuleHandle(NULL); // Ottiene l'handle dell'istanza corrente

HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(IDR_MY_RESOURCE), "MY_CUSTOM_RESOURCE" // Trova risorse personalizzate

HGLOBAL hResData = LoadResource(hInstance, hResource); // Carica risorse personalizzate

LPVOID pData = LockResource(hResData); // Blocca le risorse personalizzate

// Usa risorse personalizzate...

restituisci 0;

}

Nell'esempio precedente, IDR_MY_RESOURCE è l'identificatore della risorsa personalizzata e il percorso del file di risorse corrispondente è definito nel file di risorse. Utilizzare la funzione FindResource per trovare la risorsa personalizzata, quindi utilizzare la funzione LoadResource per caricare la risorsa personalizzata e infine utilizzare la funzione LockResource per bloccare la risorsa personalizzata per ottenere un puntatore ai dati della risorsa. Successivamente il puntatore pData potrà essere utilizzato per successive elaborazioni ed operazioni a seconda della tipologia e delle esigenze della risorsa.

È importante notare che il modo in cui viene utilizzata una risorsa personalizzata dipende dal tipo di risorsa e dalle esigenze dell'applicazione. Gli sviluppatori possono scegliere tipi di risorse appropriati e funzioni API corrispondenti per elaborare risorse personalizzate in base alle esigenze effettive.

Le risorse personalizzate forniscono un metodo flessibile di gestione delle risorse per le applicazioni. È possibile gestire in modo uniforme vari dati e file richiesti dall'applicazione e accedervi facilmente e utilizzarli nel programma. Utilizzando risorse personalizzate, puoi rendere la tua applicazione più modulare, gestibile ed estensibile.

       ■nel VSAggiungi risorse personalizzate in

1. Aggiungi risorse

2. Fai clic su "Personalizza" e inserisci il tipo di risorsa "TESTO"

3. Importa risorse e genera automaticamente il file text1.bin, ID risorsa: IDR_TEXT1

4. In VS, immettere direttamente il nome del file di risorse nel compilatore personalizzato e modificare l'ID Viene visualizzato un messaggio di errore: Impossibile caricare risorse esterne: il motivo possibile è che le risorse non sono importate.

5. Aggiungi risorse nella casella di visualizzazione delle risorse.

6. Importare file di risorse esterne.

7. Inserisci nuovamente il nome e l'ID del file di risorsa. Tieni presente che il nome dell'ID deve essere compilato con la stringa tra virgolette "ANNABELLEE".

8. Basta salvare le impostazioni.

 

Esiste un metodo più semplice, modificare direttamente il file di risorse POEPOEM.rc. Basta aggiungere risorse sotto la riga sotto TESTO.

      

9.1.6 Esercizio 57: Tabella delle risorse stringa e risorse personalizzate

/*------------------------------------------------------------------------

057 API WIN32 Esercitati ogni giorno

     Esempio 57 POEPOEM.C: tabella delle risorse stringa e risorse personalizzate

Stringa di carico funzione

Caricare Risorsa funzione

Trovarerisorsa funzione

Blocco Risorsa funzione

AnsiProssimo Definizione macro

(c) www.bcdaren.com Programmatore

-----------------------------------------------------------------------*/

#includerere <windows.h>

#includerere "risorsa.h"

RISULTATO RICHIAMARE Programmazione Wnd (BUON COMPLEANNO, INDIPENDENTE, WPARAM, Parametro) ;

ISTANZA cenni storici ;

internoernoerno WINAPI VincitaMain (ISTANZA hIstanza, ISTANZA hIstanzaPrecedente,

 PSTR szRigaCmd, internoernoerno Mostra iCmd)

{   //Nome del file di risorse, titolo e messaggio di errore

     CARATTERE NomeAppsz[16], szDidascalia[64], Messaggio di errore sz[64];

     BUON COMPLEANNO bello;

     MSG messaggio di testo;

     CLASSE WND classe wnd;

     //Carica risorse stringa

     Stringa di carico(hIstanza, IDS_NOMEAPP, NomeAppsz,

          taglia di(NomeAppsz) / taglia di(CARATTERE));

     Stringa di carico(hIstanza, IDS_DIDASCALIA, szDidascalia,

          taglia di(szDidascalia) / taglia di(CARATTERE));

     classe wnd.stile = CS_HREDRAW | CS_VREDRAW;

     classe wnd.lpfnWndProc = Programmazione Wnd;

     classe wnd.cbClsExtra = 0;

     classe wnd.cbWndExtra = 0;

     classe wnd.hIstanza = hIstanza;

//aggiungi icona

     classe wnd.icona = Carica icona(hIstanza, MAKEINTRESOURCE(IDI_ICON1));

     //wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

//Puntatore del mouse personalizzato

     classe wnd.hCursore = CaricaCursore(hIstanza,MAKEINTRESOURCE(IDC_CURSOR1));

     classe wnd.hbrSfondo = (SPAZZOLA)OttieniOggettoStock(BIANCO_PENNELLO);

     classe wnd.NomeMenu lpsz = NULLOOOOOOOOO;

     classe wnd.NomeClasse lpsz = NomeAppsz;

     //hInst = hIstanza;//Non è nel codice originale e non verrà segnalato alcun errore.

     Se (!RegistratiClasse(&classe wnd))

     {

          //LoadStringA(hInstance, IDS_APPNAME, (char *)szAppName,

          // dimensione(szAppName));

          CaricaStringaA(hIstanza, IDS_ERRMSG, (carattere *)Messaggio di errore sz,

               taglia di(Messaggio di errore sz));

          MessaggioBoxA(NULLOOOOOOOOO, (carattere *)Messaggio di errore sz,

               (carattere *)NomeAppsz,

               MB_ICONERROR);

          ritorno 0;

     }

     bello = CreaFinestra(NomeAppsz, szDidascalia,

          WS_FINESTRA SOVRAPPOSTA | WS_CLIPCHILDREN,

          CW_USEDEFAULT, CW_USEDEFAULT,

          CW_USEDEFAULT, CW_USEDEFAULT,

          NULLOOOOOOOOO, NULLOOOOOOOOO, hIstanza, NULLOOOOOOOOO);

     Mostra finestra(bello, Mostra iCmd);

     Aggiorna finestra(bello);

     Mentre (Ottieni messaggio(&messaggio di testo, NULLOOOOOOOOO, 0, 0))

     {

          TraduciMessaggio(&messaggio di testo);

          Messaggio di spedizione(&messaggio di testo);

     }

     ritorno messaggio di testo.wParametroetroetroetroetro;

}

RISULTATO RICHIAMARE Programmazione Wnd ( BUON COMPLEANNO bello, INDIPENDENTE Messaggio, WPARAM wParametroetroetroetroetro, Parametro

lParametroetroetroetro)

{

     //carattere statico * pText;

     staticoooo LPCSTR pTesto;

     staticoooo HGLOBALE hRisorsa;//Handle di risorsa: un handle che punta a un blocco di memoria

     staticoooo BUON COMPLEANNO hScorrimento;

     staticoooo internoernoerno iPosizione, cxCarattere, CiCarlo, Cliente ciclico,

          iNumLinee, xScorri;

     Il CHD altezza;

     VERNICIATURA ps;

     RETTANGOLO Rettangolo;

     TESTOMETRICO io sono;

     interruttore (Messaggio)

     {

     caso WM_CREARE:

          altezza = OttieniDC(bello);

          OttieniMetricheTesto(altezza, &io sono);

          cxCarattere = io sono.tmAveCharWidth;

          CiCarlo = io sono.tmAltezza + io sono.tmEsternoLeading;

          RilascioDC(bello, altezza);

//La larghezza della barra di scorrimento verticale in pixel

          xScorri = OttieniMetricheDiSistema(SM_CXVSCROLL);

          //Genera barra di scorrimento

          hScorrimento = CreaFinestra(TESTO("barra di scorrimento"), NULLOOOOOOOOO,

               WS_BAMBINO | WS_VISIBILE | SBS_VERT,

               0, 0, 0, 0,

               bello, (HMENU)1, cenni storici, NULLOOOOOOOOO);

          //Ottieni la gestione del testo

          hRisorsa = Caricare Risorsa(cenni storici,

               Trovarerisorsa(cenni storici, TESTO("Annabel Lee"),//Assicurati che abbia il tipo e il nome specificati

La posizione della risorsa nel modulo specificato

                    TESTO("TESTO")));

          //Recupera un puntatore a una risorsa specificata in memoria

          pTesto = (LPCSTR)Blocco Risorsa(hRisorsa);

          iNumLinee = 0;//Leggi il numero di righe di testo

          //Ottieni il numero di righe di testo

          Mentre (*pTesto != '\' && *pTesto != '0')//Termina con o 0

          {

               Se (*pTesto == 'N')

                    iNumLinee++;

                //Restituisce la posizione successiva (puntatore) nella stringa ansi, AnsiNext su Windows a 16 bit

//Una definizione di macro, Win32 utilizza invece CharNext (AnsiNext può gestire solo caratteri ansi

//String; CharNext può essere una stringa ansi o unicode)

                //pText = AnsiNext(pText);

               pTesto = (LPCSTR)CarattereSuccessivo((LPCWSTR)pTesto);

          }

     //*pTesto = '0';//Il codice originale qui afferma che termina con un carattere nullo: il testo vero e proprio non termina con un carattere nullo.

          //Imposta la barra di scorrimento

          Imposta intervallo di scorrimento(hScorrimento, SB_CTL, 0, iNumLinee, FALSO);

          Imposta posizione scorrimento(hScorrimento, SB_CTL, 0, FALSO);

          ritorno 0;

     caso WM_DIMENSIONE:

          Sposta finestra(hScorrimento, ORDINE BASSO(lParametroetroetroetro) - xScorri, 0,

               xScorri, Cliente ciclico = PAROLA CHIAVE(lParametroetroetroetro), VERO);

          ImpostaFocus(bello);//Imposta la messa a fuoco

          ritorno 0;

     caso WM_SETFOCUS:

          ImpostaFocus(hScorrimento);//Cattura il focus del cursore della barra di scorrimento

          ritorno 0;

     caso WM_VSCROLL:

          interruttore (ORDINE BASSO(wParametroetroetroetroetro))  //È necessario aggiungere LOWORD perché il codice di notifica è nella parola bassa

          {

          caso SB_TOP:

               iPosizione = 0;

               rottura;

          caso SB_FONDO:

               iPosizione = iNumLinee;

               rottura;

          caso SB_LINEA:

               iPosizione -= 1;

               rottura;

          caso SB_LINEA GIÙ:

               iPosizione += 1;

               rottura;

          caso SB_PAGEUP:

               iPosizione -= Cliente ciclico / CiCarlo;

               rottura;

          caso SB_PAGEDOWN:

               iPosizione += Cliente ciclico / CiCarlo;

               rottura;

          caso SB_TRACCIA IN POLLICE:

               iPosizione = PAROLA CHIAVE(wParametroetroetroetroetro);

               rottura;

          }

          iPosizione = massimo(0, minimo(iPosizione, iNumLinee));

          Se (iPosizione != Ottieni posizione scorrimento(hScorrimento, SB_CTL))

          {

               Imposta posizione scorrimento(hScorrimento, SB_CTL, iPosizione, VERO);

               InvalidareRettangolo(bello, NULLOOOOOOOOO, VERO);

          }

          ritorno 0;

     caso Vernice WM_PITTURA:

          altezza = IniziaDipingere(bello, &ps);

          pTesto = (carattere *)Blocco Risorsa(hRisorsa);

          OttieniClientRect(bello, &Rettangolo);

          Rettangolo.Sinistra += cxCarattere;//Visualizzazione a partire dalla colonna 2

          Rettangolo.superiore += CiCarlo * (1 - iPosizione);

          // Include l'altezza iniziale della riga esterna del carattere. Normalmente, le intestazioni delle righe esterne non sono incluse nell'altezza di una riga di testo.

          DisegnaTestoA(altezza, pTesto, -1, &Rettangolo, DT_LETTURA ESTERNA);

          Vernice finale(bello, &ps);

          ritorno 0;

     caso WM_DISTRUGGI:

          Risorsa gratuita(hRisorsa);

          Messaggio di PostQuit(0);

          ritorno 0;

     }

     ritorno DefWindowProc(bello, Messaggio, wParametroetroetroetroetro, lParametroetroetroetro);

}

/******************************************************************************

Stringa di carico Funzione: carica una risorsa stringa e quindi copia la stringa in un buffer con un carattere nullo finale,

Oppure restituisce un puntatore di sola lettura alla risorsa stringa stessa.

*******************************************************************************

Caricare Risorsa Funzione: recupera un handle che può essere utilizzato per ottenere un puntatore al primo byte della risorsa specificata in memoria

HGLOBAL Carica Risorsa(

HMODULO hModulo,// Un handle per il modulo il cui eseguibile contiene la risorsa.Se hModule è NULL, il sistema caricherà la risorsa dal modulo utilizzato per creare il processo corrente

Informazioni sulla risoluzione dei problemi HRSRC//Handle della risorsa da caricare

);

*******************************************************************************

Trovarerisorsa Funzione: determina la posizione di una risorsa del tipo e nome specificati nel modulo specificato

HRSRC TrovarisorsaA(

HMODULO hModulo,//Handle del modulo contenente la risorsa

LPCSTR lpName,//nome della risorsa

Tipo di lp LPCSTR//Tipo di risorsa

);

*******************************************************************************

Blocco Risorsa Funzione: recupera un puntatore a una risorsa specificata in memoria

Blocco Risorsa LPVOID (

Dati hResHGLOBAL//L'handle della risorsa a cui accedere

);

*******************************************************************************

AnsiProssimo Definizione macro:

16Una funzione API su Windows (una definizione di macro per la precisione) che può elaborare solo stringhe ANSI;

Successivamente, quando è apparso Win32, Microsoft ha implementato l'incapsulamento tramite CharNext per compatibilità.

CarattereSuccessivoPuò essere una stringa ansi o unicode.

Questa funzione restituisce la posizione successiva (puntatore) nella stringa ansi.

*/

Risorsa.hfile di testa

//{{NESSUNA_DIPENDENZA}}

// Microsoft Visual C++ File include generati.

// Per l'utilizzo da 057_POEPOEM.rc

//

#definisci IDS_NOMEAPP 1

#definisci IDS_Caption 2

#definisci IDS_CAPTION 3

#definisci IDS_ERRMSG 4

#definisci IDI_ICON1 1

#definisci IDC_CURSOR1 2

#definisci IDR_TEXT1 107

#definisci IDR_TEXT2 108

// Prossimi valori predefiniti per i nuovi oggetti

//

#ifdef APSTUDIO_INVOCATO

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE 126

#define _APS_NEXT_COMMAND_VALUE 40002

#define _APS_NEXT_CONTROL_VALUE 1001

#define _APS_NEXT_SYMED_VALUE 101

#finisci se

#finisci se

057_POEPOEM.rcI file di script delle risorse contengono 4 tipi di risorse:

1 . Risorse dell'icona:

// Icona

//

IDI_ICON1 ICONA "D:\codice\windows5.0\A giornaliero

pratica\057_POEPOEM\057_POEPOEM\icon1.ico"

2 . Risorsa bitmap del puntatore del mouse:

// Cursore

//

IDC_CURSOR1 CURSORE "cursore1.cur"

3 . Tabella delle risorse stringa:

// Tabella delle stringhe

//

TAVOLA DI CORDE

INIZIO

IDS_APPNAME "PoePoem"

IDS_CAPTION """Annabel Lee"" di Edgar Allan Poe"

IDS_ERRMSG "Questo programma richiede Windows NT!"

FINE

4 . Risorse personalizzate:

// TESTO

//

TESTO DI ANNABELLEE "POEPOEM.TXT"

risultato dell'operazione:

Figura 9-9 Tabella delle risorse stringa e risorse personalizzate

 

Riassumere

Nello script della risorsa POEPOEM.RC, la risorsa definita dall'utente è specificata come tipo TEXT e il nome del testo è "ANNABELLEE": ANNABELLEE TEXT POEPOEM.TXT

Durante l'elaborazione del messaggio WM_CREATE in WndProc, l'handle della risorsa viene ottenuto tramite FindResource e LoadResource. LockResource blocca la risorsa e una piccola routine sostituisce la barra rovesciata finale ( ) nel file con 0. Questo per facilitare l'uso della funzione DrawText nel successivo messaggio WM_PAINT.

[Nota] Usiamo il controllo della barra di scorrimento della sottofinestra invece della barra di scorrimento della finestra. Il controllo della barra di scorrimento della sottofinestra dispone di un'interfaccia con tastiera automatica, quindi non è necessario elaborare il messaggio WM_KEYDOWN in POEPOEM.

POEPOEM utilizza anche tre stringhe, i cui ID sono definiti nel file di intestazione RESOURCE.H. All'inizio del programma le stringhe IDS_APPNAME e IDS_CAPTION vengono caricate in memoria da LoadString:

LoadString (istanza hl, IDS_APPNAME, szAppName,

dimensione di (szAppName) /dimensione di (TCHAR));

LoadString (istanza hlnstance, IDS_CAPTION, szCaption,

dimensione(szCaption) /dimensione(TCHAR));

[Nota] Queste due chiamate precedono RegisterClass. Il programma utilizza LoadStringA per caricare le stringhe IDS_APPNAME e IDS_ERRMSG e utilizza MessageBoxA per visualizzare una finestra di messaggio personalizzata:

se (!RegisterClass (&wndclass))

{

LoadStringA (hInstance, IDS_APPNAME, (char *) szAppName,

dimensione(szAppName)) ;

LoadStringA (hInstance, IDS_ERRMSG, (char *) szErrMsg,

dimensione(szErrMsg)) ;

MessageBoxA (NULL, (char *) szErrMsg,

(char *) szAppName, MB_ICONERROR) ;

restituisci 0 ;

}

[Nota] Forza la conversione dalla variabile stringa TCHAR al puntatore al carattere.

AnsiNext è una definizione di macro su Windows a 16 bit Win32 utilizza invece CharNext (AnsiNext può gestire solo stringhe ansi; CharNext può gestire sia stringhe ansi che stringhe Unicode).

pText = AnsiNext(pText);

Sostituirlo con:

pTesto = (LPCSTR)CharNext((LPCWSTR)pTesto);

Tutte le stringhe utilizzate da POEPOEM sono definite come risorse, quindi il programma può essere facilmente convertito dai traduttori in versioni non inglesi.