Автор | Сообщение |
|
| |
Пост N: 2
Зарегистрирован: 19.10.05
|
|
Отправлено: 30.10.07 21:02. Заголовок: разрушение экрана при многократном определении/закрытии внутренних окон
Использование 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
[только новые]
|
|
|
| постоянный участник
|
Пост N: 304
Зарегистрирован: 09.10.06
|
|
Отправлено: 30.10.07 21:46. Заголовок: Не могу подтвердить ..
Не могу подтвердить - запускал подряд трижды - никакого разрушения экрана Windows не увидел. Может у вас проблемы с железом?
|
|
|
|
| |
Пост N: 3
Зарегистрирован: 19.10.05
|
|
Отправлено: 30.10.07 23:06. Заголовок: забыл убрать коммент..
забыл убрать комментарий /* 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 */
|
|
|
|
| постоянный участник
|
Пост N: 305
Зарегистрирован: 09.10.06
|
|
Отправлено: 31.10.07 09:31. Заголовок: Так - все правильно,..
Так - все правильно, все довольно миленько разрушается, понравилось . Но это пример - как не надо использовать библиотеку. Смотрите SetThemes и обработку события WM_PAINT
|
|
|
|
| |
Пост N: 4
Зарегистрирован: 19.10.05
|
|
Отправлено: 01.11.07 01:45. Заголовок: В SetThemes перерисо..
В SetThemes перерисовываются только кнопки или рисунки, текста на экране нет. Разрушение не зависит от типа определяемого внутреннего окна ( NO WAIT просто для примера - чтобы не нажимать клавиши )
|
|
|
|
| постоянный участник
|
Пост N: 309
Зарегистрирован: 09.10.06
|
|
Отправлено: 01.11.07 09:54. Заголовок: Avf пишет: В SetThe..
Avf пишет: цитата: | В SetThemes перерисовываются только кнопки или рисунки, текста на экране нет. |
| В обработчике WM_PAINT вы можете делать все, что пожелаете, в т.ч. и выводить текст. Avf пишет: цитата: | Разрушение не зависит от типа определяемого внутреннего окна ( NO WAIT просто для примера - чтобы не нажимать клавиши ) |
| Я и этого не писал. Вам надо решить конкретную задачу или выразить свое мнение по поводу реализации некоторых вещей в MiniGUI?
|
|
|
|
| |
Пост N: 89
Зарегистрирован: 15.12.06
|
|
Отправлено: 03.03.08 11:25. Заголовок: Петр пишет: В обраб..
Петр пишет: цитата: | В обработчике WM_PAINT вы можете делать все, что пожелаете, в т.ч. и выводить текст. |
| А как там задавать шрифт (размер, жирность и проч.)? Т.е. как сделать что-то вроде: hOldFont := SelectObject( hDC, _HMG_aControlFontHandle [ i ] ) (из C:\MiniGUI\SAMPLES\Advanced\SetThemes\demo.prg ), только с конкретными параметрами?
|
|
|
|
| |
Пост N: 90
Зарегистрирован: 15.12.06
|
|
Отправлено: 06.03.08 12:49. Заголовок: Туда же
Что-то никто не ответил - я сам нашёл: hOldFont=SelectObject(hDC,SetFontNameSize(hDC,,9,0,0,0,0)) А кто ответит вот на что: если картинка рисуется довольно долго (т.к. данные для неё берутся из файла), и пришёл запрос на рисование новой картинки - как прервать старую, есть такое средство, или нет другого выхода, кроме как ждать, когда нарисуются все старые варианты?
|
|
|
|