| Rapid-Q Documentation by William Yu (c)1999 | Глава 12 |
|
| |
DECLARE SUB CanvasPaint (Sender AS QCanvas)
CREATE Form AS QForm
CREATE Canvas AS QCanvas
OnPaint = CanvasPaint
END CREATE
ShowModal
END CREATE
SUB CanvasPaint (Sender AS QCanvas)
Sender.FillRect(10,10,100,100,&HFF0000) '-- Blue box Синий прямоугольник
END SUB
CREATE Form AS QForm
CREATE Canvas AS QCanvas
FillRect(10,10,100,100,&HFF0000) '-- Blue box
END CREATE
Form.ShowModal
END CREATE
Заметили что-нибудь? Да, синий прямоугольник не
появился. Сообщение для о необходимости рисования было послано когда форма
впервые появилать на экране и поскольку вы не написали какой-либо процедуры
OnPaint, то ничего и не нарисовалось. Что же на самом деле произошло с этим
FillRect кодом? На самом деле ничего,он выполнился, но следующее сообщение о
перерисовке стерло нарисованное.
Чтобы понять это
лучше, попробуем код, который рисует синий прямоугольник по нажатию кнопки
и попробуем свернуть и развернуть это окно.
DECLARE SUB ButtonClick
CREATE Form AS QForm
CREATE Button AS QButton
OnClick = ButtonClick
END CREATE
CREATE Canvas AS QCanvas
END CREATE
ShowModal
END CREATE
SUB ButtonClick
Canvas.FillRect(10,10,100,100,&HFF0000)
END SUB
Когда вы нажимаете на кнопку синий прямоугольник
рисуется, однако когда вы перерисовываете окно, прямоугольник исчезает.
DECLARE SUB CanvasPaint (Sender AS QCanvas)
DECLARE SUB ButtonClick (Sender AS QButton)
' Create bitmap for off-screen use
DIM BitMap AS QBITMAP
BitMap.Height = 100
BitMap.Width = 100
BitMap.Paint(0,0,0,0)
CREATE Form AS QForm
Center
Caption = "Simple graphics demonstration"
CREATE Canvas AS QCanvas
OnPaint = CanvasPaint
END CREATE
CREATE SquareButton AS QButton
Caption = "Draw Square"
OnClick = ButtonClick
Left = 150
END CREATE
CREATE CircleButton AS QButton
Caption = "Draw Circle"
OnClick = ButtonClick
Left = 150
Top = 50
END CREATE
CREATE LineButton AS QButton
Caption = "Draw Line"
OnClick = ButtonClick
Left = 150
Top = 100
END CREATE
ShowModal
END CREATE
SUB CanvasPaint (Sender AS QCanvas)
Sender.Draw(0,0,Bitmap.BMP)
END SUB
SUB ButtonClick (Sender AS QButton)
SELECT CASE Sender.Caption
CASE "Draw Square"
Bitmap.FillRect(10,10,50,50,&HFF0000)
CASE "Draw Circle"
Bitmap.Circle(10,60,50,110,&H0000FF,&H0000FF)
CASE "Draw Line"
Bitmap.Line(50,50,90,90,&H00FF00)
END SELECT
Canvas.Repaint '-- Tell Canvas to repaint itself.
END SUB
|

Фиксированный тип используется когда элементы
списка имеют одинаковую высоту
Но могут быть случаи, когда объекты,
например рисунки имеют разную высоту. В этом случае лучше использовать
список с переменной высотой элементов. Едиственная проблема в этом случае
заключается в необходимости задавать высоту каждого элемента программынм
способом. Эта задача возлагается на программиста
В большинстве случаев это не представляет большой проблемы, но необходимо где-то хранить эту дополнительную
информацию о высоте каждого элемента. Как это сделать в каждом случае выбираете вы сами.
Вы можете найти работающий пример перерисовываемых лист\комбобоксов в файле LISTBOX.BAS из архива EXAMPLES.ZIP
Вы можете переписать этот код для работы с комбобоксом. Заметьте, что вместо процедуры OnPaint используется процедура
OnDrawItem.
Code Детали:
SUB ListBoxDrawItem(Index AS INTEGER, State AS BYTE, Rect AS QRECT)
IF State = 0 THEN
'-- Selected
ListBox.FillRect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, &H00FF00)
ELSE
ListBox.FillRect(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, &HFFFFFF)
END IF
ListBox.TextOut(100, Rect.Top+(Rect.Bottom-Rect.Top)/4, ListBox.Item(index), 0, -1)
ListBox.Draw(Rect.Left, Rect.Top, Bitmap(Index).BMP)
END SUB
Надеюсь код достаточно понятен, но несколько моментов следует отметить.
Первое, это то, что не требуется полностью перерисовывать весь листбокс, правильнее посылать сообщение о
перерисовке каждый раз, когда элемент списка изменился.
Элемент занимает определенный прямоугольник в списке и сообщение OnDrawItem посылает информацию о нем через
параметр Rect. Вы не должны игнорировать этот шаг, эта возможность специально дана вам! (Другими словами не пытайтесь
рисовать вне региона, это не ваша задача!
Я не описываю работу с QstringGrid в этом разделе,но идея та же самая. Вы можете обрабатывать событие OnDrawCell так же как
OnDrawItem для списка.
| Prev Глава | Содержание | Next Глава |