Что нового

"Корректная" работа с _WinAPI рисованием

ZlojBoter

Новичок
Сообщения
55
Репутация
0
Пытаюсь отрисовывать графику при помощи функций
Код:
_WinAPI_DrawLine
Код:
_WinAPI_DrawText
и
Код:
_WinAPI_DrawBitmap
. Все хорошо, однако, по видимому либо ресурс рисования ограничен(число самих отрисовок), либо, я делаю что-то не так. Суть примерно такова:
В клиенте игры рисую текст, линии, картинки(что-то типо радара), требуется определенное количество отрисовок в единицу времени. Программа работает определенное время, потом начинает глючить графика, она по сути пропадает либо частично либо полностью, и вообще программа начинает вести себя как-то не корректно. Закрываться через трей не хочет, это раз, приходится закрывать через диспетчер. Второе - вообще может повиснуть вся система.
Примерный код:
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <FontConstants.au3>
#include <WindowsConstants.au3>
#include <TreeViewConstants.au3>
#include <GUIConstants.au3>
#include <Date.au3>
#include <Array.au3> 
#include <Constants.au3>  
#Include <WinAPIex.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <GDIPlus.au3>
$dewi= @DesktopWidth-20
$dehe= @DesktopHeight-40
$hGUI = GUICreate("My GUI",$dewi,$dehe,0,0,$WS_POPUP,$WS_EX_LAYERED) ;прозрачное окно создается для того,чтобы уменьшить "мерцание" при перерисовке. Функцию планирую использовать для отрисовки "НАД" окном игры, где постоянно обновляется экран.
GUISetBkColor(0xABCDEF)
_WinAPI_SetLayeredWindowAttributes($hGUI, 0xABCDEF, 255,1)
WinSetOnTop($hGUI, "", 1) 
 $Shrift=15
GUISetState() 
$hDC =_WinAPI_GetWindowDC($hGUI)
$j=0
While 1
	For $i=1 To 360
$hFont = _WinAPI_CreateFont($Shrift, 0, $i*10, 0, 100, False, False, False, $DEFAULT_CHARSET, _
        $OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $NONANTIALIASED_QUALITY , 0, 'Courier New')	
$hOldFont = _WinAPI_SelectObject($hDC, $hFont)	
_WinAPI_SetTextColor($hDC, 0x0000FF)
_WinAPI_SetBkColor($hDC, 0x000000)
_WinAPI_SetBkMode($hDC, $TRANSPARENT)		
$tRECT = DllStructCreate($tagRect)
DllStructSetData($tRECT, "Left", 500)
DllStructSetData($tRECT, "Top", 500)
_WinAPI_DrawText($hDC, "Hello world!", $tRECT, $DT_LEFT+$DT_NOCLIP )
Sleep(10)	
_WinAPI_SetTextColor($hDC, 0xEFCDAB)
_WinAPI_SetBkColor($hDC, 0x000000)
_WinAPI_SetBkMode($hDC, $TRANSPARENT)		
$tRECT = DllStructCreate($tagRect)
DllStructSetData($tRECT, "Left", 500)
DllStructSetData($tRECT, "Top", 500)
_WinAPI_DrawText($hDC, "Hello world!", $tRECT, $DT_LEFT+$DT_NOCLIP )
$j=$j+1
ToolTip($j,0,0)
Next
WEnd

(в данном примере, у меня при достижении $j приблизительно 10000, тултип перестает отображаться и меню выхода через трей тоже глючит, и иногда вместо кнопки черный цвет, иногда не прожимается и так далее, но бывает и хуже)
Возможно, что перед каждым актом "перерисовки", где-то что-то нужно "освобождать"? Пробовал такие вещи типа:
Код:
_WinAPI_SelectObject($hDC, $hOldFont)
    _WinAPI_DeleteObject($hFont)
    _WinAPI_ReleaseDC(0, $hDC)
    _WinAPI_InvalidateRect(0, 0)

Не помогло.
Пытался кое какие функции вынести за цикл - результат: число отрисовок увеличивается, но все равно ограничивается. Число отрисовок может варьироваться в пределах примерно 2000-10000 раз(что не очень много, этого хватает на несколько минут максимум). Всегда фиксировано(в зависимости от того как я "оптимизирую" код).

У кого-нибудь есть идеи как сделать "грамотнее"? Буду рад любой помощи. Заранее спасибо.
 
Верх