Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Рисование на PictureBox :)


Автор: kulibin 7.2.2006, 14:20
Взялся я писать свою дата-грид smile. И не плохо получается вроде - аж самому нравится smile. Токо вот беда - с рисованием мелкие помарки есть. Сто раз перепроверил вычисление координат - не помогает smile.
Использую для рисования PictureBox и родные барсиковские методики (без апи): Print, Line, PaintPicture.
Причём проблема как я понял именно в PaintPicture - при его использовании то, что им нарисовано иногда залазит немного выше чем я прошу по вертикали и немного дальше по горизонтали.
Собственно алгоритм то для всех ячеек один и прокручивается в цикле - т.е. это точно не мой бок. Был бы мой - повторялся бы на каждой ячейке, а не на каждой пятой-седьмой.
Думал на апи переписать - токо не большой я в этом профессионал. Сам то я смогу это сделать - но не охота терять время на это без полной уверенности что это поможет. Да и код усложнять тоже не охота - он там уже не маленький и растёт постоянно и очень шустро smile.
Если кто занимался сурёзно рисованием на picturebox - скажите плз что бы это значило.
Спасибо.

Кстати - не так то это сложно - свой грид нарисовать smile. Всем рекоммендую кто гридами пользуется smile. Родной то барсиковский топорный очень. А флексюхой я долгое время пользовался - возможностей больше, но геморойно. А главное - тяжело под большие объёмы данных её пользовать. Я пытался сделать прорисовку в ней токо того, что на экран влазит. Но потом мне знакомый один сказал - а не легче ли будет свой грид сделать? я решил проверить smile - правда легче. А главное - функциональность для конкретных моих задач затачиваю.
Вот кому интересно картинка прилагается smile
Добавлено @ 14:22
Упс - картинка не захотела прикрепляться smile. Вот она:

Автор: ~FoX~ 7.2.2006, 16:32
kulibin
Ну ты хоть кусочек кода то покажи и картинку где смещение показано...

Автор: kulibin 7.2.2006, 18:17
так картинка прикреплена к предыдущему посту. Смещение то не большое там smile - однако хочется чтобы его там не было вообще.
вот код, рисующий грид:
Код

Private Sub PaintGrid()
'Debug.Print "Paint! " & mCols(1).Width
Dim ScrRows As Long ', ScrCols As Long
pGRD.cls
vSB.Max = mRS.RecordCount
vSB.LargeChange = pGRD.Height / pCell.Height
'HEADER:
Dim c As Byte, r As Long, s As String, selR As Boolean, curC As Boolean
Dim ColIndex As Byte
pGRD.CurrentX = 0: pGRD.CurrentY = 0
For c = leftCol To mCols.Count
DrowCell mCols(c).Caption, mCols(c), 10848650, True
Next c
'ëèíèÿ-ðàçäåëèòåëü:
'pGRD.Line Step(0, pGRD.CurrentY)-Step(SumColsWidth, 20), vbWhite, BF
'DATA:
Dim clr As OLE_COLOR
pGRD.CurrentX = 0
pGRD.CurrentY = pGRD.CurrentY + pCell.Height
For r = TRwAPos To LRwAPos
mRS.AbsolutePosition = r
If CRwAPos = r Then selR = True Else selR = False
If CDbl(r) / 2# <> Int(r / 2) Then clr = 16513015 Else clr = 16777215 '15852772
For c = leftCol To mCols.Count
If selR And c = CurCol Then curC = True Else curC = False
 If Not IsNull(mRS.Fields(mCols(c).dFild)) Then s = mRS.Fields(mCols(c).dFild) Else s = ""
If selR Then
    If c = 1 Then
        ColIndex = 1
    ElseIf c = mCols.Count Then
        ColIndex = 2
    Else
        ColIndex = 0
    End If
Else
End If
DrowCell s, mCols(c), clr, , selR, curC, ColIndex
Next c
pGRD.CurrentY = pGRD.CurrentY + pCell.Height
pGRD.CurrentX = 0
Next r
mRS.Bookmark = CRwBM
End Sub

Private Sub DrowCell(txt As String, CurCol As Variant, BckClr As OLE_COLOR, _
    Optional HDR As Boolean = False, Optional SelRw As Boolean = False, _
    Optional curCell As Boolean = False, Optional ColPos As Byte = 0)
With pCell
    'If HDR Then .BackColor = 11894146 Else .BackColor = vbWhite
    If Not HDR Then .FontBold = CurCol.FBold Else .FontBold = True
    .Width = CurCol.Width
    If Not HDR Then .ForeColor = CurCol.FColor Else .ForeColor = vbWhite
    .CurrentY = .Height * 0.1 '(.TextHeight("") * 1.2 - .TextHeight("")) / 2
    If SelRw Then BckClr = 16775408 
    .BackColor = BckClr
End With
If HDR Then GoTo HdrRow
Select Case CurCol.TextAlign
Case colAlignLeft
HdrRow:
    pCell.CurrentX = 30
Case colAlignRight
    pCell.CurrentX = pCell.Width - pCell.TextWidth(txt) - 30
Case Else

End Select
pCell.Print txt
'If curCell Then Stop
pCell.CurrentX = 0: pCell.CurrentY = 0
If curCell Then
    pCell.Line Step(0, 0)-Step(pCell.Width - 15, pCell.Height - 10), 16727614, B
ElseIf HDR Then
    pCell.Line Step(pCell.Width - 10, 0)-Step(pCell.Width - 10, pCell.Height), 16777215, B
ElseIf SelRw Then
    If ColPos = 1 Then
        pCell.Line Step(pCell.Width - 10, 0)-Step(pCell.Width - 10, pCell.Height), 16777215, B
        pCell.CurrentX = 0: pCell.CurrentY = 0
        pCell.Line Step(0, 0)-Step(pCell.Width + 10, pCell.Height - 10), 16769217, B
    ElseIf ColPos = 2 Then
        pCell.Line Step(-50, 0)-Step(pCell.Width + 35, pCell.Height - 10), 16769217, B
    Else
        pCell.Line Step(pCell.Width - 15, 0)-Step(pCell.Width - 15, pCell.Height), 16777215, B
        pCell.CurrentX = 0: pCell.CurrentY = 0
        pCell.Line Step(-50, 0)-Step(pCell.Width + 100, pCell.Height - 10), 16769217, B
    End If
Else
    pCell.Line Step(pCell.Width - 10, 0)-Step(pCell.Width - 10, pCell.Height), 15720158, B
End If
pGRD.PaintPicture pCell.Image, pGRD.CurrentX, pGRD.CurrentY
pGRD.CurrentX = pGRD.CurrentX + pCell.Width
End Sub



Переменные в коде:
pGRD - PictureBox в котором таблица вся рисуется
pCell - PictureBox в котором рисуестя ячейка таблицы
mCols - коллекция, в которой хранятся настройки по каждому столбцу - ширина, цвет текста, выравнивание и т.п.
LeftCol - переменная, хранящая номер первого столбца на экране - для горизонтальной прокрутки
ScrRows - к-во строк, влезающее на экран (рисуются только они)
vSB - вертикальный скролбар
c, r - переменные для перебора в циклах соответственно столбцов и строк
CurCol - хранит номер столбца, в котором курсор
CRwAPos - хранит абсолютную позицию текущей записи в рекордсете
TRwAPos - то же для верхней строки на экране
LRwAPos - для последней строки на экране

там толщина линий сетки плывёт. Иногда фон проглядывает - возле тех же линий. На линиях курсора тоже толщина не одинаковая. Я сначала там DrowWidth ставил=1 - но линии вообще закрывались нижними и правыми ячейками. Поставил DrowWidth =2 - теперь они просто разной толщины.


Автор: Naghual 8.2.2006, 10:19
Дай описание коллекции mCols

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)