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 Глава |
>