Форум » GUI » разрушение экрана при многократном определении/закрытии внутренних окон » Ответить

разрушение экрана при многократном определении/закрытии внутренних окон

Avf: Использование DRAW TEXT в процедуре ON POINT пр определении окна приводит к тому, что прb дальнейшем многократном определении окон на каком-то этапе происходит разрушение экрана Windows(цвета, шрифты и т.п.) Пример (просто для иллюстрации): #include "minigui.ch" Function Main DEFINE WINDOW Form_1 ; AT 0,0 ; WIDTH 800 HEIGHT 600 ; TITLE 'Demo for Gradient Background' ; MAIN ICON 'MAIN' NOMAXIMIZE NOSIZE ; ON PAINT ( FillBlue(_HMG_MainHandle), TextPaint() ) @ 60,60 BUTTON Btn_Start CAPTION "Start!" ACTION NonStop100() DEFAULT DRAW TEXT IN WINDOW Form_1 AT 10, 14 ; VALUE "Program Setup" ; FONT "Verdana" SIZE 24 BOLD ITALIC ; FONTCOLOR WHITE TRANSPARENT DRAW TEXT IN WINDOW Form_1 AT Form_1.Height - 54, Form_1.Width - 230 ; VALUE "Copyright (c) 2003 by Grigory Filatov" ; FONT "Tahoma" SIZE 10 ITALIC ; FONTCOLOR WHITE TRANSPARENT END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 Return Nil function TextPaint() /* DRAW TEXT IN WINDOW Form_1 AT 10, 14 ; VALUE "Program Setup" ; FONT "Verdana" SIZE 24 BOLD ITALIC ; FONTCOLOR WHITE TRANSPARENT DRAW TEXT IN WINDOW Form_1 AT Form_1.Height - 54, Form_1.Width - 230 ; VALUE "Copyright (c) 2003 by Grigory Filatov" ; FONT "Tahoma" SIZE 10 ITALIC ; FONTCOLOR WHITE TRANSPARENT */ Return Nil func NonStop100 local i for i=1 to 500 NonStop() next retu #define MsgInfo( c ) MsgInfo( c, , , .f. ) PROCEDURE NonStop() LOCAL nSeconds := 0, nCount := 1, lLoop := .T. DEFINE WINDOW NonStop ; AT 0,0 ; WIDTH 190 HEIGHT 90 ; TITLE "Working..." ; MODAL NOSYSMENU NOSIZE ; ON RELEASE IF( lLoop, ( lLoop := .F., MsgInfo( "Aborted by user request!" ) ), ) @ 10,10 LABEL Lbl_Title VALUE "This window will be closed in" AUTOSIZE @ 30,60 LABEL Lbl_Progress VALUE "" AUTOSIZE ON KEY ESCAPE ACTION NonStop.Release() END WINDOW CENTER WINDOW NonStop ACTIVATE WINDOW NonStop NOWAIT DO WHILE nCount > 0 .AND. lLoop IF ABS( SECONDS() - nSeconds ) >= 1 nCount-- NonStop.Lbl_Progress.Value := LTRIM( STR( nCount ) ) + " second" + IF(nCount > 1, "s", "") nSeconds := SECONDS() ENDIF DO EVENTS ENDDO IF lLoop NonStop.Hide() lLoop := .F. NonStop.Release() DO MESSAGE LOOP ENDIF RETURN #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" HB_FUNC( FILLBLUE ) { HWND hwnd; HBRUSH brush; RECT rect; HDC hdc; int cx; int cy; int blue = 200; int steps; int i; hwnd = (HWND) hb_parnl (1); hdc = GetDC(hwnd); GetClientRect(hwnd, &rect); cx = rect.top; cy = rect.bottom; steps = (cy - cx) / 3; rect.bottom = 0; for( i = 0 ; i < steps ; i++ ) { rect.bottom += 3; brush = CreateSolidBrush( RGB(0, 0, blue) ); FillRect(hdc, &rect, brush); DeleteObject(brush); rect.top += 3; blue -= 1; } ReleaseDC(hwnd, hdc); hb_ret(); } #pragma ENDDUMP

Ответов - 7

Петр: Не могу подтвердить - запускал подряд трижды - никакого разрушения экрана Windows не увидел. Может у вас проблемы с железом?

Avf: забыл убрать комментарий /* DRAW TEXT IN WINDOW Form_1 AT 10, 14 ; VALUE "Program Setup" ; FONT "Verdana" SIZE 24 BOLD ITALIC ; FONTCOLOR WHITE TRANSPARENT DRAW TEXT IN WINDOW Form_1 AT Form_1.Height - 54, Form_1.Width - 230 ; VALUE "Copyright (c) 2003 by Grigory Filatov" ; FONT "Tahoma" SIZE 10 ITALIC ; FONTCOLOR WHITE TRANSPARENT */

Петр: Так - все правильно, все довольно миленько разрушается, понравилось . Но это пример - как не надо использовать библиотеку. Смотрите SetThemes и обработку события WM_PAINT


Avf: В SetThemes перерисовываются только кнопки или рисунки, текста на экране нет. Разрушение не зависит от типа определяемого внутреннего окна ( NO WAIT просто для примера - чтобы не нажимать клавиши )

Петр: Avf пишет: В SetThemes перерисовываются только кнопки или рисунки, текста на экране нет. В обработчике WM_PAINT вы можете делать все, что пожелаете, в т.ч. и выводить текст. Avf пишет: Разрушение не зависит от типа определяемого внутреннего окна ( NO WAIT просто для примера - чтобы не нажимать клавиши ) Я и этого не писал. Вам надо решить конкретную задачу или выразить свое мнение по поводу реализации некоторых вещей в MiniGUI?

AM: Петр пишет: В обработчике WM_PAINT вы можете делать все, что пожелаете, в т.ч. и выводить текст. А как там задавать шрифт (размер, жирность и проч.)? Т.е. как сделать что-то вроде: hOldFont := SelectObject( hDC, _HMG_aControlFontHandle [ i ] ) (из C:\MiniGUI\SAMPLES\Advanced\SetThemes\demo.prg ), только с конкретными параметрами?

AM: Что-то никто не ответил - я сам нашёл: hOldFont=SelectObject(hDC,SetFontNameSize(hDC,,9,0,0,0,0)) А кто ответит вот на что: если картинка рисуется довольно долго (т.к. данные для неё берутся из файла), и пришёл запрос на рисование новой картинки - как прервать старую, есть такое средство, или нет другого выхода, кроме как ждать, когда нарисуются все старые варианты?



полная версия страницы