Я реализовал панель инструментов панели задач DeskBand с помощью BandObjectLib ( Расширение проводника с помощью объектов Band с использованием .NET и Windows Forms ) из Codeproject, модифицированного поддержкой интерфейса IDeskBand2, который позволяет использовать меню «Пуск» в Windows Vista, чтобы сохранить прозрачность, когда моя панель инструментов на панели задач DeskBand включена. Однако текст, отображаемый в поле со списком или в текстовом поле, отображает цвет фона рабочего стола, смешанного с исходным цветом текста.
Метка не имеет этой проблемы, так как обычно она рисуется с использованием GDI (+), который игнорирует DWMComposition в отображаемом тексте (не в фоне метки).
Я понял, что проблема в том, что DWM работает в Vista в отношении определенных текстовых элементов, что объясняется на следующих страницах:
Использование элементов управления Vista на Aero Glass
Windows Vista Aero Pt. 1 - Добавление Glass в приложение Windows Forms
Добавление или модернизация Aero Glass в устаревшие приложения Windows
Я использую только комбинированный список на панели инструментов DeskBand, поэтому мне нужно только знать, как заставить комбинированный список не отображать с помощью DWM, даже если DWM включен в системе и включен на DeskBand посредством реализации IDeskBand2. интерфейс.
Обновление : я рассмотрел этот вопрос подробнее, и код C ++ на Добавление или переоборудование Aero Glass в устаревшие приложения Windows кажется наиболее вероятным вариантом для того, чтобы это заработало, поэтому в комбинированном списке отображаемый текст не прозрачен. Если кто-нибудь сможет взглянуть на этот код, относящийся только к списку, и помочь мне заставить его работать с списком C #, это сделает мой месяц! Я получил награду, чтобы надеяться получить ответ.
Ниже приведен класс EditProc.cpp из вышеупомянутого проекта, который должен обеспечить быстрый взгляд на то, что я рассматриваю как решение. Чтобы получить полную картину, вам нужно посмотреть на полный проект:
/*
*
* $RCSfile: aeroedit.cpp,v $
* $Source: /cvs/common/aeroedit.cpp,v $
* $Author: cvs $
* $Revision: 1.12 $
* $Date: 2007/05/20 10:38:25 $
* $State: Exp $
* Copyright (c) Stefan Kuhr
*/
#include <windows.h>
#include <tchar.h>
#include "safassrt.h"
#include "aaeroint.h"
#include "aerosubc.h"
#include "aeroglss.h"
#include <windowsx.h>
#include <gdiplus.h>
using namespace Gdiplus;
static void UpdateIfSelChanged(HWND hWnd, PAERO_SUBCLASS_WND_DATA pWndData)
{
DWORD dwFirst, dwLast;
SendMessage(hWnd, EM_GETSEL, (WPARAM)&dwFirst, (LPARAM)&dwLast);
if(dwFirst!=pWndData->m_dwSelFirst || dwLast!=pWndData->m_dwSelLast)
{
pWndData->m_dwSelFirst = dwFirst;
pWndData->m_dwSelLast = dwLast;
VERIFY(InvalidateRect(hWnd, NULL, TRUE));
VERIFY(UpdateWindow(hWnd));
}
}
static LRESULT CALLBACK EditProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PAERO_SUBCLASS_WND_DATA pWndData = (PAERO_SUBCLASS_WND_DATA)GetProp(hWnd, WINDOW_DATA_STRING);
ASSERT(pWndData);
ASSERT(pWndData->m_pDwmApiImpl);
WNDPROC pOldProc = pWndData->m_oldWndProc;
ASSERT(pOldProc);
PAERO_SUBCLASS_WND_DATA pWndDataParent = (PAERO_SUBCLASS_WND_DATA)GetProp(GetParent(hWnd), WINDOW_DATA_STRING);
///
/// if aero glass is turned off and if we are not in destruction code,
/// just call the original wnd proc we had prior to subclassing:
///
if(WM_DESTROY!=uMsg && WM_NCDESTROY!=uMsg && WM_DWMCOMPOSITIONCHANGED!=uMsg && pWndDataParent && !pWndData->m_pDwmApiImpl->IsDwmCompositionEnabled())
return CallWindowProc(pOldProc, hWnd, uMsg, wParam, lParam);
if(pWndData->m_uiRedrawMsg==uMsg && pWndData->m_dwFlags & WD_IN_PAINT_CONTROL)
{
HDC hdc = GetDC(hWnd);
hdc = GetDC(hWnd);
if(hdc)
{
RECT rcClient;
GetClientRect(hWnd, &rcClient);
BP_PAINTPARAMS params = { sizeof(BP_PAINTPARAMS) };
params.dwFlags = 0L;//BPPF_ERASE;
HDC hdcPaint = NULL;
HPAINTBUFFER hBufferedPaint = pWndData->m_pUxTheme->BeginBufferedPaint(hdc, &rcClient, BPBF_TOPDOWNDIB, ¶ms, &hdcPaint);
if (hdcPaint)
{
LONG_PTR dwStyle = GetWindowLongPtr(hWnd, GWL_STYLE);
DWORD_PTR dwSyscolorIdx = (dwStyle&WS_DISABLED || dwStyle&ES_READONLY)?COLOR_3DFACE:COLOR_WINDOW;
VERIFY(FillRect(hdcPaint, &rcClient, (HBRUSH)(dwSyscolorIdx+1)));
SendMessage(hWnd, WM_PRINTCLIENT, (WPARAM) hdcPaint, PRF_CLIENT|PRF_CHECKVISIBLE);
/// Make every pixel opaque
VERIFY(S_OK==pWndData->m_pUxTheme->BufferedPaintMakeOpaque_(hBufferedPaint, &rcClient));
VERIFY(S_OK==pWndData->m_pUxTheme->EndBufferedPaint(hBufferedPaint, TRUE));
}
VERIFY(1==ReleaseDC(hWnd, hdc));
pWndData->m_dwFlags &= ~WD_IN_PAINT_CONTROL;
}
return 1;
}
switch(uMsg)
{
case WM_KEYDOWN:
{
LONG_PTR dwStyle = GetWindowLongPtr(hWnd, GWL_STYLE);
if(dwStyle&WS_VSCROLL || dwStyle&ES_MULTILINE)
{
if(!(pWndData->m_dwFlags&WD_CARET_HIDDEN))
{
HideCaret(hWnd);
pWndData->m_dwFlags|=WD_CARET_HIDDEN;
}
}
}
break;
case WM_KEYUP:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MOUSELEAVE:
{
LONG_PTR dwStyle = GetWindowLongPtr(hWnd, GWL_STYLE);
if(dwStyle&WS_VSCROLL || dwStyle&ES_MULTILINE)
{
if(pWndData->m_dwFlags&WD_CARET_HIDDEN)
{
ShowCaret(hWnd);
pWndData->m_dwFlags&=~WD_CARET_HIDDEN;
}
UpdateIfSelChanged(hWnd, pWndData);
}
}
break;
case WM_NCPAINT:
{
LRESULT lRes = 0;
lRes = CallWindowProc(pOldProc, hWnd, uMsg, wParam, lParam);
DrawEditBorder(hWnd, pWndData);
return lRes;
}
case WM_NCDESTROY:
case WM_DESTROY:
VERIFY(UnsubclassControl(hWnd, EditProc, pWndData));
break;
}
return CallWindowProc(pOldProc, hWnd, uMsg, wParam, lParam);
}
BOOL AeroSubClassEdit(HWND hwnd)
{
return AeroSubClassControl(hwnd, EditProc, WD_IN_PAINT_CONTROL);
}
Спасибо,
Джон Реннемайер
МувЭнум, ООО