ในการเขียนแอปพลิเคชัน ส่วนประกอบทั่วไป เช่น ComboBox และ ListBox มักจะใช้ไม่เพียงแต่เพื่อแสดงข้อความ แต่ยังเพื่อแสดงไอคอนที่เกี่ยวข้องกับข้อความด้วย ในแอปพลิเคชัน Windows โดยทั่วไป การแสดงไอคอนเหล่านี้จะเปลี่ยนไปตามข้อความที่แสดงในรายการเปลี่ยนแปลง ตัวอย่างเช่น เมื่อไฟล์ทั้งหมดในไดเร็กทอรีปัจจุบันแสดงอยู่ในกล่องคำสั่งผสม การแสดงทางด้านซ้ายของกล่องคำสั่งผสมจะสัมพันธ์กับ ชื่อไฟล์ ไอคอนที่เชื่อมต่อเรียกว่าไอคอนไดนามิก ขั้นตอนในการใช้ไอคอนไดนามิกใน Delphi มีดังนี้: 1. การได้รับไอคอน
เมื่อต้องการใช้ไอคอนไดนามิก สิ่งแรกที่ต้องแก้ไขคือวิธีรับข้อความที่แสดงและหมายเลขอ้างอิงไอคอนที่เกี่ยวข้องกัน ไอคอนถูกกำหนดโดยรีจิสทรีของระบบผ่านการเชื่อมโยงไฟล์ และในการเขียนโปรแกรม Windows ไฟล์เดียวกัน (หรือไดเร็กทอรีย่อย หรือโฟลเดอร์) อาจมีผลลัพธ์การแสดงผลสองรายการบนเดสก์ท็อป ซึ่งได้แก่ ชื่อไฟล์ DOS และชื่อที่แสดง (ชื่อที่แสดง) . หากแอปพลิเคชันของเราไม่จำเป็นต้องมีผลเหมือนกับ Windows Resource Browser เราสามารถใช้ฟังก์ชัน FindFirst() และ FindNext() และกระบวนการ FindClose() เพื่อรับชื่อไฟล์ DOS มิฉะนั้น เราควรใช้ Windows API เพื่อรับชื่อที่แสดง ในขณะที่รับชื่อไฟล์ คุณสามารถขอรับไอคอนจัดการ HICON ได้โดยใช้ฟังก์ชัน SHGetFileInfo() ใน ShellAPI.pas คำแนะนำมีดังนี้:
ฟังก์ชัน SHGetFileInfo (pszPath: PAnsiChar; dwFileAttributes: DWord; var psfi: TSHFileInfo; cbFileInfo, uFlags: UINT): DWORDl;
พารามิเตอร์ pszPath: ชื่อไฟล์ที่ระบุ เมื่อค่าของ uFlags ไม่มี SHGFI_PIDL ก็สามารถระบุได้โดยตรง มิฉะนั้น จะต้องรับ pszPath ผ่านการคำนวณและไม่สามารถระบุได้โดยตรง
พารามิเตอร์ dwFileAttributes: คุณลักษณะของไฟล์ ใช้ได้เฉพาะเมื่อค่าของ uFlags มี SHGFI_USEFILEATTRIBUTES โดยทั่วไปพารามิเตอร์นี้จะไม่ได้ใช้
พารามิเตอร์ psfi: ส่งกลับข้อมูลไฟล์ที่ได้รับซึ่งเป็นประเภทบันทึกที่มีฟิลด์ต่อไปนี้:
hIcon: HICON; // ตัวจัดการไอคอนของไฟล์
iIcon: Integer; // หมายเลขดัชนีระบบของไอคอน
dwAttributes: DWORD; //ค่าคุณสมบัติของไฟล์
szDisplayName: อาร์เรย์ [0..MAX_PATH-1] ของ AnsiChar; //ชื่อที่แสดงของไฟล์
szTypeName: อาร์เรย์ [0..79] ของ AnsiChar; //ชื่อประเภทของไฟล์
พารามิเตอร์ cbFileInfo: ค่าบิตของ psfi;
พารามิเตอร์ uFlags: ระบุตัวระบุข้อมูลไฟล์ที่ต้องส่งคืนค่าคงที่ที่ใช้กันทั่วไปมีดังนี้:
SHGFI_ICON; //รับไอคอน
SHGFI_DISPLAYNAME; // รับชื่อที่แสดง
SHGFI_TYPENAME; //รับชื่อประเภท
SHGFI_ATTRIBUTES;//รับแอตทริบิวต์
SHGFI_LARGEICON; // รับไอคอนขนาดใหญ่
SHGFI_SMALLICON; //รับไอคอนขนาดเล็ก
SHGFI_PIDL; // pszPath เป็นตัวระบุ
ค่าที่ส่งคืนของฟังก์ชัน SHGetFileInfo() จะแตกต่างกันไปตามค่าของ uFlags ด้วยการเรียก SHGetFileInfo() คุณจะได้รับตัวจัดการไอคอนของไฟล์จากพารามิเตอร์ psfi แต่โปรดทราบว่าเมื่อไม่ได้ใช้ SHGFI_PIDL ในพารามิเตอร์ uFlags SHGetFileInfo() จะไม่สามารถรับข้อมูลเกี่ยวกับโฟลเดอร์เสมือน เช่น "My Computer" ได้ 2. กำลังโหลดไอคอน
ใช้ส่วนประกอบ TImageList ที่ Delphi ให้มาเพื่อโหลดไอคอนที่ได้รับโดยการเรียกใช้ฟังก์ชัน ImageList_AddIcon() ใน CommCtrl.pas และตรวจสอบให้แน่ใจว่าหมายเลขดัชนีสอดคล้องกับข้อความที่แสดง คำแนะนำมีดังนี้:
ฟังก์ชั่น ImageList_AddIcon (ImageList: HIMAGELIST; // โหลดตัวจัดการ ImageList ของไอคอน
ไอคอน: hicon // ตัวจัดการไอคอนที่โหลดแล้ว): จำนวนเต็ม; // ส่งคืนหมายเลขดัชนีของไอคอนใน ImageList
ค่าที่ส่งคืนของ ImageList_AddIcon() สามารถใช้ได้เมื่อคุณต้องการระบุหมายเลขดัชนีไอคอน 3. เอาต์พุตกราฟิกของไอคอนและข้อความ
สำหรับส่วนประกอบต่างๆ เช่น กล่องคำสั่งผสมและกล่องรายการที่ไม่สามารถแสดงไอคอนได้โดยตรง เนื่องจากจำเป็นต้องแสดงไอคอนและข้อความพร้อมกัน สามารถทำได้โดยการตั้งค่าคุณสมบัติสไตล์ที่สอดคล้องกัน ตัวอย่างมีดังนี้:
กล่องคำสั่งผสม: ComboBox1.Style:=csOwnerDrawVariable ตามประสบการณ์การใช้งานจริง ไม่ควรตั้งค่าโดยตรงในรูปแบบ ObjectInspector แต่ควรเพิ่มโค้ดในตำแหน่งที่เหมาะสมในโปรแกรม มิฉะนั้น การเปลี่ยนแปลงความสูงจะผิดปกติ ของพื้นที่วาดภาพอาจเกิดขึ้นได้
กล่องรายการ: ListBox1.Style:=lbOwnerDrawVariable
แถบสถานะ: StatusBar1.Panels[i].Style:= psOwnerDraw ไม่สามารถใช้แถบสถานะแบบธรรมดาได้ i คือหมายเลขดัชนีของบานหน้าต่างบางบานในแถบสถานะที่จะวาดไอคอนเอาต์พุตสามารถใช้ ImageList1.Draw () วิธีการ TImageList และเอาต์พุตข้อความสามารถใช้วิธี TextOut() ของ TCanvas ซึ่งสืบทอดมาจากคุณสมบัติ Canvas ของส่วนประกอบ แน่นอนว่าส่วนประกอบที่ไม่มีคุณสมบัติ Canvas ไม่สามารถใช้วิธีนี้ในการแสดงไอคอนได้
สำหรับส่วนประกอบที่สามารถแสดงไอคอนได้โดยตรง ให้ระบุคุณสมบัติไอคอนที่ต้องการโดยตรง เช่น รูปภาพ และ StateImages เป็นชื่อส่วนประกอบ TimageList ที่สอดคล้องกัน และสามารถแสดงไอคอนได้โดยการระบุหมายเลขดัชนีของไอคอน ควรสังเกตว่าเมื่อใช้ไอคอนขนาดใหญ่ คุณต้องเรียกเมธอด CreateSize() ของ TImageList ก่อนเพื่อระบุขนาดของไอคอนที่โหลดได้ และเรียก CreateSize() อีกครั้งหลังจากการเรียกเมธอด Clear ของ TImageList แต่ละครั้ง
ใช้เมธอด ImageList1.Clear ของ TImageList เพื่อล้างไอคอนที่โหลด ซึ่งมักใช้เมื่อจำเป็นต้องรีเฟรช