Teknologian jakaminen

"Windows API Daily Practice" 9.1.5 Mukautetut resurssit

2024-07-12

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

Mukautetut resurssit ovat resurssityyppejä, joita käytetään Windows-ohjelmissa sovelluskohtaisten tietojen, kuvien, äänen, binääritiedostojen jne. tallentamiseen. Mukautettujen resurssien avulla kehittäjät voivat keskitetysti hallita ja tallentaa erilaisia ​​sovelluksen vaatimia resurssitiedostoja, jotta ne ovat helppokäyttöisiä ja helppokäyttöisiä.

Tässä on joitain avainkohtia mukautetuista resursseista:

●Muokattujen resurssien tyypit:

1. Mukautetut resurssit voivat olla mitä tahansa sovelluskohtaisia ​​tietoja tai tiedostoja, kuten kuvia, ääntä, XML-määritystiedostoja, tekstitiedostoja jne.

2. Mukautetut resurssit voidaan tunnistaa käyttämällä mukautettua resurssityypin tunnistetta, kuten "MY_CUSTOM_RESOURCE".

●Luo ja muokkaa mukautettuja resursseja:

1. Mukautetut resurssit sisältyvät yleensä sovelluksen resurssitiedostoon (.rc).

2. Mukautettuja resursseja voidaan luoda ja muokata käyttämällä resurssieditoria, kuten Visual Studion resurssinäkymää.

3. Resurssitiedostossa voit määrittää kullekin resurssille yksilöllisen resurssitunnisteen ja vastaavan resurssitiedostopolun.

●Katso mukautettuja resursseja ja käytä niitä:

1. Kun viittaat ja käytät mukautettuja resursseja koodissa, voit käyttää resurssitunnisteita vastaavien resurssien lataamiseen tai käyttämiseen.

2. Käytä vastaavia API-toimintoja (kuten LoadResource, FindResource, LockResource jne.) mukautettujen resurssien lataamiseen ja käyttämiseen.

3. Mukautetun resurssin tyypistä riippuen voit käyttää erilaisia ​​API-toimintoja (esimerkiksi kuvaresurssit voivat käyttää GDI-funktioita ja ääniresurssit voivat käyttää DirectSound-funktioita) mukautettujen resurssien käsittelyyn.

■Seuraava on esimerkkikoodinpätkä, joka näyttää kuinka ladata ja käyttää mukautettua resurssia:

#sisältää<Windows.h>

int main()

{

HINSTANCE hInstance = GetModuleHandle(NULL) // Hanki nykyinen ilmentymäkahva

HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(IDR_MY_RESOURCE), "MY_CUSTOM_RESOURCE" // Etsi mukautettuja resursseja

HGLOBAL hResData = LoadResource(hInstance, hResource) // Lataa mukautettuja resursseja

LPVOID pData = LockResource(hResData) // Lukitse mukautetut resurssit

// Käytä mukautettuja resursseja...

paluu 0;

}

Yllä olevassa esimerkissä IDR_MY_RESOURCE on mukautetun resurssin tunniste, ja vastaava resurssitiedostopolku on määritetty resurssitiedostossa. Käytä FindResource-toimintoa löytääksesi mukautetun resurssin, käytä sitten LoadResource-toimintoa mukautetun resurssin lataamiseen ja lopuksi lukitse mukautettu resurssi LockResource-toiminnolla saadaksesi osoittimen resurssitietoihin. Sen jälkeen osoitinta pData voidaan käyttää myöhempään käsittelyyn ja toimintoihin resurssin tyypin ja vaatimusten mukaisesti.

On tärkeää huomata, että mukautetun resurssin käyttö riippuu resurssityypistä ja sovelluksen tarpeista. Kehittäjät voivat valita sopivat resurssityypit ja vastaavat API-toiminnot käsitelläkseen mukautettuja resursseja todellisten tarpeiden perusteella.

Mukautetut resurssit tarjoavat joustavan resurssien hallintamenetelmän sovelluksille. Sovelluksen vaatimia tietoja ja tiedostoja voidaan hallita yhtenäisesti ja helposti käsiksi ja käyttöön. Käyttämällä mukautettuja resursseja voit tehdä sovelluksestasi modulaarisemman, ylläpidettävämmän ja laajennettavissa olevan.

       ■VS:ssäLisää mukautettuja resursseja

1. Lisää resursseja

2. Napsauta "Muokkaa" ja täytä resurssityyppi "TEKSTI"

3. Tuo resurssit ja luo automaattisesti text1.bin-tiedosto, resurssin tunnus: IDR_TEXT1

4. Syötä VS:ssä resurssitiedoston nimi suoraan mukautettuun kääntäjään ja muokkaa tunnusta Näyttöön tulee virheilmoitus: Ei voida ladata ulkoisia resursseja - mahdollinen syy on se, että resursseja ei tuoda.

5. Lisää resurssit resurssinäkymäruutuun.

6. Tuo ulkoiset resurssit.

7. Täytä resurssitiedoston nimi ja tunnus. Huomaa, että tunnuksen nimi on täytettävä lainatulla merkkijonolla "ANNABELLEE".

8. Tallenna vain asetukset.

 

On olemassa yksinkertaisempi tapa, muokata suoraan resurssitiedostoa POEPOEM.rc. Lisää vain resurssit TEKSTI-kohdan alle.

      

9.1.6 Harjoitus 57: Merkkijonoresurssitaulukko ja mukautetut resurssit

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

057 WIN32 API Harjoittele joka päivä

     Esimerkki 57 POEPOEM.C: Merkkijonoresurssitaulukko ja mukautetut resurssit

LoadString toiminto

LoadResource toiminto

FindResource toiminto

LockResource toiminto

AnsiNext Makro määritelmä

(c) www.bcdaren.com Ohjelmoija

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

#sisältää <windows.h>

#sisältää "resurssi.h"

LTULOS SOITA TAKAISIN WndProc (HWND, UINT, WPARAM, LPARAM) ;

HINSTANCE hInst ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

 PSTR szCmdLine, int iCmdShow)

{   //Resurssitiedoston nimi, otsikko ja virheilmoitus

     TCHAR szAppName[16], szCaption[64], szErrMsg[64];

     HWND hwnd;

     MSG viesti;

     WNDCLASSI wndclass;

     //Lataa merkkijonoresurssit

     LoadString(hInstance, IDS_APPNAME, szAppName,

          koko(szAppName) / koko(TCHAR));

     LoadString(hInstance, IDS_CAPTION, szCaption,

          koko(szCaption) / koko(TCHAR));

     wndclass.tyyli = CS_HREDRAW | CS_VREDRAW;

     wndclass.lpfnWndProc = WndProc;

     wndclass.cbClsExtra = 0;

     wndclass.cbWndExtra = 0;

     wndclass.hInstance = hInstance;

//lisää kuvake

     wndclass.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));

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

//Mukautettu hiiren osoitin

     wndclass.hKohdistin = LataaCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1));

     wndclass.hbr Tausta = (HBRUSH)GetStockObject(WHITE_BRUSSH);

     wndclass.lpszMenuName = TYHJÄ;

     wndclass.lpszClassName = szAppName;

     //hInst = hInstance;//Se ei ole alkuperäisessä koodissa, eikä virheestä ilmoiteta.

     jos (!RegisterClass(&wndclass))

     {

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

          // sizeof(szAppName));

          LoadStringA(hInstance, IDS_ERRMSG, (hiiltyä *)szErrMsg,

               koko(szErrMsg));

          ViestiBoxA(TYHJÄ, (hiiltyä *)szErrMsg,

               (hiiltyä *)szAppName,

               MB_ICONERROR);

          palata 0;

     }

     hwnd = Luo ikkuna(szAppName, szCaption,

          WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,

          CW_USEDEFAULT, CW_USEDEFAULT,

          CW_USEDEFAULT, CW_USEDEFAULT,

          TYHJÄ, TYHJÄ, hInstance, TYHJÄ);

     ShowWindow(hwnd, iCmdShow);

     UpdateWindow(hwnd);

     sillä aikaa (Hanki viesti(&viesti, TYHJÄ, 0, 0))

     {

          Käännä viesti(&viesti);

          DispatchMessage(&viesti);

     }

     palata viesti.wParam;

}

LTULOS SOITA TAKAISIN WndProc ( HWND hwnd, UINT viesti, WPARAM wParam, LPARAM

lParam)

{

     //staattinen merkki * pText;

     staattinen LPCSTR pTeksti;

     staattinen HGLOBAL hResource;//Resurssikahva - kahva, joka osoittaa muistilohkoon

     staattinen HWND hScroll;

     staattinen int iPosition, cxChar, cyChar, cyClient,

          iNumLines, xScroll;

     HDC hdc;

     MALARAKENNE ps;

     RECT rect;

     TEKSTIMETRINEN tm;

     vaihtaa (viesti)

     {

     tapaus WM_CREATE:

          hdc = HankiDC(hwnd);

          GetTextMetrics(hdc, &tm);

          cxChar = tm.tmAveCharWidth;

          cyChar = tm.tmKorkeus + tm.tmExternalLeading;

          ReleaseDC(hwnd, hdc);

//Pystysuuntaisen vierityspalkin leveys pikseleinä

          xScroll = Hanki SystemMetrics(SM_CXVSCROLL);

          //Luo vierityspalkki

          hScroll = Luo ikkuna(TEKSTI("vierityspalkki"), TYHJÄ,

               WS_CHILD | WS_VISIBLE | SBS_VERT,

               0, 0, 0, 0,

               hwnd, (HMENU)1, hInst, TYHJÄ);

          //Hanki tekstikahva

          hResource = LoadResource(hInst,

               FindResource(hInst, TEKSTI("AnnabelLee"),//Varmista, että sillä on määritetty tyyppi ja nimi

Resurssin sijainti määritetyssä moduulissa

                    TEKSTI("TEKSTI")));

          //Hae osoitin määritettyyn resurssiin muistissa

          pTeksti = (LPCSTR)LockResource(hResource);

          iNumLines = 0;//Lue tekstirivien määrä

          //Hanki tekstirivien määrä

          sillä aikaa (*pTeksti != '\' && *pTeksti != '0')//Lopeta tai 0

          {

               jos (*pTeksti == 'n')

                    iNumLines++;

                //Palauttaa seuraavan sijainnin (osoittimen) ansi-merkkijonossa, AnsiNext 16-bittisessä Windowsissa

//Makromäärittely, Win32 käyttää sen sijaan CharNextiä (AnsiNext voi käsitellä vain ansi-merkkejä

//merkkijono; CharNext voi olla ansi- tai unicode-merkkijono)

                //pText = AnsiNext(pText);

               pTeksti = (LPCSTR)CharNext((LPCWSTR)pTeksti);

          }

     //*pText = '0';//Alkuperäinen koodi tässä sanoo, että se päättyy nollamerkkiin --- varsinainen teksti ei pääty tyhjään merkkiin.

          //Aseta vierityspalkki

          Aseta ScrollRange(hScroll, SB_CTL, 0, iNumLines, VÄÄRÄ);

          SetScrollPos(hScroll, SB_CTL, 0, VÄÄRÄ);

          palata 0;

     tapaus WM_SIZE:

          MoveWindow(hScroll, LOWORD(lParam) - xScroll, 0,

               xScroll, cyClient = HIWORD(lParam), TOTTA);

          SetFocus(hwnd);//Aseta tarkennus

          palata 0;

     tapaus WM_SETFOCUS:

          SetFocus(hScroll);//Tallenna vierityspalkin liukusäätimen tarkennus

          palata 0;

     tapaus WM_VSCROLL:

          vaihtaa (LOWORD(wParam))  //LOWORD on lisättävä, koska ilmoituskoodi on matalassa sanassa

          {

          tapaus SB_TOP:

               iPosition = 0;

               tauko;

          tapaus SB_BOTTOM:

               iPosition = iNumLines;

               tauko;

          tapaus SB_LINEUP:

               iPosition -= 1;

               tauko;

          tapaus SB_LINEDOWN:

               iPosition += 1;

               tauko;

          tapaus SB_PAGEUP:

               iPosition -= cyClient / cyChar;

               tauko;

          tapaus SB_PAGEDOWN:

               iPosition += cyClient / cyChar;

               tauko;

          tapaus SB_THUMBTRACK:

               iPosition = HIWORD(wParam);

               tauko;

          }

          iPosition = max(0, min(iPosition, iNumLines));

          jos (iPosition != GetScrollPos(hScroll, SB_CTL))

          {

               SetScrollPos(hScroll, SB_CTL, iPosition, TOTTA);

               InvalidateRect(hwnd, TYHJÄ, TOTTA);

          }

          palata 0;

     tapaus WM_PAINT:

          hdc = AloitaPaint(hwnd, &ps);

          pTeksti = (hiiltyä *)LockResource(hResource);

          GetClientRect(hwnd, &rect);

          rect.vasemmalle += cxChar;//Näyttö sarakkeesta 2 alkaen

          rect.alkuun += cyChar * (1 - iPosition);

          // Sisältää fontin ulkolinjan etukorkeuden. Normaalisti ulompien rivien otsikoita ei sisällytetä tekstirivin korkeuteen.

          PiirräTekstiA(hdc, pTeksti, -1, &rect, DT_EXTERNALLEADING);

          EndPaint(hwnd, &ps);

          palata 0;

     tapaus WM_DESTROY:

          FreeResource(hResource);

          PostQuitMessage(0);

          palata 0;

     }

     palata DefWindowProc(hwnd, viesti, wParam, lParam);

}

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

LoadString Toiminto: Lataa merkkijonoresurssin ja kopioi sitten merkkijonon puskuriin, jossa on päättyvä nollamerkki,

Tai palauta vain luku -osoitin itse merkkijonoresurssille.

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

LoadResource Toiminto: Hakee kahvan, jota voidaan käyttää osoittimen hakemiseen määritetyn resurssin ensimmäiseen tavuun muistissa

HGLOBAL LoadResource(

HMODULE hModule,// Kahva moduulille, jonka suoritettava tiedosto sisältää resurssin.Jos hModule on NULL, järjestelmä lataa resurssin nykyisen prosessin luomiseen käytetystä moduulista

HRSRC hResInfo//Ladattavan resurssin kahva

);

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

FindResource Toiminto: Määrittää määritetyn tyypin ja nimen resurssin sijainnin määritetyssä moduulissa

HRSRC FindResourceA(

HMODULE hModule,//Käsittele resurssin sisältävää moduulia

LPCSTR lpName,//resurssin nimi

LPCSTR lpType//Resurssin tyyppi

);

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

LockResource Toiminto: Hae osoitin määritettyyn resurssiin muistissa

LPVOID LockResource(

HGLOBAL hResData//Käytettävän resurssin kahva

);

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

AnsiNext Makro määritelmä:

16Api-toiminto Windowsissa (tarkemmin sanottuna makromääritelmä), joka voi käsitellä vain ANSI-merkkijonoja;

Myöhemmin, kun Win32 ilmestyi, Microsoft toteutti kapseloinnin CharNextin kautta yhteensopivuuden varmistamiseksi.

CharNextSe voi olla ansi- tai unicode-merkkijono.

Tämä funktio palauttaa seuraavan sijainnin (osoittimen) ansi-merkkijonossa.

*/

Resource.hpää Tiedosto

//{{NO_DEPENDENCIES}}

// Microsoft Visual C++ Luodut sisällyttää tiedostot.

// 057_POEPOEM.rc:n käyttöön

//

#define IDS_APPNAME 1

#define IDS_Caption 2

#define IDS_CAPTION 3

#define IDS_ERRMSG 4

#define IDI_ICON1 1

#define IDC_CURSOR1 2

#define IDR_TEXT1 107

#define IDR_TEXT2 108

// Seuraavat oletusarvot uusille objekteille

//

#ifdef APSTUDIO_INVOKED

#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

#loppu Jos

#loppu Jos

057_POEPOEM.rcResurssien komentosarjatiedostot sisältävät neljän tyyppisiä resursseja:

1 . Kuvakeresurssit:

// Ikoni

//

IDI_ICON1 ICON "D:\code\windows5.0\A päivittäin

harjoitus\057_POEPOEM\057_POEPOEM\icon1.ico"

2 . Hiiren osoittimen bittikarttaresurssi:

// Kursori

//

IDC_CURSOR1 CURSOR "cursor1.cur"

3 . Merkkijonoresurssitaulukko:

// Merkkijonotaulukko

//

STRINGTAULUKKO

ALKAA

IDS_APPNAME "PoePoem"

IDS_CAPTION """"Annabel Lee"", kirjoittanut Edgar Allan Poe"

IDS_ERRMSG "Tämä ohjelma vaatii Windows NT:n!"

LOPPU

4 . Mukautetut resurssit:

// TEKSTI

//

ANNABELLEE TEKSTI "POEPOEM.TXT"

operaation tulos:

Kuva 9-9 Merkkijonoresurssitaulukko ja mukautetut resurssit

 

Tee yhteenveto

POEPOEM.RC-resurssikomentosarjassa käyttäjän määrittämä resurssi on määritetty TEKSTI-tyypiksi ja tekstin nimi on "ANNABELLEE": ANNABELLEE TEXT POEPOEM.TXT

Käsiteltäessä WM_CREATE-sanomaa WndProcissa, resurssin kahva saadaan FindResourcen ja LoadResourcen kautta. LockResource lukitsee resurssin, ja pieni rutiini korvaa tiedoston lopussa olevan kenoviivan ( ) numerolla 0. Tämä helpottaa DrawText-funktion käyttöä seuraavassa WM_PAINT-sanomassa.

[Huomautus] Käytämme aliikkunan vierityspalkin ohjausta ikkunan vierityspalkin sijaan. Alaikkunan vierityspalkin ohjauksessa on automaattinen näppäimistöliitäntä, joten WM_KEYDOWN-sanomaa ei tarvitse käsitellä POEPOEMissa.

POEPOEM käyttää myös kolmea merkkijonoa, joiden tunnukset on määritelty RESOURCE.H-otsikkotiedostossa. Ohjelman alussa LoadString lataa IDS_APPNAME- ja IDS_CAPTION-merkkijonot muistiin:

LoadString (hlnstance, IDS_APPNAME, szAppName,

sizeof (szAppName) /sizeof (TCHAR));

LoadString (hlnstance, IDS_CAPTION, szCaption,

koko (szCaption) /koko (TCHAR));

[Huom.] Nämä kaksi kutsua edeltävät RegisterClassia. Ohjelma käyttää LoadStringA:ta IDS_APPNAME- ja IDS_ERRMSG-merkkijonojen lataamiseen, ja MessageBoxA näyttää mukautetun viestilaatikon:

if (!RegisterClass (&wndclass))

{

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

sizeof (szAppName)) ;

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

sizeof (szErrMsg)) ;

MessageBoxA (NULL, (char *) szErrMsg,

(char *) szAppName, MB_ICONERROR) ;

paluu 0;

}

[Huom.] Pakota muunnos TCHAR-merkkijonomuuttujasta merkkiosoittimeksi.

AnsiNext on makromääritelmä 16-bittisessä Windowsissa, ja se käyttää sen sijaan CharNextiä (AnsiNext voi käsitellä vain ansi-merkkijonoja; CharNext voi käsitellä sekä ansi- että unicode-merkkijonoja).

pText = AnsiSeuraava(pTeksti);

Korvata:

pText = (LPCSTR)CharNext((LPCWSTR)pText);

Kaikki POEPOEM:n käyttämät merkkijonot on määritelty resursseiksi, joten kääntäjät voivat helposti muuntaa ohjelman ei-englanninkielisiksi versioiksi.