Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konu başlığında, özel denetimlere veya sahip tarafından çizilmiş denetimlere görsel stilleri uygulamak için görsel stiller API'sinin nasıl kullanılacağı açıklanmaktadır.
- Görsel Stiller ile Çizim Denetimleri
- Tema Değişikliklerine yanıt
- İlgili konular
Görsel Stillerle Çizim Kontrolleri
Görsel stiller ComCtrl32.dll sürüm 6 ve üzeri tarafından desteklenir. Uygulamanız ComCtrl32.dll sürüm 6 ve üzerini kullanacak şekilde yapılandırılmışsa ve bu sürüm sistemde kullanılabiliyorsa, geçerli görsel stiller uygulamanızdaki tüm yaygın denetimlere otomatik olarak uygulanır. Ancak, geçerli görsel stilleri özel denetimlere veya sahip tarafından çizilmiş denetimlere otomatik olarak uygulanmaz. Uygulamanız, görsel stillerin kullanılabilir olup olmadığını denetleyebilen ve varsa görsel stilleri API'sini kullanarak seçili durumdaki görsel stilleri özel ve sahip tarafından çizilmiş denetimlerinize uygulayan kod içermelidir.
Görsel stillerin kullanılabilir olup olmadığını denetlemek için IsAppThemed işlevini çağırın. Görsel stiller kullanılamıyorsa, denetimi çizmek için geri dönüş kodunu kullanın.
Görsel stiller kullanılabiliyorsa, denetiminizi işlemek için DrawThemeText gibi görsel stiller işlevlerini kullanabilirsiniz. DrawThemeTextEx, metnin görünümünü özelleştirmenize olanak sağladığını ve tema yazı tipinin bazı özelliklerini koruyarak diğerlerini değiştirebileceğinizi unutmayın.
Geçerli görsel stilinde denetimi çizmek için
- Görsel stilleri uygulamak istediğiniz denetimin hwnd ve denetimin türünü açıklayan bir sınıf listesi geçirerek OpenThemeDataçağırın. Sınıflar Vssym32.h içinde tanımlanır. OpenThemeData bir HTHEME tanıtıcısı döndürür, ancak görsel stilleri yöneticisi devre dışı bırakılırsa veya geçerli görsel stili belirli bir denetim için belirli bilgiler sağlamazsa, işlev null döndürür. Dönüş değeri NULLise, görsel olmayan stiller çizim işlevlerini kullanın.
- Denetim arka planını çizmek için, DrawThemeBackground veya DrawThemeBackgroundExçağırın.
- İçerik dikdörtgeninin konumunu belirlemek için getThemeBackgroundContentRectçağırın.
- Metni işlemek için, DrawThemeText veya DrawThemeTextExkullanın; GetThemeBackgroundContentRecttarafından döndürülen dikdörtgenin koordinatlarını temel alın. Bu işlevler, belirli bir denetim parçası ve durumu için temanın yazı tipiyle veya cihaz bağlamında (DC) şu anda seçili olan yazı tipiyle metin görüntüleyebilir.
- Kontrolünüz bir WM_DESTROY iletisi aldığında, OpenThemeDataçağırdığınızda döndürülen tema tutamacını serbest bırakmak için CloseThemeData çağırın.
Aşağıdaki örnek kod, geçerli görsel stilinde bir düğme denetimi çizmenin bir yolunu gösterir.
HTHEME hTheme = NULL;
hTheme = OpenThemeData(hwndButton, L"Button");
// ...
DrawMyControl(hDC, hwndButton, hTheme, iState);
// ...
if (hTheme)
{
CloseThemeData(hTheme);
}
void DrawMyControl(HDC hDC, HWND hwndButton, HTHEME hTheme, int iState)
{
RECT rc, rcContent;
TCHAR szButtonText[255];
HRESULT hr;
size_t cch;
GetWindowRect(hwndButton, &rc);
GetWindowText(hwndButton, szButtonText,
(sizeof(szButtonText) / sizeof(szButtonText[0])+1));
hr = StringCchLength(szButtonText,
(sizeof(szButtonText) / sizeof(szButtonText[0])), &cch);
if (hTheme)
{
hr = DrawThemeBackground(hTheme, hDC, BP_PUSHBUTTON, iState, &rc, 0);
if (SUCCEEDED(hr))
{
hr = GetThemeBackgroundContentRect(hTheme, hDC, BP_PUSHBUTTON,
iState, &rc, &rcContent);
}
if (SUCCEEDED(hr))
{
hr = DrawThemeText(hTheme, hDC, BP_PUSHBUTTON, iState,
szButtonText, cch,
DT_CENTER | DT_VCENTER | DT_SINGLELINE,
0, &rcContent);
}
}
else
{
// Draw the control without using visual styles.
}
}
Aşağıdaki örnek kod, alt sınıflanmış düğme denetimi için WM_PAINT ileti işleyicisindedir. Denetim için metin, görsel stil yazı tipinde çizilir, ancak denetimin durumuna bağlı olarak renk uygulamaya göre belirlenir.
// textColor is a COLORREF whose value has been set according to whether the button is "hot".
// paint is the PAINTSTRUCT whose members are filled in by BeginPaint.
HTHEME theme = OpenThemeData(hWnd, L"button");
if (theme)
{
DTTOPTS opts = { 0 };
opts.dwSize = sizeof(opts);
opts.crText = textColor;
opts.dwFlags |= DTT_TEXTCOLOR;
WCHAR caption[255];
size_t cch;
GetWindowText(hWnd, caption, 255);
StringCchLength(caption, 255, &cch);
DrawThemeTextEx(theme, paint.hdc, BP_PUSHBUTTON, CBS_UNCHECKEDNORMAL,
caption, cch, DT_CENTER | DT_VCENTER | DT_SINGLELINE,
&paint.rcPaint, &opts);
CloseThemeData(theme);
}
else
{
// Draw the control without using visual styles.
}
Diğer denetimlerden parçalar kullanabilir ve her bölümü ayrı ayrı işleyebilirsiniz. Örneğin, bir ızgaradan oluşan bir takvim denetimi için, tema tanıtıcısını aşağıdaki gibi alarak ızgara tarafından oluşturulan her kareyi bir araç çubuğu düğmesi olarak ele alabilirsiniz.
OpenThemeData(hwnd, L"Toolbar");
Belirli bir denetim için OpenThemeData birden çok kez çağırarak ve farklı parçalar çizmek için uygun tema tutamacını kullanarak denetim bölümlerini karıştırabilir ve eşleştirebilirsiniz. Ancak bazı görsel stillerde, bazı parçalar diğer parçalar ile uyumlu olmayabilir.
Etkin görsel stilindeki denetimleri işlemeye ilişkin bir diğer yaklaşım da sistem renklerini kullanmaktır. Örneğin, DrawThemeTextEx işlevini çağırırken metin rengini ayarlamak için sistem renklerini kullanabilirsiniz. Çoğu sistem rengi, görsel stil dosyası uygulandığında ayarlanır.
Tema Değişikliklerine Yanıt Verme
Denetiminiz bir WM_THEMECHANGED iletisi aldığında ve temanın genel bir tanıtıcısını elinde tuttuğunda aşağıdakileri yapmalıdır:
- Mevcut tema tutamacını kapatmak için CloseThemeDataçağırın.
- Yeni yüklenen görsel stiline ilişkin tema tanıtıcısını almak için OpenThemeData çağrısını yapın.
Aşağıdaki örnekte iki çağrı gösterilmektedir.
case WM_THEMECHANGED:
CloseThemeData (g_hTheme);
g_hTheme = OpenThemeData (hwnd, L"MyClassName");
İlgili konular