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

Другие вопросы по тегам