ShIvADeSt
Да у меня в овнердрав процедуре же проверяется элемент в списке, больше ли -1 или нет он. Может как-то по другому надо проверять? Я думал что так логичнее ведь элементы же с нуля отсчитываются как бы, значит все что меньше нуля и не ноль - по другому отрисовываются.
[more=Скрытый текст]procedure CheckListBox_OnDrawItem(lpdis : PDRAWITEMSTRUCT);
var
tchBuffer : Array [0..MAX_PATH] of WideChar;
itemdata : LongInt;
BrushNew : hBrush;
BrushOld : hBrush;
PenBrush : hPen;
begin
if lpdis.ItemID > -1 then
begin
if ((lpdis.itemState and ODS_SELECTED) <> 0) then
begin
BrushNew := CreateSolidBrush(RGB(235, 235, 250));
BrushOld := SelectObject(lpdis.hdc, BrushNew);
FillRect(lpdis.hdc, lpdis.rcItem, BrushNew);
PenBrush := CreatePen(PS_SOLID, 1, RGB(65, 105, 225));
SelectObject(lpdis.hdc, PenBrush);
Rectangle(lpdis.hdc, lpdis.rcItem.Left, lpdis.rcItem.Top, lpdis.rcItem.Right, lpdis.rcItem.Bottom);
DeleteObject(PenBrush);
SetBkColor(lpdis.hdc, RGB(235, 235, 250));
SelectObject(lpdis.hdc, BrushOld);
DeleteObject(BrushNew);
SetBkMode(lpdis.hdc, TRANSPARENT);
SetTextColor(lpdis.hdc, RGB(255, 0, 0));
end
else
begin
FillRect(lpdis.hdc, lpdis.rcItem, GetSysColorBrush(COLOR_WINDOW));
SetBkColor(lpdis.hdc, GetSysColor(COLOR_WINDOW));
SetTextColor(lpdis.hdc, GetSysColor(COLOR_WINDOWTEXT));
if (lpdis.itemID mod 2) <> 0 then
begin
BrushNew := CreateSolidBrush(RGB(240, 240, 240));
BrushOld := SelectObject(lpdis.hdc, BrushNew);
FillRect(lpdis.hdc, lpdis.rcItem, BrushNew);
SetBkColor(lpdis.hdc, RGB(240, 240, 240));
SelectObject(lpdis.hdc, BrushOld);
DeleteObject(BrushNew);
end;
end;
if ((lpdis.itemState and ODS_FOCUS) <> 0) then
DrawFocusRect(lpdis.hdc, lpdis.rcItem);
itemdata := SendMessageW(lpdis.hwndItem, LB_GETITEMDATA, lpdis.itemID, 0);
if itemdata <> 0 then
begin
if InitThemeLibrary and UseThemes then
DrawThemeBackground(CheckTheme, lpdis.hdc, BP_CHECKBOX, CBS_CHECKEDNORMAL, Rect(lpdis.rcItem.Left + 2, lpdis.rcItem.Top + 2, lpdis.rcItem.Left + lpdis.rcItem.Bottom - lpdis.rcItem.Top - 1, lpdis.rcItem.Bottom - 2), nil)
else
DrawFrameControl(lpdis.hdc, Rect(lpdis.rcItem.Left + 2, lpdis.rcItem.Top + 2, lpdis.rcItem.Left + lpdis.rcItem.Bottom - lpdis.rcItem.Top - 1, lpdis.rcItem.Bottom - 2), DFC_BUTTON, DFCS_BUTTONCHECK or DFCS_CHECKED or DFCS_FLAT);
end
else
begin
if InitThemeLibrary and UseThemes then
DrawThemeBackground(CheckTheme, lpdis.hdc, BP_CHECKBOX, CBS_UNCHECKEDNORMAL, Rect(lpdis.rcItem.Left + 2, lpdis.rcItem.Top + 2, lpdis.rcItem.Left + lpdis.rcItem.Bottom - lpdis.rcItem.Top - 1, lpdis.rcItem.Bottom - 2), nil)
else
DrawFrameControl(lpdis.hdc, Rect(lpdis.rcItem.Left + 2, lpdis.rcItem.Top + 2, lpdis.rcItem.Left + lpdis.rcItem.Bottom - lpdis.rcItem.Top - 1, lpdis.rcItem.Bottom - 2), DFC_BUTTON, DFCS_BUTTONCHECK or DFCS_FLAT);
end;
SendMessageW(lpdis.hwndItem, LB_GETTEXT, lpdis.itemID, LPARAM(@tchBuffer));
lpdis.rcItem.Left := lpdis.rcItem.Left + 22;
lpdis.rcItem.Right := lpdis.rcItem.Right - 5;
DrawTextW(lpdis.hdc, @tchBuffer[0], -1, lpdis.rcItem, DT_SINGLELINE or DT_VCENTER);
end
else
begin
FillRect(lpdis.hdc, lpdis.rcItem, GetSysColorBrush(COLOR_WINDOW));
SetBkColor(lpdis.hdc, GetSysColor(COLOR_WINDOW));
SetTextColor(lpdis.hdc, GetSysColor(COLOR_WINDOWTEXT));
DrawTextW(lpdis.hdc, PWideChar(szEmptyStr), -1, lpdis.rcItem, DT_SINGLELINE or DT_VCENTER or DT_CENTER);
end;
end;[/more]
Хотя чего-то и чекбокс лепится и мусор, вобщем, я чего-то не пойму в чем ошибка...
Да у меня в овнердрав процедуре же проверяется элемент в списке, больше ли -1 или нет он. Может как-то по другому надо проверять? Я думал что так логичнее ведь элементы же с нуля отсчитываются как бы, значит все что меньше нуля и не ноль - по другому отрисовываются.
[more=Скрытый текст]procedure CheckListBox_OnDrawItem(lpdis : PDRAWITEMSTRUCT);
var
tchBuffer : Array [0..MAX_PATH] of WideChar;
itemdata : LongInt;
BrushNew : hBrush;
BrushOld : hBrush;
PenBrush : hPen;
begin
if lpdis.ItemID > -1 then
begin
if ((lpdis.itemState and ODS_SELECTED) <> 0) then
begin
BrushNew := CreateSolidBrush(RGB(235, 235, 250));
BrushOld := SelectObject(lpdis.hdc, BrushNew);
FillRect(lpdis.hdc, lpdis.rcItem, BrushNew);
PenBrush := CreatePen(PS_SOLID, 1, RGB(65, 105, 225));
SelectObject(lpdis.hdc, PenBrush);
Rectangle(lpdis.hdc, lpdis.rcItem.Left, lpdis.rcItem.Top, lpdis.rcItem.Right, lpdis.rcItem.Bottom);
DeleteObject(PenBrush);
SetBkColor(lpdis.hdc, RGB(235, 235, 250));
SelectObject(lpdis.hdc, BrushOld);
DeleteObject(BrushNew);
SetBkMode(lpdis.hdc, TRANSPARENT);
SetTextColor(lpdis.hdc, RGB(255, 0, 0));
end
else
begin
FillRect(lpdis.hdc, lpdis.rcItem, GetSysColorBrush(COLOR_WINDOW));
SetBkColor(lpdis.hdc, GetSysColor(COLOR_WINDOW));
SetTextColor(lpdis.hdc, GetSysColor(COLOR_WINDOWTEXT));
if (lpdis.itemID mod 2) <> 0 then
begin
BrushNew := CreateSolidBrush(RGB(240, 240, 240));
BrushOld := SelectObject(lpdis.hdc, BrushNew);
FillRect(lpdis.hdc, lpdis.rcItem, BrushNew);
SetBkColor(lpdis.hdc, RGB(240, 240, 240));
SelectObject(lpdis.hdc, BrushOld);
DeleteObject(BrushNew);
end;
end;
if ((lpdis.itemState and ODS_FOCUS) <> 0) then
DrawFocusRect(lpdis.hdc, lpdis.rcItem);
itemdata := SendMessageW(lpdis.hwndItem, LB_GETITEMDATA, lpdis.itemID, 0);
if itemdata <> 0 then
begin
if InitThemeLibrary and UseThemes then
DrawThemeBackground(CheckTheme, lpdis.hdc, BP_CHECKBOX, CBS_CHECKEDNORMAL, Rect(lpdis.rcItem.Left + 2, lpdis.rcItem.Top + 2, lpdis.rcItem.Left + lpdis.rcItem.Bottom - lpdis.rcItem.Top - 1, lpdis.rcItem.Bottom - 2), nil)
else
DrawFrameControl(lpdis.hdc, Rect(lpdis.rcItem.Left + 2, lpdis.rcItem.Top + 2, lpdis.rcItem.Left + lpdis.rcItem.Bottom - lpdis.rcItem.Top - 1, lpdis.rcItem.Bottom - 2), DFC_BUTTON, DFCS_BUTTONCHECK or DFCS_CHECKED or DFCS_FLAT);
end
else
begin
if InitThemeLibrary and UseThemes then
DrawThemeBackground(CheckTheme, lpdis.hdc, BP_CHECKBOX, CBS_UNCHECKEDNORMAL, Rect(lpdis.rcItem.Left + 2, lpdis.rcItem.Top + 2, lpdis.rcItem.Left + lpdis.rcItem.Bottom - lpdis.rcItem.Top - 1, lpdis.rcItem.Bottom - 2), nil)
else
DrawFrameControl(lpdis.hdc, Rect(lpdis.rcItem.Left + 2, lpdis.rcItem.Top + 2, lpdis.rcItem.Left + lpdis.rcItem.Bottom - lpdis.rcItem.Top - 1, lpdis.rcItem.Bottom - 2), DFC_BUTTON, DFCS_BUTTONCHECK or DFCS_FLAT);
end;
SendMessageW(lpdis.hwndItem, LB_GETTEXT, lpdis.itemID, LPARAM(@tchBuffer));
lpdis.rcItem.Left := lpdis.rcItem.Left + 22;
lpdis.rcItem.Right := lpdis.rcItem.Right - 5;
DrawTextW(lpdis.hdc, @tchBuffer[0], -1, lpdis.rcItem, DT_SINGLELINE or DT_VCENTER);
end
else
begin
FillRect(lpdis.hdc, lpdis.rcItem, GetSysColorBrush(COLOR_WINDOW));
SetBkColor(lpdis.hdc, GetSysColor(COLOR_WINDOW));
SetTextColor(lpdis.hdc, GetSysColor(COLOR_WINDOWTEXT));
DrawTextW(lpdis.hdc, PWideChar(szEmptyStr), -1, lpdis.rcItem, DT_SINGLELINE or DT_VCENTER or DT_CENTER);
end;
end;[/more]
Хотя чего-то и чекбокс лепится и мусор, вобщем, я чего-то не пойму в чем ошибка...