Страница 1 из 1

Добавлено: 08 Октябрь 2004, 13:46
Гость
Добрый день!

Подскажите, как сделать subj (т.е. в какую сторону API смотреть).
А может у кого есть примерчик

С уважением,
Леонид Мартюшев leonid@opfr.komi.com
Написал: ClaList(2)

Добавлено: 08 Октябрь 2004, 13:48
Гость
Hi.

В CW2 в TeenTools-ах был такой шаблончик:

Код: Выделить всё

#EXTENSION (MDIBackground, 'Image on the MDI
background'),PROCEDURE,HLP('MDIBackground')
#!
#! Version: 2.0
#! Author:  George Petrov
#! Dated :  27.05.1996
#! e-Mail:  George.Petrov@Princen-IT.nl or 100276,2655 at CompuServe
#!
#SHEET
#TAB('Image on the MDI background')
#DISPLAY('')
#DISPLAY('This extension will put an image on the background')
#DISPLAY('of the Main MDI window.')
#DISPLAY('                                                Copyright (c)
1996')
#DISPLAY('                                                George Petrov')
#ENABLE(%True)
#SHEET
#TAB('Image Properties')
#PROMPT('File Name:',OPENDIALOG('Pick an Image
File','Bitmap!*.BMP!PaintBrush!*.PCX!Graphic Interchange
Format!*.GIF!JPEG!*.JPG!Windows metafile!*.WMF!All Files!*.*!All Graphics
Formats!*.BMP;*.ICO;*.PCX;*.GIF;*.JPG;*.WMF')),%ImageFileName
#PROMPT('Display 3D Border', CHECK),%Border3D,DEFAULT(0)
#PROMPT('Auto Center', CHECK),%AutoCenter,DEFAULT(1)
#PROMPT('Auto Size', CHECK),%AutoSize,DEFAULT(1)
#PROMPT('Palette', CHECK),%TINUSEPALETTE,DEFAULT(0)
#ENABLE(%AutoCenter=1)
#DISPLAY('        NOTE: To Use Auto Center you have to add the')
#DISPLAY('                   IMMEDIATE attribute to the MDI Window')
#ENDENABLE
#ENABLE(%AutoSize=0)
#PROMPT('Width:',SPIN(@n5,1,1500,10)),%ImageWidth,DEFAULT(150)
#PROMPT('Height:',SPIN(@n5,1,1500,10)),%ImageHeight,DEFAULT(100)
#ENDENABLE
#ENABLE(%TINUSEPALETTE)
#PROMPT('Colors:',SPIN(@n5,1,1500,1)),%TINPALETTESIZE,DEFAULT(256)
#ENDENABLE
#ENDTAB
#ENDSHEET
#ENDENABLE
#ENDTAB
#ENDSHEET
#ATSTART
#DECLARE(%BackWindowAT)
#DECLARE(%BackWindowFrame)
#DECLARE(%BackImageAT)
#DECLARE(%TINSETPALETTE)
#IF(%Border3D)
   #SET(%BackWindowFrame,'GRAY,DOUBLE')
#ELSE
   #SET(%BackWindowFrame,'NOFRAME')
#ENDIF
#IF(%TINUSEPALETTE)
   #SET(%TINSETPALETTE,',PALETTE(' & %TINPALETTESIZE & ')')
#ELSE
   #SET(%TINSETPALETTE,'')
#ENDIF
#IF(%AutoSize)
   #SET(%BackWindowAT,'')
   #SET(%BackImageAT,'')
#ELSE
   #SET(%BackWindowAT,',AT(,,' & %ImageWidth & ',' & %ImageHeight & ')')
   #SET(%BackImageAT,',FULL')
#ENDIF
#IF(%AutoCenter)
  #IF(EXTRACT(%WindowStatement,'IMM') = %False)
    #ERROR(%Procedure & ': Select the IMMEDIATE attribute on the window
structure!')
    #ERROR(%Procedure & ': No Auto Center code generated')
  #ENDIF
#ENDIF
#ENDAT
#AT(%DataSectionBeforeWindow )
MDILogoThread       LONG
#ENDAT
#AT(%ModuleDataSection)
  MAP
    %Window:Background()
    MODULE('')
        DisableWindow(USHORT,SHORT
Enabled=False),PASCAL,NAME('EnableWindow')
    END
  END
#ENDAT
#AT(%AfterWindowOpening)
MDILogoThread  = START(%Window:Background)
#ENDAT
#AT( %WindowEventHandling, 'sized' ),WHERE(%AutoCenter)
    POST( 550h, , MDILogoTHread )
#ENDAT
#AT(%ProcedureRoutines)
%Window:Background  PROCEDURE
BackWindow
WINDOW(''),MDI,CENTER,%BackWindowFrame%BackWindowAT%TINSETPALETTE
            IMAGE('%ImageFileName'),USE(?BackImage)%BackImageAT
            END
    CODE
    OPEN(BackWindow)
    BackWindow{PROP:Width}  = ?BackImage{PROP:Width}
    BackWindow{PROP:Height} = ?BackImage{PROP:Height}
    BackWindow{PROP:Center} = True
    DisableWindow(BackWindow{PROP:Handle})
    ACCEPT
        Case Event()
        #IF(%AutoCenter)
        Of 550h
           BackWindow{PROP:Center} = True
        #ENDIF
        of EVENT:CloseWindow
           Break
        end
    END
    CLOSE(BackWindow)
#ENDAT
Я думаю, доработаешь под свои нужды.

WBR, Nick Tsigouro mailto:nick@arsis.ru
Написал: ClaList(2)

Добавлено: 08 Октябрь 2004, 13:54
Гость
Спасибо, посмотрю, но сдается мне с первого взгляда - это просто вставка картинок в клиентскую область (это как раз не проблема), а мне нужно что-то типа реализованное у SealSoft в продукте xFText. Судя по цене ($49) - это не так просто, но хотя бы узнать где-копать в API

С уважением,
Леонид Мартюшев
Написал: ClaList(2)

Добавлено: 08 Октябрь 2004, 14:23
Гость
Ну все зависит от того, что нужно. Если просто текст - добавь в окошко свои контролы. Если фигуристый текст - сделай в шопе картинку. Или тебе нужна живая картинка типа телеграфной ленты? Если оживлять - посылай (по таймеру) свои события и отрисовывай (Display). Т.е. примерно так, как обрабатывается ресайз фрейма. М.б. на время отрисовки придется снять с окна disable:

Код: Выделить всё

  Of Event:UserRedraw
    DisableWindow(BackWindow{PROP:Handle}, True)
    ...
    Display
    DisableWindow(BackWindow{PROP:Handle})
WBR, Nick Tsigouro
Написал: ClaList(2)

Добавлено: 08 Октябрь 2004, 16:06
Гость
Ну все зависит от того, что нужно. Если просто текст - добавь в окошко свои контролы.
Это как можно во Frame штатно добавить какие-либо контролы?
Если фигуристый текст - сделай в шопе картинку. Или тебе нужна живая картинка типа телеграфной ленты? Если оживлять - посылай (по таймеру) свои события и отрисовывай (Display). Т.е. примерно так, как обрабатывается ресайз фрейма. М.б. на время отрисовки придется снять с окна disable:
Особливо чего-то хитрого не надо. Некая текстовка посередине, а в правом нижнем углу копирайты, версия...

В принципе, проще нарисовать картинку и использовать как обои, но хотелось бы научиться "писать", а то постоянно картинку перерисовывать...

--
С уважением,
Леонид Мартюшев
Написал: ClaList(2)

Добавлено: 08 Октябрь 2004, 16:28
Гость
Это как можно во Frame штатно добавить какие-либо контролы?
Так не во фрейм. Там же открывается обычное дочернее окно, которое потом дизейблится. На него можно добавлять все, что угодно.
В принципе, проще нарисовать картинку и использовать как обои, но хотелось бы научиться "писать", а то постоянно картинку перерисовывать...
Так писанину тоже надо перерисовывать, как минимум при ресайзе. Текстовку - в центр, копирайты в угол.

WBR, Nick Tsigouro
Написал: ClaList(2)

Добавлено: 08 Октябрь 2004, 16:29
Гость
А поподробнее... Где в

Код: Выделить всё

AppFrame             APPLICATION...
                                  END
еще что-то, кроме меню и тулбара? Это что-то скрытое и недокументированное. Ну а тогда, если я его визуально не вижу, как что-либо можно добавить? Может есть у тебя примерчик?

С уважением,
Леонид Мартюшев
Написал: ClaList(2)

Добавлено: 08 Октябрь 2004, 16:30
Гость
Ну и глубоко же ты в танк залез! ;-) Тяпница, однако ;-)). Посмотри на шаблон, что я дал. Если не разберешься, допиши #TEMPLATE, зарегистрируй, и посмотри, что он генерирует.

ЗЫ. Если тинтулзовские шаблоны есть, поищи там, наверно он никуда не делся.

WBR, Nick Tsigouro
Написал: ClaList(2)

Добавлено: 08 Октябрь 2004, 16:34
Гость
Копать надо в сторону изучения механизма обработки события WM_PAINT для клиентской части окна фрейма. Это вообще одна из первых тем в любом учебнике по программированию в Windows. Точнее вторая, первой обычно везде идет создание и регистрация класса окна, создание самого окна и стандартный цикл обработки событий :)

Примеры на Clarion такой обработки можно опять же встретить на http://www.clarionlife.net
Типа рисование какие-нить графических примитивов в окне.

В общем, если на пальцах, все очень просто:
1. Сабклассим клиентскую часть окна {PROP:ClientHandle}.
2. Ловим WM_PAINT
3. (BeginPaint) дает нам контекст hDC в котором следует рисовать.
4. Создаем нужный нам шрифт hFont (см. например (CreateFontIndirect))
5. Устанавливаем в контексте hDC нужный цвет (SetTextColor) и выбираем (SelectObject) в этом hDC полученный шрифт hFont.
6. Пишем наш текст (TextOut), (DrawText)
7. Восстанавливаем (SelectObject) в hDC прежний цвет и шрифт, эти прежние значения надо сохранить при установке нашего
цвета и шрифта.
8. Удаляем шрифт (DeleteObject)
9. Заканчиваем рисовать (EndPaint)

Что дальше?

А дальше надо ить дать и Clarion-у чего-нить нарисовать? правильно? вдруг ему картинку в фоне отобразить надо :) Так вот если ему дать отрисоваться, то есть выполнить CallWindowProc, то все что мы нарисовали может оказаться почиканым.

Вот поэтому указанная выше стандартная процедура обработки WM_PAINT не совсем нам подходит, и BeginPaint/EndPaint придется убрать, а контекст получать функцией CetDC. То есть:

1. Сабклассим клиентскую часть окна {PROP:ClientHandle}.
2. Ловим WM_PAINT
3. Даем Clarion отрисоваться
RetValue = CallWindowProc(WndProc:Address, hWnd, wMsg, wParam, lParam)
3. Получаем контекст hDC (GetDC)
4. Создаем нужный нам шрифт hFont (см. например (CreateFontIndirect))
5. Устанавливаем в контексте hDC нужный цвет (SetTextColor) и выбираем (SelectObject) в этом hDC полученный шрифт hFont.
6. Пишем наш текст (TextOut), (DrawText)
7. Восстанавливаем (SelectObject) в hDC прежний цвет и шрифт, эти прежние значения надо сохранить при установке нашего цвета и шрифта.
8. Удаляем шрифт (DeleteObject)
9. Освобождаем контекст (ReleaseDC)
10. RETURN RetValue

Пример (рисование квадратиков), как я говорил есть на на http://www.clarionlife.net

Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
Написал: ClaList(2)

Добавлено: 08 Октябрь 2004, 16:38
Гость
Ну вот, теперь все ясно. Бум смотреть

С уважением,
Леонид Мартюшев
Написал: ClaList(2)