2009-12-20 14 views
5

शायद मुझे कुछ याद आ रहा है, लेकिन ... विंडोज 7 में लिस्ट व्यू नियंत्रण 3 डी नीले पारदर्शी आयत की तरह दिखने वाले चुने हुए आइटमों के आसपास एक हाइलाइट प्रदर्शित करता है (मैं चयन के बारे में बात नहीं कर रहा हूं आयताकार, लेकिन वास्तविक चयनित वस्तुओं के चारों ओर आयताकार)। वस्तुओं पर होवर करते समय यह एक हल्का आयताकार भी दिखाता है।.NET ListView और Windows 7

हालांकि, जब मैं WinForms में सूची दृश्य का उपयोग करता हूं (यहां तक ​​कि जब डबल-बफर किया जाता है), चयनित आइटमों में केवल एक सादा नीली पृष्ठभूमि (और कोई होवर पृष्ठभूमि नहीं है) जो एक्सप्लोरर में सूची के मुकाबले बहुत कम पेशेवर दिखती है।

क्या किसी को पता है कि .NET ListView को बाकी ओएस के साथ लाइन में देखने के लिए मुझे कौन सी गुप्त एपीआई फ़ंक्शन कॉल करना चाहिए? (प्रकाश डाला नोटिस और आयत मंडराना)

alt text

यहाँ और उस के पुनर्लेखन है:

उदाहरण के लिए, यहां सी ++ में लिखा मेरा अनुप्रयोगों में से एक, विंडोज 7 में एक मानक ListView नियंत्रण का उपयोग है सी # WinForms साथ में आवेदन:,

alt text

उत्तर

12

ठीक (कच्चा प्रकाश डाला और कोई मंडराना नोटिस) मैं पूरी तरह से इसके लगा बाहर है, और इस अन्य जो इस समस्या से परेशान हैं मदद मिल सकती है।

मैंने यह ध्यान में रखकर शुरू किया कि सी ++ बिल्डर में लिस्ट व्यू नियंत्रण विंडोज 7 के तहत "सही" दिखता है, इसलिए मैंने वीसीएल के लिए स्रोत कोड में देखा कि वे सूची दृश्य देखने के लिए किस प्रकार का जादू कर रहे हैं विंडोज एक्सप्लोरर में सूची नियंत्रण की तरह। मैं कोड की एक पंक्ति है कि होनहार देखा पर ठोकर खाई:

SetWindowTheme(Handle, 'explorer', nil); 

SDK दस्तावेज़ से, इस समारोह "की तुलना में अपने वर्ग सामान्य रूप से उपयोग करता है दृश्य शैली जानकारी का एक अलग सेट का उपयोग करने के लिए एक खिड़की का कारण बनता है।"

तो, मैं अपने WinForms ListView नियंत्रण पर इस समारोह लागू की कोशिश की:

[DllImport("uxtheme.dll", CharSet = CharSet.Unicode)] 
public static extern int SetWindowTheme(IntPtr hWnd, String pszSubAppName, String pszSubIdList); 


SetWindowTheme(myListView.Handle, "explorer", null); 

... और, भगवान के द्वारा, यह काम किया! सूची दृश्य अंततः ऐसा लगता है कि यह बाकी ओएस के साथ आता है! धन्यवाद, बोर्लैंड Inprise Embarcadero! आप वास्तव में कुछ के लिए अच्छे हैं!

0

संपादित करें: अब यह भी मेरे लिए काम कर रहा है, सटीक हस्ताक्षर है:

<DllImport("uxtheme.dll", 
    BestFitMapping:=False, 
    CharSet:=CharSet.Unicode, 
    EntryPoint:="#136", 
    CallingConvention:=CallingConvention.Winapi)> 
    Private Shared Function SetWindowsTheme(ByVal handle As IntPtr, ByVal app As String, ByVal id As String) As Integer 
     ' Leave function empty - DLLImport attribute forwards calls to the right function 
    End Function 


Public Shared Sub MakeControlLookBeautiful(ByVal c As Windows.Forms.Control) 
    SetWindowsTheme(c.Handle, "explorer", Nothing) 
End Sub 

:)

1
Imports System.Runtime.InteropServices 

Public Class Form1 
    <DllImport("uxtheme", CharSet:=CharSet.Unicode)> _ 
    Public Shared Function SetWindowTheme(ByVal hWnd As IntPtr, ByVal textSubAppName As String, ByVal textSubIdList As String) As Integer 
    End Function 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     SetWindowTheme(lst.Handle, "explorer", Nothing) 
    End Sub 
End Class 

ऊपर कोड एक विजेता की तरह काम करेगा ...

संबंधित मुद्दे