informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Sumber Daya Kustom adalah jenis sumber daya yang digunakan dalam program Windows untuk menyimpan data khusus aplikasi, gambar, audio, file biner, dll. Melalui sumber daya khusus, pengembang dapat mengelola dan menyimpan berbagai file sumber daya yang diperlukan oleh aplikasi secara terpusat untuk kemudahan akses dan penggunaan dalam program.
■Berikut adalah beberapa poin penting tentang sumber daya khusus:
●Jenis sumber daya khusus:
1. Sumber daya khusus dapat berupa data atau file khusus aplikasi apa pun, seperti gambar, audio, file konfigurasi XML, file teks, dll.
2. Sumber daya khusus dapat diidentifikasi menggunakan pengidentifikasi jenis sumber daya khusus, seperti "MY_CUSTOM_RESOURCE".
●Membuat dan mengedit sumber daya khusus:
1. Sumber daya khusus biasanya disertakan dalam file sumber daya aplikasi (.rc).
2. Sumber daya khusus dapat dibuat dan diedit menggunakan editor sumber daya, seperti Tampilan Sumber Daya Visual Studio.
3. Dalam file sumber daya, Anda dapat menentukan pengidentifikasi sumber daya unik dan jalur file sumber daya yang sesuai untuk setiap sumber daya.
●Lihat dan gunakan sumber daya khusus:
1. Saat mereferensikan dan menggunakan sumber daya khusus dalam kode, Anda dapat menggunakan pengidentifikasi sumber daya untuk memuat atau mengakses sumber daya terkait.
2. Gunakan fungsi API yang sesuai (seperti LoadResource, FindResource, LockResource, dll.) untuk memuat dan mengoperasikan sumber daya khusus.
3. Bergantung pada jenis sumber daya khusus, Anda dapat menggunakan fungsi API yang berbeda (misalnya, sumber daya gambar dapat menggunakan fungsi GDI, dan sumber daya audio dapat menggunakan fungsi DirectSound) untuk memproses sumber daya khusus.
■Berikut ini adalah contoh cuplikan kode yang menunjukkan cara memuat dan menggunakan sumber daya khusus:
#termasuk<Windows.h>
int utama()
{
HINSTANCE hInstance = GetModuleHandle(NULL); // Dapatkan pegangan instance saat ini
HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(IDR_MY_RESOURCE), "MY_CUSTOM_RESOURCE"); // Temukan sumber daya khusus
HGLOBAL hResData = LoadResource(hInstance, hResource); // Memuat sumber daya khusus
LPVOID pData = LockResource(hResData); // Mengunci sumber daya khusus
// Gunakan sumber daya khusus...
kembali 0;
}
Dalam contoh di atas, IDR_MY_RESOURCE adalah pengidentifikasi sumber daya khusus, dan jalur file sumber daya terkait ditentukan dalam file sumber daya. Gunakan fungsi FindResource untuk menemukan sumber daya kustom, lalu gunakan fungsi LoadResource untuk memuat sumber daya kustom, dan terakhir gunakan fungsi LockResource untuk mengunci sumber daya kustom guna mendapatkan penunjuk ke data sumber daya. Selanjutnya, penunjuk pData dapat digunakan untuk pemrosesan dan operasi selanjutnya sesuai dengan jenis dan kebutuhan sumber daya.
Penting untuk diperhatikan bahwa cara sumber daya kustom digunakan bergantung pada jenis sumber daya dan kebutuhan aplikasi. Pengembang dapat memilih jenis sumber daya yang sesuai dan fungsi API yang sesuai untuk memproses sumber daya khusus berdasarkan kebutuhan sebenarnya.
Sumber daya khusus menyediakan metode pengelolaan sumber daya yang fleksibel untuk aplikasi. Berbagai data dan file yang diperlukan oleh aplikasi dapat dikelola secara seragam dan mudah diakses serta digunakan dalam program. Dengan menggunakan sumber daya khusus, Anda dapat membuat aplikasi Anda lebih modular, mudah dipelihara, dan diperluas.
■di VSTambahkan sumber daya khusus ke dalamnya
1. Tambahkan sumber daya
2. Klik "Sesuaikan" dan isi jenis sumber daya "TEKS"
3. Impor sumber daya dan secara otomatis menghasilkan file text1.bin, ID sumber daya: IDR_TEXT1
4. Di VS, langsung masukkan nama file sumber daya di kompiler khusus dan ubah ID. Pesan kesalahan muncul: Tidak dapat memuat sumber daya eksternal - kemungkinan alasannya adalah sumber daya tidak diimpor.
5. Tambahkan sumber daya di kotak tampilan sumber daya.
6. Impor file sumber daya eksternal.
7. Isi ulang nama file sumber daya dan ID. Perhatikan bahwa nama ID harus diisi dengan string yang dikutip "ANNABELLEE".
8. Simpan saja pengaturannya.
Ada cara yang lebih sederhana, langsung modifikasi file resource POEPOEM.rc. Cukup tambahkan sumber daya di bawah baris di bawah TEKS.
/*------------------------------------------------------------------------
057 API WIN32 Berlatihlah setiap hari
Contoh 57 POEPOEM.C: Tabel sumber daya string dan sumber daya khusus
BebanString fungsi
MuatSumberDaya fungsi
TemukanSumberDaya fungsi
KunciSumberDaya fungsi
AnsiSelanjutnya Definisi makro
(c) www.bcdaren.com Programmer
-----------------------------------------------------------------------*/
#termasuk <windows.h>
#termasuk "sumber daya.h"
HASIL PANGGILAN KEMBALI Proses Penukaran Wnd (HWND, Bahasa Inggris Bahasa Inggris UINT, Bahasa Indonesia: Bahasa Indonesia: WPARAM, LPARAM) ;
PETUNJUK Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: hInst ;
ke dalam WINAPI MenangUtama (PETUNJUK contoh, PETUNJUK hInstansi Sebelumnya,
PSTR Baris szCmd, ke dalam iCmdTampilkan)
{ //Nama file sumber daya, judul dan pesan kesalahan
THAR NamaAplikasisz[16], Keterangan sz[64], PesanErr[64];
HWND hwnd;
MSG pesan;
KELAS WNDC kelas wnd;
//Memuat sumber daya string
BebanString(contoh, IDS_NAMA APLIKASI, NamaAplikasisz,
ukuran dari(NamaAplikasisz) / ukuran dari(THAR));
BebanString(contoh, KETERANGAN_IDS, Keterangan sz,
ukuran dari(Keterangan sz) / ukuran dari(THAR));
kelas wnd.gaya = CS_HREDRAW | CS_VREDRAW;
kelas wnd.lpfnWndProc = Proses Penukaran Wnd;
kelas wnd.cbClsTambahan = 0;
kelas wnd.cbWndTambahan = 0;
kelas wnd.contoh = contoh;
//tambahkan ikon
kelas wnd.Ikon h = Ikon Muat(contoh, BUAT SUMBER DAYA(IKON_IDI1));
//wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
//Penunjuk tetikus khusus
kelas wnd.hKursor = Muat Kursor(contoh,BUAT SUMBER DAYA(IDC_KURSOR1));
kelas wnd.Latar Belakang hbr = (sikat gigi)Dapatkan Objek Stok(KUAS PUTIH);
kelas wnd.NamaMenu lpsz = BATAL;
kelas wnd.NamaKelas lpsz = NamaAplikasisz;
//hInst = hInstance;//Itu tidak ada dalam kode asli dan tidak ada kesalahan yang akan dilaporkan.
jika (!DaftarKelas(&kelas wnd))
{
//LoadStringA(hInstance, NAMA_APP_IDS, (char *)NamaAplikasi_sz,
// ukuran(namaAplikasiSz));
BebanStringA(contoh, ID_ERRMSG, (arang *)PesanErr,
ukuran dari(PesanErr));
KotakPesanA(BATAL, (arang *)PesanErr,
(arang *)NamaAplikasisz,
MB_KESALAHAN_IKON);
kembali 0;
}
hwnd = BuatJendela(NamaAplikasisz, Keterangan sz,
WS_JENDELA YANG TIMBUL | WS_KLIP ANAK-ANAK,
CW_DIGUNAKANDEFAULT, CW_DIGUNAKANDEFAULT,
CW_DIGUNAKANDEFAULT, CW_DIGUNAKANDEFAULT,
BATAL, BATAL, contoh, BATAL);
TampilkanJendela(hwnd, iCmdTampilkan);
PerbaruiJendela(hwnd);
ketika (Dapatkan Pesan(&pesan, BATAL, 0, 0))
{
TerjemahkanPesan(&pesan);
Pesan Pengiriman(&pesan);
}
kembali pesan.wParam;
}
HASIL PANGGILAN KEMBALI Proses Penukaran Wnd ( HWND hwnd, Bahasa Inggris Bahasa Inggris UINT pesan, Bahasa Indonesia: Bahasa Indonesia: WPARAM wParam, LPARAM
lParam)
{
//karakter statis * pText;
statis LPCSTR pTeks;
statis HGLOBAL sumber daya h;//Pegangan sumber daya - pegangan yang menunjuk ke blok memori
statis HWND Gulir h;
statis ke dalam Posisi i, cxChar, cyChar, klien bersepeda,
Garis Bilangan, Gulir x;
HDC hdc;
STRUKTUR CAT hal.;
REKAM persegi panjang;
TEKSMETRIK waktu;
mengalihkan (pesan)
{
kasus WM_BUAT:
hdc = Dapatkan DC(hwnd);
DapatkanTeksMetrik(hdc, &waktu);
cxChar = waktu.LebarChar tmAve;
cyChar = waktu.tmTinggi + waktu.tmEksternalMemimpin;
RilisDC(hwnd, hdc);
//Lebar bilah gulir vertikal dalam piksel
Gulir x = DapatkanMetrikSistem(SM_GULIR CXV);
//Hasilkan bilah gulir
Gulir h = BuatJendela(TEKS("scroll bar"), BATAL,
WS_ANAK | WS_TERLIHAT | SBS_VERT,
0, 0, 0, 0,
hwnd, (MENU)1, Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: hInst, BATAL);
//Dapatkan pegangan teks
sumber daya h = MuatSumberDaya(Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: hInst,
TemukanSumberDaya(Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: Bahasa Indonesia: hInst, TEKS("Annabel Lee"),//Pastikan itu memiliki jenis dan nama yang ditentukan
Lokasi sumber daya dalam modul yang ditentukan
TEKS("TEKS")));
//Ambil pointer ke sumber daya tertentu di memori
pTeks = (LPCSTR)KunciSumberDaya(sumber daya h);
Garis Bilangan = 0;//Membaca jumlah baris teks
//Dapatkan jumlah baris teks
ketika (*pTeks != '\' && *pTeks != '0')//Berakhir dengan atau 0
{
jika (*pTeks == 'N')
Garis Bilangan++;
//Mengembalikan posisi berikutnya (penunjuk) dalam string ansi, AnsiNext pada Windows 16-bit
//Definisi makro, Win32 menggunakan CharNext sebagai gantinya (AnsiNext hanya dapat menangani karakter ansi
//String; CharNext dapat berupa string ansi atau unicode)
//pTeks = AnsiNext(pTeks);
pTeks = (LPCSTR)Berikutnya Char((LPCWSTR)pTeks);
}
//*pTeks = '0';//Kode asli di sini menyatakan bahwa itu diakhiri dengan karakter nol---teks sebenarnya tidak diakhiri dengan karakter nol.
//Setel bilah gulir
Atur Rentang Gulir(Gulir h, SB_CTL, 0, Garis Bilangan, PALSU);
SetelGulirPos(Gulir h, SB_CTL, 0, PALSU);
kembali 0;
kasus UKURAN WM:
PindahkanJendela(Gulir h, Rendah(lParam) - Gulir x, 0,
Gulir x, klien bersepeda = KATA HIBAH(lParam), BENAR);
Atur Fokus(hwnd);//Tetapkan fokus
kembali 0;
kasus WM_SETFOKUS:
Atur Fokus(Gulir h);//Tangkap fokus penggeser bilah gulir
kembali 0;
kasus WM_VSCROLL:
mengalihkan (Rendah(wParam)) //LOWORD harus ditambahkan karena kode notifikasinya menggunakan kata rendah
{
kasus SB_ATAS:
Posisi i = 0;
merusak;
kasus SB_BAWAH:
Posisi i = Garis Bilangan;
merusak;
kasus SB_LINEUP:
Posisi i -= 1;
merusak;
kasus SB_GARIS BAWAH:
Posisi i += 1;
merusak;
kasus SB_HALAMANUP:
Posisi i -= klien bersepeda / cyChar;
merusak;
kasus SB_HALAMAN BAWAH:
Posisi i += klien bersepeda / cyChar;
merusak;
kasus JEJAK JEPIT SB:
Posisi i = KATA HIBAH(wParam);
merusak;
}
Posisi i = maks(0, menit(Posisi i, Garis Bilangan));
jika (Posisi i != Dapatkan GulirPos(Gulir h, SB_CTL))
{
SetelGulirPos(Gulir h, SB_CTL, Posisi i, BENAR);
BatalkanRect(hwnd, BATAL, BENAR);
}
kembali 0;
kasus WM_CAT:
hdc = Mulai Melukis(hwnd, &hal.);
pTeks = (arang *)KunciSumberDaya(sumber daya h);
DapatkanRectKlien(hwnd, &persegi panjang);
persegi panjang.kiri += cxChar;//Tampilan mulai dari kolom 2
persegi panjang.atas += cyChar * (1 - Posisi i);
// Termasuk tinggi terdepan garis luar font. Biasanya, header baris terluar tidak termasuk dalam tinggi baris teks.
GambarTeksA(hdc, pTeks, -1, &persegi panjang, DT_PEMIMPINAN EKSTERNAL);
Cat Akhir(hwnd, &hal.);
kembali 0;
kasus WM_HANCURKAN:
Sumber Daya Gratis(sumber daya h);
PostingPesanKeluar(0);
kembali 0;
}
kembali Jendela DefProc(hwnd, pesan, wParam, lParam);
}
/******************************************************************************
BebanString Fungsi: Memuat sumber daya string dan kemudian menyalin string ke dalam buffer dengan karakter null yang diakhiri,
Atau kembalikan penunjuk baca-saja ke sumber daya string itu sendiri.
*******************************************************************************
MuatSumberDaya Fungsi: Mengambil pegangan yang dapat digunakan untuk mendapatkan penunjuk ke byte pertama dari sumber daya yang ditentukan dalam memori
Sumber Daya Beban HGLOBAL(
HMODULE hModul,// Pegangan untuk modul yang dapat dieksekusi berisi sumber daya.Jika hModule bernilai NULL, sistem akan memuat sumber daya dari modul yang digunakan untuk membuat proses saat ini
HRSRC hResInfo//Pegangan untuk sumber daya yang akan dimuat
);
*******************************************************************************
TemukanSumberDaya Fungsi: Menentukan lokasi sumber daya dengan tipe dan nama tertentu dalam modul tertentu
HRSRC TemukanSumberDaya(
HMODULE hModul,//Tangani modul yang berisi sumber daya
LPCSTR lpNama,//nama Sumberdaya
LPCSTR lpTipe//Jenis sumber daya
);
*******************************************************************************
KunciSumberDaya Fungsi: Mengambil pointer ke sumber daya tertentu di memori
Kunci Sumber Daya LPVOID(
Data Res HGLOBAL//Pegangan ke sumber daya yang akan diakses
);
*******************************************************************************
AnsiSelanjutnya Definisi makro:
16Fungsi api di Windows (tepatnya definisi makro) yang hanya dapat memproses string ANSI;
Kemudian, ketika Win32 muncul, Microsoft menerapkan enkapsulasi melalui CharNext untuk kompatibilitas.
Berikutnya CharIni bisa berupa string ansi atau unicode.
Fungsi ini mengembalikan posisi berikutnya (pointer) dalam string ansi.
*/
Sumber daya.hberkas kepala
//{{TIDAK ADA KETERGANTUNGAN}}
// Bahasa Pemrograman Visual C++ File penyertaan yang dihasilkan.
// Untuk digunakan oleh 057_POEPOEM.rc
//
#tentukan IDS_APPNAME 1
#definisikan IDS_Caption 2
#tentukan IDS_CAPTION 3
#definisikan IDS_ERRMSG 4
#tentukan IDI_ICON1 1
#tentukan IDC_CURSOR1 2
#tentukan IDR_TEXT1 107
#tentukan IDR_TEXT2 108
// Nilai default berikutnya untuk objek baru
//
#ifdef APSTUDIO_DIMINTA
#ifndef APSTUDIO_SIMBOL_HANYA_BACA
#tentukan _APS_NEXT_RESOURCE_VALUE 126
#tentukan _APS_NILAI_PERINTAH_BERIKUTNYA 40002
#tentukan nilai _APS_NEXT_CONTROL_VALUE 1001
#tentukan nilai _APS_NEXT_SYMED 101
#berakhir jika
#berakhir jika
057_POEPOEM.rcFile skrip sumber daya berisi 4 jenis sumber daya:
1 . Sumber daya ikon:
// Ikon
//
IDI_ICON1 IKON "D:\kode\windows5.0\A setiap hari
latihan\057_POEPOEM\057_POEPOEM\ikon1.ico"
2 . Sumber daya bitmap penunjuk tetikus:
// Kursor
//
IDC_CURSOR1 KURSOR "kursor1.cur"
3 . Tabel sumber daya string:
// Tabel String
//
MEJA SENAR
MULAI
IDS_APPNAME "PuisiPuisi"
IDS_CAPTION """Annabel Lee"" oleh Edgar Allan Poe"
IDS_ERRMSG "Program ini memerlukan Windows NT!"
AKHIR
4 . Sumber daya khusus:
// TEKS
//
TEKS ANNABELLEE "POEPOEM.TXT"
hasil operasi:
Gambar 9-9 Tabel sumber daya string dan sumber daya khusus
Meringkaskan
Dalam skrip sumber daya POEPOEM.RC, sumber daya yang ditentukan pengguna ditentukan sebagai jenis TEKS, dan nama teksnya adalah "ANNABELLEE": ANNABELLEE TEXT POEPOEM.TXT
Saat memproses pesan WM_CREATE di WndProc, pegangan sumber daya diperoleh melalui FindResource dan LoadResource. LockResource mengunci sumber daya, dan rutinitas kecil menggantikan garis miring terbalik ( ) di file dengan 0. Hal ini untuk memudahkan penggunaan fungsi DrawText pada pesan WM_PAINT selanjutnya.
[Catatan] Kami menggunakan kontrol bilah gulir subjendela alih-alih bilah gulir jendela. Kontrol bilah gulir subjendela memiliki antarmuka keyboard otomatis, sehingga tidak perlu memproses pesan WM_KEYDOWN di POEPOEM.
POEPOEM juga menggunakan tiga string, yang ID-nya ditentukan dalam file header RESOURCE.H. Di awal program, string IDS_APPNAME dan IDS_CAPTION dimuat ke dalam memori oleh LoadString:
LoadString (instance hl, NAMA_APP_IDS, NamaAplikasi_sz,
ukuran(namaAplikasisz) /ukuran(TCHAR));
LoadString (contoh, IDS_CAPTION, szCaption,
ukuran(szCaption)/ukuran(TCHAR);
[Catatan] Kedua panggilan ini mendahului RegisterClass. Program ini menggunakan LoadStringA untuk memuat string IDS_APPNAME dan IDS_ERRMSG, dan menggunakan MessageBoxA untuk menampilkan kotak pesan khusus:
jika (!RegisterClass(&wndclass))
{
LoadStringA (hInstance, NAMA_APP_IDS, (karakter *) NamaAplikasi_sz,
ukuran(namaAplikasiSz) ;
LoadStringA (Instansi, IDS_ERRMSG, (karakter *) szErrMsg,
ukuran(szErrMsg) ;
KotakPesanA (NULL, (karakter *) szErrMsg,
(char *) namaAplikasiSz, MB_ICONERROR) ;
kembali 0 ;
}
[Catatan] Paksa konversi dari variabel string TCHAR ke penunjuk karakter.
AnsiNext adalah definisi makro pada Windows 16-bit. Win32 menggunakan CharNext sebagai gantinya (AnsiNext hanya dapat menangani string ansi; CharNext dapat menangani string ansi dan string unicode).
pTeks = AnsiNext(pTeks);
Ubah dengan:
pTeks = (LPCSTR)CharBerikutnya((LPCWSTR)pTeks);
Semua string yang digunakan oleh POEPOEM didefinisikan sebagai sumber daya, sehingga program dapat dengan mudah dikonversi oleh penerjemah ke versi non-Inggris.