WM_DRAWITEM SysTabControl32 перекрашивается?
Я должен изменить стиль нашего SysTabControl32, поэтому я пытаюсь использовать TCS_OWNERDRAWFIXED и WM_DRAWITEM. Все работает хорошо, но кажется, что вкладки по-прежнему перекрашены системой.
К сожалению, код находится в Visual Objects, что усложняет ситуацию. Я уже много чего перепробовал за последние часы и пока что ничего не понимаю. Может быть, некоторые из вас, ребята, могут помочь или дать подсказку маме.
Вот несколько картинок:
"Голый" Tabcontrol с TCS_OWNERDRAWFIXED. Нет кода на WM_DRAWITEM.
Вы заметите, что вкладки не заполнены, но 3D-стиль окрашен. И это моя главная проблема, потому что, насколько я знаю, этого не должно быть.
https://www.bilder-upload.eu/upload/a28168-1556197695.png
Собственные вкладки с текстом и цветом фона (некрасиво, но полезно, чтобы увидеть проблему)
https://www.bilder-upload.eu/upload/ca9d30-1556197633.png
Тот же TabControl, но с установленными TCS_FLATBUTTONS и TCS_EX_FLATSEPARATORS. Еще проблема с серым фоном.
https://www.bilder-upload.eu/upload/be982a-1556197811.png
Как вы знаете, WM_DRAWITEM будет перехватываться в родительском окне. Я также пытался перезаписать или игнорировать WM_PAINT в самом TabControl. Но это не помогает.
Также я играл с WM_ERASEBKGND, но я застрял на этом этапе.
На всех страницах, начиная с codeplex до codeguru или даже vbAccelerator, он должен работать. Должен:) Не знаю, если это визуальные объекты, но API являются API, и это все еще стандартный элемент управления.
WM_DRAWITEM содержит этот код, который выглядит нормально. Элемент DRAWITEMSTRUCT.
hdc := item.hdc
tabIndex := item.itemID
lSelected := (item.itemState == ODS_SELECTED)
wBrush := CreateSolidBrush(RGB(128,128,255))
FillRect(hdc, @item.rcItem, wBrush)
DeleteObject(wBrush)
SetBkMode(hdc,TRANSPARENT)
tTI := MemAlloc(_SizeOf(_winTC_ITEM))
tTI.cchTextMax := 255
tTI.pszText := String2Psz(Buffer(255))
tTI.mask := TCIF_TEXT
lr := SendMessage(item.hwndItem, TCM_GETITEM, item.itemID, LONG(_CAST, tTI))
if (lr != 0)
if (lSelected)
SetTextColor(hdc,RGB(255,0,0))
ELSE
SetTextColor(hdc,RGB(0,0,255))
ENDIF
DrawText(hdc,tTI.pszText,-1,@item.rcItem, _OR(DT_SINGLELINE, DT_VCENTER, DT_CENTER))
ENDIF
MemFree(tTI)
0 ответов
Это мой трюк для пользовательского рисования SysTabControl32
RECT defaultRect = lpDrawItemStruct->rcItem;
//
// Begin of WM_DRAWITEM, we clear the clip rect
SelectClipRgn(lpDrawItemStruct->hDC, NULL);
..
..
..
// End of WM_DRAWITEM, we create a clip rect to disable default system border
ExcludeClipRect(lpDrawItemStruct->hDC,
defaultRect.left - 3,
defaultRect.top - 2,
defaultRect.right + 3,
defaultRect.bottom + 2);
Ссылка:https://github.com/pladaria/emule/blob/master/srchybrid/ClosableTabCtrl.cpp