Күрделі стандартты емес терезелерді құру
Айталық, бізде форма жасауға қажетті ВМР форматындағы сурет бар делік, ал ондағы ақ түс «бос кеңістікті» білдіреді деп есептейік. Форманы қалай жасау керек? Өте оңай, суреттегі барлық «ақ емес» пикселдерді алу керек, олардан регион координаттарын жасап, оны бізге қажетті терезеге бекіту қажет. Пикселдерді GetPixel талдай алады, бұл функция координаттар бойынша оның түсін қайтарады. Енді ВМР матрица үшін мынандай алгоритм жасап қарастырайық. Айта кету керек, талдау тармақ бойынша жүргізіледі және Pixel-дер регионға бір-бірлеп емес, тармақ арқылы топтап қосылады. Бұндай алгоритмдеу жолы процессор ресурстарын өте үнемдейді, өнімділік ұтысы 100 пайызға дейін жетеді.
Public Function lGetRegion(pic As PictureBox, lBackColor As Long) As Long
Dim lRgn As Long
Dim lSkinRgn As Long
Dim lStart As Long
Dim lX As Long
Dim lY As Long
Dim lHeight As Long
Dim lWidth As Long
'жұмысты бастайтын бос аудан құрамыз, ол үшін
lSkinRgn = CreateRectRgn(0, 0, 0, 0)
With pic
'суреттің өлшемін Pixel-мен есептейміз
lHeight = .Height / Screen.TwipsPerPixelY
lWidth = .Width / Screen.TwipsPerPixelX
For lX = 0 To lHeight - 1
lY = 0
Do While lY < lWidth
керекті Pixel-ді іздейміз
Do While lY < lWidth And GetPixel(.hDC, lY, lX) = lBackColor
lY = lY + 1
Loop
If lY < lWidth Then
lStart = lY
Do While lY < lWidth And GetPixel(.hDC, lY, lX) <> lBackColor
lY = lY + 1
Loop
If lY > lWidth Then lY = lWidth
'керекті Pixel табылған соң оны аумаққа қосамыз
lRgn = CreateRectRgn(lStart, lX, lY, lX + 1)
CombineRgn lSkinRgn, lSkinRgn, lRgn, RGN_OR
'удалим ненужный объект
DeleteObject lRgn
End If
Loop
Next
End With
lGetRegion = lSkinRgn
End Function
Сонымен, осы алгоритмді тәжірибеде қолдану үшін pTestRgnSkin үлгісін жүктеңіз де, оның кодын мұқият меңгеріңіз. Бұл жобада бізге қажетті сурет, ыңғайлылық үшін, ресурстар файлында «қорғалған», бұдан басқа жоба барлық қалыптастыру жүргізілетін Main үрдісі арқылы жіберіледі. Алдымен форма жүктеледі, содан кейін PictureBox-қа ресурстардан бізге қажетті сурет жүктеледі, содан соң регионды құратын функция шақыртылады, нәтижесінде соңғы кезеңде – регионды бізге қажетті терезеге бекіту орындалады. Бұл жерде ыңғайлылық үшін Windows жұмыс үстеліңізде «адасып қалмауы» үшін терезені «бәрінің үстіне» орналастыратын функция шақыртылады. Бұдан басқа, программа қалыпты жұмыс істеуі үшін PictureBox үшін AutoRedraw қасиеті True-де орнатылуы тиіс, әйтпесе, ешқандай жақсы нәтиже шықпайды. Ол былай жазылады:
Sub Main()
Dim lRgn As Long
Load frmTestRgnSkin
frmTestRgnSkin.pic.Picture = LoadResPicture(101, vbResBitmap)
lRgn = lGetRegion(frmTestRgnSkin.pic, vbWhite)
SetWindowRgn frmTestRgnSkin.hWnd, lRgn, True
DeleteObject lRgn
frmTestRgnSkin.Show
SetFormPosition frmTestRgnSkin.hWnd, True
End Sub
Енді жобаны іске қосуға болады. Терезе PictureBox-те көрсетілген сурет бойынша өз формасын динамикалы түрде өзгертіп отыруы үшін терезе формасын динамикалық түрде өзгерту керек?
Достарыңызбен бөлісу: |