On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение



Пост N: 8
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 12.09.07 07:26. Заголовок: Проблемы и ограничения обработки события OnSize для объекта Image


Проблема всплыла в очередной раз когда делал обработку изменения размеров окна так, чтобы объект Image с открытой картинкой также менял свой размер.
Делается это так.
Сначала меняется размер фрейма внутри которого показывается картинка.
Потом вычисляются новые границы для объекта Image.
Затем удаляется существующий объект Image
и создается новый с новыми границами.
Вроде такой способ показан в одном из примеров.
//----------------------------
static function wReSize()
local s
if wMain.Width<400; wMain.Width:=400; endif
if wMain.Height<657; wMain.Height:=657; endif
wMain.Frame_13.Height:=wMain.Height-wMain.Frame_13.Row-BottomBorder
wMain.Frame_13.Width:=wMain.Width-wMain.Frame_13.Col-RightBorder

GetImgZoneSize()
IF IsControlDefined( Image_1, wMain)
s:=wMain.Image_1.Picture
wMain.Image_1.Release
//ShowPicture(s)
ENDIF
return Nil
//----------------------------
function GetImgZoneSize()
imgCol:=wMain.Frame_13.Col+10
imgWidth:=wMain.Frame_13.Width-20
imgRow:=wMain.Frame_13.Row+20
imgHeight:=wMain.Frame_13.Height-30
return Nil
//----------------------------
function ShowPicture(cFile)
@ imgRow,imgCol IMAGE Image_1 OF wMain ;
PICTURE cFile ;
WIDTH imgWidth ;
HEIGHT imgHeight
return Nil
//----------------------------
Однако, как выяснилось, вызов обработчика события OnSize - функции wReSize() - происходит через каждый пиксел изменения размера окна. И здесь происходит какая-то шиза – картинка не видна на экране.
Закрыл вызов показа (см.текст), оставил только удаление объекта Image_1. Вызываю показ (создание нового объекта Image_1) отдельным нажатием и вижу, что появившаяся картинка частично перекрыта сверху прамоугольником с границами предыдущего удаленного объекта Image_1. Поэтому в предыдущем варианте – с постоянной перерисовкой вовремя ReSize – картинка была не видна , т.к. перекрывающий ее прямоугольник отличался размерами всего на один пиксел.
Причем, если окно с картинкой всплывает из-под окна другого приложения – то картинка видна полностью. А если в minimize и обратно – то частично.

Резюме.
1. Вопрос. Что это за шиза? Т.е. почему после удаления остается какой-то объект фонового цвета. И как с этим бороться?
2. Предложение. Вроде бы видел в какой-то системе типа Delphy события типа Befor_Resizing и After_Resizing. Первое событие – когда нажимается кнопка мыши на границе окна и производится вход в режим ReSize. Второе событие – когда отпускается кнопка мыши после ReSize. Удобно было бы иметь их в некоторых случаях. Чтобы не производить масштабных вычислений на каждый пиксел изменения размеров, а запомнить что нужно перед ReSize и пересчитать что нужно один раз после ReSize.
3. Замечание. В очередной раз столкнулся с отставанием в документации. Читаю про объект Image - An image static control can display bitmaps, icons (including animated icons), or enhanced metafiles. Начинаю искать способ показать JPG. А в примерах без всяких изысков в Image загружают и JPG, и GIF, и CUR

SadStar

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 25 , стр: 1 2 All [только новые]





Пост N: 12
Зарегистрирован: 05.06.07
ссылка на сообщение  Отправлено: 25.09.07 05:37. Заголовок: Refresh rulez


gfilatov пишет:

 цитата:
Попробуй использовать для обновления картинки метод Refresh, который поддерживается в последней версии библиотеки.


Это помогло. Картинку видно всегда.

По документации опять нестыковку нашел вроде бы.
В (x)harbour.chm из поставки нашел функцию FileCopy
FILECOPY(<cSourceFile>, <cTargetFile>, [<lMode>]) --> nCopyByte
Скомпилировал без ошибок.
При выполнении вылетает по ошибке на этой функции, хотя файл скопировался.
Смотрю внимательно документацию.
Вижу - Library is ct3.lib
У меня такой библиотеки нет, а компилятор не ругался.
Зато есть libct.lib. Вроде это тоже Clipper Tools.
Может в ней есть эта функция, только с другими параметрами?
Конечно обошелся без использования этих функций (FileCopy,FileMove),
"Осадок остался".




Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 563
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 25.09.07 16:26. Заголовок: Re:


SADSTAR2 пишет:

 цитата:
Зато есть libct.lib. Вроде это тоже Clipper Tools.
Может в ней есть эта функция, только с другими параметрами?



Да, есть. Ниже ее полные исходники:


/*
* Harbour Project source code:
* CT3 file functions:
* FILECOPY(), FILECOPEN(), FILECCLOSE(), FILEAPPEND()
*
* Program..: fcopy.prg
* Author...: Frederic J. Bell
* Dated....: Jun,17 94
* Revised..: Sep,20 94
* Purpose..: Replaces the following ca-tools functions which generate GPF's
* FileCopy(), FileCOpen() & FileAppend()!
* Relies on: Clipper (can you believe it!)
* Compile..: /n /m /w /[/p /b /l] /es2
* Notes....:
* No copyright - released into the public domain NSA.
*
* Copyright 2007 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
*
* added FILECDATI() and rewritten above functions for CT3 compatibility
* and some problems fixing,
*
* www - http://www.harbour-project.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/


#include "fileio.ch"
#include "common.ch"
#define F_BLOCK 512

STATIC s_hSrcFile := -1
STATIC s_lSetDaTi := .T.
STATIC s_fileDate, s_fileTime

/*
* FileCopy()
* This is a replacement for the CA-tools III function of the
* same name that causes GPF's.
*/
FUNCTION FILECOPY( cSource, cDest, lMode )
LOCAL hDstFile
LOCAL cBuffer := SPACE( F_BLOCK )
LOCAL lDone := .F.
LOCAL nSrcBytes, nDstBytes, nTotBytes := 0

IF !ISLOGICAL( lMode )
lMode := .F.
ENDIF
IF s_hSrcFile != -1
FCLOSE( s_hSrcFile )
ENDIF
s_hSrcFile := FOPEN( cSource, FO_READ )
IF s_hSrcFile != -1
hDstFile := FCREATE( cDest )
IF hDstFile != -1
DO WHILE !lDone
nSrcBytes := FREAD( s_hSrcFile, @cBuffer, F_BLOCK )
IF nSrcBytes == 0
lDone := 0
EXIT
ENDIF
nDstBytes := FWRITE( hDstFile, cBuffer, nSrcBytes )
IF nDstBytes > 0
nTotBytes += nDstBytes
ENDIF
IF nDstBytes < nSrcBytes
EXIT
ENDIF
ENDDO
FCLOSE( hDstFile )
IF lDone .OR. !lMode
FCLOSE( s_hSrcFile )
s_hSrcFile := -1
ENDIF
s_fileDate := FILEDATE( cSource )
s_fileTime := FILETIME( cSource )
IF s_lSetDaTi
SETFDATI( cDest, s_fileDate, s_fileTime )
ENDIF
ELSE
FCLOSE( s_hSrcFile )
s_hSrcFile := -1
ENDIF
ENDIF
RETURN nTotBytes


FUNCTION FILECOPEN()
RETURN s_hSrcFile != -1


FUNCTION FILECDATI( lNewMode )
LOCAL lOldMode := s_lSetDaTi
IF ISLOGICAL( lNewMode )
s_lSetDaTi := lNewMode
ENDIF
RETURN lOldMode


FUNCTION FILECCONT( cDest )
LOCAL hDstFile
LOCAL cBuffer := SPACE( F_BLOCK )
LOCAL lDone := .F.
LOCAL nSrcBytes, nDstBytes, nTotBytes := 0

IF s_hSrcFile != -1
hDstFile := FCREATE( cDest )
IF hDstFile != -1
DO WHILE !lDone
nSrcBytes := FREAD( s_hSrcFile, @cBuffer, F_BLOCK )
IF nSrcBytes == 0
lDone := 0
EXIT
ENDIF
nDstBytes := FWRITE( hDstFile, cBuffer, nSrcBytes )
IF nDstBytes > 0
nTotBytes += nDstBytes
ENDIF
IF nDstBytes < nSrcBytes
EXIT
ENDIF
ENDDO
FCLOSE( hDstFile )
IF lDone
FCLOSE( s_hSrcFile )
s_hSrcFile := -1
ENDIF
IF s_lSetDaTi
SETFDATI( cDest, s_fileDate, s_fileTime )
ENDIF
ENDIF
ENDIF
RETURN nTotBytes


FUNCTION FILECCLOSE()
IF s_hSrcFile != -1
FCLOSE( s_hSrcFile )
s_hSrcFile := -1
RETURN .T.
ENDIF
RETURN .F.


FUNCTION FILEAPPEND( cSrc, cDest )
LOCAL cBuffer := Space( F_BLOCK )
LOCAL hSrcFile, hDstFile
LOCAL nSrcBytes, nDstBytes, nTotBytes := 0

hSrcFile := FOPEN( cSrc, FO_READ )
IF hSrcFile != -1
IF !FILE( cDest )
hDstFile := FCREATE( cDest )
ELSE
hDstFile := FOPEN( cDest, FO_WRITE )
FSEEK( hDstFile, 0, FS_END )
ENDIF

IF hDstFile != -1
DO WHILE .T.
nSrcBytes := FREAD( hSrcFile, @cBuffer, F_BLOCK )
IF nSrcBytes == 0
EXIT
ENDIF
nDstBytes := FWRITE( hDstFile, cBuffer, nSrcBytes )
IF nDstBytes < nSrcBytes
EXIT
ENDIF
nTotBytes += nDstBytes
ENDDO
FCLOSE( hDstFile )
ENDIF
FCLOSE( hSrcFile )
ENDIF
RETURN nTotBytes


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 20
Зарегистрирован: 31.05.07
ссылка на сообщение  Отправлено: 14.08.08 08:51. Заголовок: Подскажите пожалуйст..


Подскажите пожалуйста, как мне правильнее всего узнать какой видимый размер окна?
Я полагаю так, если объекту на форме установить .Col := 0 и сделать .Width := Form1.Width, правая граница объекта будет шире рабочей области окна. Таким образом выяснил, что размер окна это ширина - размер обрамления * 2.
Ладно, это все нормально, так типа и должно быть, просто минусуй 8 пикселов и все дела, но если пользователь стиль окна меняет, размер обрамления?
Как определить размер обрамления в окне?...
Не помню точно, в C++Builder или Delphi есть параметр окна InnerWidth | InnerHeight. Может я не внимательно доку листал?
Подскажите пожалуйста. Спасибо...

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 831
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 14.08.08 10:05. Заголовок: spair2k пишет: разм..


spair2k пишет:

 цитата:
размер окна это ширина - размер обрамления * 2



размер обрамления := GetBorderWidth()

Можно установить размер окна как необходимая видимая ширина + размер обрамления



Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник


Пост N: 128
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 15.08.08 20:34. Заголовок: Больше примеров с ис..


Больше примеров с использоанием IDE. Только Это направление может быть перспективным !!!

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 25 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 556
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет