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

Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 07 Июль 2010, 0:35
WadimZapara
Народ ! В таблице MSSQL, в поле image хранится файл иконки.

1) Как присвоить нарисовать на кнопке эту самую иконку, Button{PROP:ICON} = ?

СПРАВИЛСЯ С ЗАДАЧЕЙ РИСОВАНИЯ СОХРАНЁННОГО JPG-файла в IMAGE{PROP:ImageBlob}
Путь:
а) Select-ом получаю части image-поля и склеиваю в BLOB-поле временного TPS-файла
б) IMAGE{PROP:ImageBlob} = BLOB{PROP:Handle}

2) То есть другой вопрос. Как рисунок из контрола IMAGE перенести в качестве иконки на контрол BUTTON
Пробовал BUTTON{PROP:Icon} = IMAGE{PROP:Text} - не прокатило.

Пока рисую прозрачный BUTTON и на том же месте того же размера IMAGE, в который и получаю из MSSQL сохранённый jpg-файл.
Но это же - кривизна !!! :(
Посоветуйте. (Спешу в отпуск...)

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 07 Июль 2010, 4:29
StillZero
Так что хранится на sql-ле - иконка или jpg? Хотя один хрен... картинку надо на диск клиенту сохранить (куда нибудь в temp\my app icon), и уже в PROP:Icon отдавать.
Т.е. не ясно зачем писать в tps.

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 07 Июль 2010, 9:53
WadimZapara
StillZero писал(а):Так что хранится на sql-ле - иконка или jpg?
надо: хранить ico, но пока храню jpg, потому что с ico - не получилось
StillZero писал(а):Хотя один хрен... картинку надо на диск клиенту сохранить
вот этого-то делать-то и не надо
StillZero писал(а):Т.е. не ясно зачем писать в tps.
Ещё раз. И поподробнее:
- Настройки сервиса кларион-программы для вывода какого-нибудь LIST-а находятся в MSSQL: название сервиса, формат каждой колонки в LIST, стили, stored procedure, исполняющая работу сервиса (т.е. возвращающая SELECT-ом всё необходимое)
- кларион-программа считывает настройки сервисов для данного модуля и создаёт и показывает BUTTON-ы с TIP-ами названий сервисов, зачитанных из MSSQL, вот здесь - желательно показать на BUTTON-ах иконки, которые могут храниться в настройке сервиса в MSSQL в поле image.
- далее при нажатии пользователя на соответствующий BUTTON, программа согласно настройкам сервиса (в MSSQL) формирует динамический файл (спасибо Руденко), затем LIST, запускает сервисную stored procedure (завершающуюся Select-ом) и считывает из буфера динамического файла в очередь LIST-а подготовленную информацию.

То есть. Кларион-программа пишется один раз. А все новые отчётные формы, которые она предлагает пользователю, готовятся в MSSQL.
----------------------------------------------------------------
Почему tps и jpg: потому что не хочу сохранять иконки на диск, поэтому создаю один временный и всегда пустой tps с BLOB-ом, запихиваю в BLOB картинку из MSSQL, а далее просто: IMAGE{PROP:ImageBlob} = BLOB{PROP:Handle}
Почему jpg: потому что не нашёл как задать перенести иконку на кнопку.
----------------------------------------------------------------
Ещё раз вопрос один из двух:
Как и что присвоить BUTTON{PROP:ICON} = ? из переменной или из BLOB
или
Как из объекта IMAGE перенести картинку как иконку на объект BUTTON

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 07 Июль 2010, 11:00
Admin
WadimZapara писал(а):Как и что присвоить BUTTON{PROP:ICON} = ? из переменной или из BLOB
или
Как из объекта IMAGE перенести картинку как иконку на объект BUTTON
Смотрим ImageEx или FreeImage.
Картинку сначала из BLOB копируем в класс (вышеописанных продуктов), затем метод типа SAVE в TEMP каталог и отображение... как вариант.

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 07 Июль 2010, 14:23
StillZero
Admin писал(а): затем метод типа SAVE в TEMP каталог и отображение
так ведь не хочет сохранять на диск... А с памяти я хз как... никак наверное...

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 07 Июль 2010, 14:26
WadimZapara
StillZero писал(а):так ведь не хочет сохранять на диск...
Спасибо за коммент.
StillZero писал(а):А с памяти я хз как... никак наверное...
Не верю.
Буду рыть...
Может ещё есть мнения?

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 07 Июль 2010, 16:31
Admin
Еще вариант просто нарисовать свою кнопку на WinAPI
Или на обычную кнопку повесить в конец свой обработчик, который в контексте кнопки нарисует что то
и т.д.

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 07 Июль 2010, 16:34
Admin
StillZero писал(а):
Admin писал(а): затем метод типа SAVE в TEMP каталог и отображение
так ведь не хочет сохранять на диск... А с памяти я хз как... никак наверное...
Нужно дебагать что делается по ?Image{PROP:Icon} и делать типа "reverse engineering"

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 07 Июль 2010, 16:37
Admin
Кстати Clarion может иконки читать из ресурса вроде... из своего EXE
Можно BLOB в какой нибудь новый ресурс созданный засунуть его в EXE записать.
Это опять с файлами работа ... или еще как то можно с PROP:ImageInstance побаловаться ...

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 07 Июль 2010, 21:07
morkovin
Не верю.
Буду рыть...
Может ещё есть мнения?
Может не мудрить, а использовать CoolButtons от PurpleSoft.

Из FAQ
"...
4.How do I use my own images for the buttons?
You select the Custom button style on the CoolButtons global extension Settiings tab. Press the Style Settings button and proceed from there. See Custom Style for more details.
..."

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 07 Июль 2010, 23:05
WadimZapara
morkovin писал(а): предложено пойти на purplesoft
А там отвечают:
Welcom to purplesoft.com
...
This domain may be for sale
Admin писал(а):Или на обычную кнопку повесить в конец свой обработчик, который в контексте кнопки нарисует что то
рою сюда... Победю-отпишусь.

Есть ещё мысли ?

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 08 Июль 2010, 1:47
StillZero
Может не мудрить, а использовать CoolButtons от PurpleSoft.

Из FAQ
"...
4.How do I use my own images for the buttons?
You select the Custom button style on the CoolButtons global extension Settiings tab. Press the Style Settings button and proceed from there. See Custom Style for more details.
кому cool, а кому и sux :) а там написано, как можно указать хэндл иконки?
Или на обычную кнопку повесить в конец свой обработчик, который в контексте кнопки нарисует что то
это я могу, но не скажу, что это легко, граблей мама дорогая, лучше все таки на диск блин писать, один хрен tps тоже на диске хранится, так какая блин разница, не могу понять, писать в windows temp в свою папку, потом грохать, к примеру.... :)
а... и только иконку так можно, jpeg это ваще застрел, надо будет конвертить в битмат, как минимум...
просто нарисовать свою кнопку на WinAPI
не нарисовать, а создать, это просто... только потом обрабатывать ее через ж... неудобно в общем

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 08 Июль 2010, 4:44
Admin
Сто лет назад что то делал такое... но смотрю все поломано и не работает... может что поможет...

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

  OMIT('_EndOfInclude_',_xCButtonClassPresent_)
_xCButtonClassPresent_ EQUATE(1)

xcb_REFRESH                  EQUATE(128128)

xcb_COLOR_BTNFACE            EQUATE(15)
xcb_IMAGE_ICON               EQUATE(1)
xcb_LR_SHARED                EQUATE(8000h)

xcb_ODS_SELECTED             EQUATE(00001h)
xcb_ODS_GRAYED               EQUATE(00002h)
xcb_ODS_DISABLED             EQUATE(00004h)
xcb_ODS_CHECKED              EQUATE(00008h)
xcb_ODS_FOCUS                EQUATE(00010h)

xcb_ODA_DRAWENTIRE           EQUATE(00001H)
xcb_ODA_SELECT               EQUATE(00002H)
xcb_ODA_FOCUS                EQUATE(00004H)
xcb_DSS_DISABLED             EQUATE(00020h)

xcb_DI_NORMAL                EQUATE(003h)
xcb_GWL_USERDATA             EQUATE(-21)
xcb_GWL_WNDPROC              EQUATE(-4)
xcb_GWL_STYLE                EQUATE(-16)

xcb_VK_DOWN                  EQUATE(028h)
xcb_VK_SPACE                 EQUATE(020h)
xcb_VK_RETURN                EQUATE(0Dh)

xcb_WM_LBUTTONDOWN           EQUATE(0201H)
xcb_WM_LBUTTONUP             EQUATE(0202H)
xcb_WM_KEYDOWN               EQUATE(0100H)
xcb_WM_KEYUP                 EQUATE(0101H)
xcb_WM_DRAWITEM              EQUATE(02BH)
xcb_WM_GETDLGCODE            EQUATE(087h)

xcb_DLGC_WANTARROWS          EQUATE(01h)

xcb_BS_OWNERDRAW             EQUATE(0000000BH)

xcb_DSS_NORMAL               EQUATE(00000H)

xcb_BDR_RAISEDOUTER          EQUATE(0001h)
xcb_BDR_SUNKENOUTER          EQUATE(0002h)
xcb_BDR_RAISEDINNER          EQUATE(0004h)
xcb_BDR_SUNKENINNER          EQUATE(0008h)
xcb_BDR_OUTER                EQUATE(0003h)
xcb_BDR_INNER                EQUATE(000ch)
xcb_BDR_RAISED               EQUATE(0005h)
xcb_BDR_SUNKEN               EQUATE(000ah)
xcb_EDGE_RAISED              EQUATE(xcb_BDR_RAISEDOUTER+xcb_BDR_RAISEDINNER)
xcb_EDGE_SUNKEN              EQUATE(xcb_BDR_SUNKENOUTER+xcb_BDR_SUNKENINNER)

xcb_BF_LEFT                  EQUATE(0001h)
xcb_BF_TOP                   EQUATE(0002h)
xcb_BF_RIGHT                 EQUATE(0004h)
xcb_BF_BOTTOM                EQUATE(0008h)
xcb_BF_RECT                  EQUATE(xcb_BF_LEFT+xcb_BF_TOP+xcb_BF_RIGHT+xcb_BF_BOTTOM)

xcb_TPnt                     GROUP,TYPE
XPos                           LONG
Ypos                           LONG
                             END

xcb_RECT                     GROUP,TYPE
left                           LONG
top                            LONG
right                          LONG
bottom                         LONG
                             END

xcb_DRAWITEMSTRUCT           GROUP,TYPE
CtlType                        LONG
CtlID                          LONG
itemID                         LONG
itemAction                     LONG
itemState                      LONG
hwndItem                       LONG
hDC                            LONG
rcItem                         LIKE(xcb_RECT)
itemData                       LONG
                             END

xcb_ControlsQueue            QUEUE,TYPE
FEQ                            LONG
WndProc                        LONG
Handle                         LONG
ControlID                      LONG
ControlType                    BYTE
PopupPresent                   BYTE
                             END

xcb_WinsQueue                QUEUE,TYPE
hWnd                           LONG
CBClassAddress                 LONG
                             END

xGButtonClass                CLASS,MODULE('xcbutton.clw'),LINK('xcbutton.clw',_ABCLinkMode_),DLL(_ABCDllMode_)
Windows                        &xcb_WinsQueue,PRIVATE
!Construct                      PROCEDURE
!Destruct                       PROCEDURE
!Init                           PROCEDURE
!Kill                           PROCEDURE
!AddWindow                      PROCEDURE(WINDOW Window, LONG Address)
!RemoveWindow                   PROCEDURE(WINDOW Window)
!GetAddress                     PROCEDURE(WINDOW Window),LONG,PRIVATE
!GetAddress                     PROCEDURE(LONG hWnd),LONG,PRIVATE
                             END

xCButtonClass                CLASS,TYPE,MODULE('xcbutton.clw'),LINK('xcbutton.clw',_ABCLinkMode_),DLL(_ABCDllMode_)
Window                         &WINDOW,PRIVATE
Controls                       &xcb_ControlsQueue,PRIVATE
GB                             &xGButtonClass,PRIVATE
PrevCallBack                   LONG,PRIVATE
HeightRB                       USHORT(20),PRIVATE
ControlID                      LONG(0),PRIVATE
Construct                      PROCEDURE
Destruct                       PROCEDURE
Init                           PROCEDURE(WINDOW Window)
Kill                           PROCEDURE
AddControl                     PROCEDURE(LONG Feq, LONG ControlType=0, <LONG ControlID>)
GetCallBack                    PROCEDURE(LONG hWnd),LONG,PRIVATE
GetWCallBack                   PROCEDURE(),LONG,PRIVATE
TakeAccepted                   PROCEDURE(USHORT ActionID, <LONG hWnd>, <LONG Wparam>, <LONG Lparam>),VIRTUAL
AfterAccepted                  PROCEDURE(LONG hWnd)
GetActionID                    PROCEDURE(LONG hWnd, LONG LocalAction),LONG,PRIVATE
GetProp                        PROCEDURE(LONG hWnd, BYTE PropID),LONG
SetProp                        PROCEDURE(LONG hWnd, BYTE PropID, LONG Prop)
Msg                            PROCEDURE
                             END
_EndOfInclude_

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

   MEMBER

  OMIT('***', _C55_)
_ABCDllMode_  EQUATE(0)
_ABCLinkMode_ EQUATE(1)
  ***

   INCLUDE('EQUATES.CLW'),ONCE
   INCLUDE('KEYCODES.CLW'),ONCE
   INCLUDE('xcbutton.inc'),ONCE

   MAP
     MODULE('Windows API')
       xcb_GetWindowText(ULONG, *CSTRING, SIGNED),SIGNED,PROC,PASCAL,RAW,NAME('GetWindowTextA')
       xcb_DrawIconEx(UNSIGNED hDC,SIGNED xLeft,SIGNED yTop,UNSIGNED hIcon,SIGNED cxWidth,SIGNED cyWidth,UNSIGNED iStepIfAniCur,UNSIGNED hbrFlickerFreeDraw,UNSIGNED diFlags),SIGNED,RAW,PASCAL,PROC,NAME('DrawIconEx')
       xcb_LoadIcon(UNSIGNED,LONG),UNSIGNED,PASCAL,NAME('LoadIconA')
       xcb_memcpy(LONG lpDest, LONG lpSource, LONG nCount),LONG,PROC,NAME('_memcpy')
       xcb_CallWindowProc(LONG,LONG,LONG,LONG,LONG),LONG,PASCAL,NAME('CallWindowProcA')
       xcb_SetWindowLong(LONG,LONG,LONG),LONG, PASCAL,NAME('SetWindowLongA')
       xcb_GetWindowLong(LONG hWnd, signed nIndex),long,pascal,name('GetWindowLongA')
       xcb_PostMessage(LONG,LONG,LONG,LONG),LONG,PASCAL,NAME('PostMessageA')
       xcb_GetCursorPos(*xcb_TPnt),BOOL,RAW,PASCAL,PROC,NAME('GetCursorPos')
       xcb_GetClientRect(LONG hWnd, *xcb_RECT lpRect),BOOL,RAW,PASCAL,PROC,NAME('GetClientRect')
       xcb_ClientToScreen(LONG hWnd, *xcb_TPnt lpPOINT),BOOL,RAW,PASCAL,PROC,NAME('ClientToScreen')
       xcb_GetSysColorBrush(unsigned nIndex),LONG,PASCAL,NAME('GetSysColorBrush')
       xcb_FillRect(LONG hdc, *xcb_RECT lprc, LONG hbr),BOOL,RAW,PASCAL,NAME('FillRect')
       xcb_DrawEdge(LONG hdc, *xcb_RECT qrc, unsigned edge, unsigned grfFlags),BOOL,RAW,PASCAL,PROC,NAME('DrawEdge')
       xcb_LoadImage(LONG hinst, long lpszName, unsigned uType, signed cxDesired, |
                     signed cyDesired, unsigned fuLoad),LONG,PASCAL,RAW,NAME('LoadImageA')
       xcb_DrawFocusRect(LONG hdc, *xcb_RECT lprc),BOOL,RAW,PASCAL,NAME('DrawFocusRect')
       xcb_SendMessage(LONG hWnd, long nMsg, long wParam, long lParam),BYTE,PASCAL,PROC,NAME('SendMessageA')
       xcb_GetProp(ULONG hWnd,*CSTRING lpString),ULONG,RAW,PASCAL,NAME('GetPropA')
       xcb_RemoveProp(ULONG hWnd,*CSTRING lpString),ULONG,PROC,RAW,PASCAL,NAME('RemovePropA')
       xcb_SetProp(ULONG hWnd,*CSTRING lpString,ULONG hData),BOOL,PROC,RAW,PASCAL,NAME('SetPropA')
     END
     DrawClassicStyleBtn(LONG theWindow,UNSIGNED,UNSIGNED,LONG),LONG
     CWindowCallBack(UNSIGNED,UNSIGNED,UNSIGNED,LONG)LONG,PASCAL
     CButtonCallBack(UNSIGNED,UNSIGNED,UNSIGNED,LONG)LONG,PASCAL
   END

lPropNameClass CSTRING('LKWEHFKJ')

!******************************************************************************
! xCButton Class
!******************************************************************************
xCButtonClass.Construct        PROCEDURE
  CODE
  SELF.Controls &= NEW xcb_ControlsQueue
!******************************************************************************
xCButtonClass.Destruct         PROCEDURE
  CODE
  FREE(SELF.Controls)
  DISPOSE(SELF.Controls)
!******************************************************************************
xCButtonClass.Init             PROCEDURE(WINDOW Window)
  CODE
  SELF.Window &= Window
  !SELF.PrevCallBack = xcb_SetWindowLong(Window{PROP:ClientHandle}, xcb_GWL_WNDPROC, ADDRESS(CWindowCallBack))
!******************************************************************************
xCButtonClass.Kill             PROCEDURE
  CODE
!******************************************************************************
xCButtonClass.AddControl       PROCEDURE(LONG Feq, LONG ControlType=0, <LONG ControlID>)
  CODE
  IF ~xcb_SetProp(Feq{PROP:Handle}, lPropNameClass, ADDRESS(SELF))
    MESSAGE('Error on set prop')
  END
  IF xcb_SetWindowLong(Feq{PROP:Handle}, xcb_GWL_USERDATA, ADDRESS(SELF)) END
  SELF.Controls.WndProc = xcb_SetWindowLong(Feq{PROP:Handle}, xcb_GWL_WNDPROC, ADDRESS(CButtonCallBack))
  IF xcb_SetWindowLong(Feq{PROP:Handle}, xcb_GWL_STYLE, xcb_GetWindowLong(Feq{PROP:Handle}, xcb_GWL_STYLE) + xcb_BS_OWNERDRAW) END
  SELF.Controls.Handle      = Feq{PROP:Handle}
  SELF.Controls.Feq         = Feq
  SELF.Controls.ControlType = ControlType
  IF OMITTED(4)
    SELF.Controls.ControlID = SELF.ControlID
  ELSE
    SELF.Controls.ControlID = ControlID
  END
  SELF.ControlID += 100
  ADD(SELF.Controls)
!******************************************************************************
xCButtonClass.GetCallBack      PROCEDURE(LONG hWnd)!,LONG,PRIVATE
  CODE
  SELF.Controls.Handle = hWnd
  GET(SELF.Controls, SELF.Controls.Handle)
  !ASSERT(~ERRORCODE(),'Unable to get callback procedure address')
  RETURN SELF.Controls.WndProc
!******************************************************************************
xCButtonClass.GetWCallBack      PROCEDURE()!,LONG,PRIVATE
  CODE
  RETURN SELF.PrevCallBack
!******************************************************************************
xCButtonClass.TakeAccepted      PROCEDURE(USHORT ActionID, <LONG hWnd>, <LONG Wparam>, <LONG Lparam>)!,VIRTUAL
  CODE
!******************************************************************************
xCButtonClass.AfterAccepted     PROCEDURE(LONG hWnd)
  CODE
  SELF.Controls.Handle = hWnd
  GET(SELF.Controls, SELF.Controls.Handle)
  ASSERT(~ERRORCODE(),'Unable to get record')
  SELF.Controls.PopupPresent = 0
  PUT(SELF.Controls)
  ASSERT(~ERRORCODE(),'Unable to put record')
  IF xcb_SendMessage(hWnd, xcb_REFRESH, 0, 0)
  END
!******************************************************************************
xCButtonClass.GetActionID       PROCEDURE(LONG hWnd, LONG LocalAction)!,LONG
  CODE
  SELF.Controls.Handle = hWnd
  GET(SELF.Controls, SELF.Controls.Handle)
  ASSERT(~ERRORCODE(),'Unable to get record')
  RETURN SELF.Controls.ControlID+LocalAction
!******************************************************************************
xCButtonClass.GetProp           PROCEDURE(LONG hWnd, BYTE PropID)!,LONG
  CODE
  SELF.Controls.Handle = hWnd
  GET(SELF.Controls, SELF.Controls.Handle)
  ASSERT(~ERRORCODE(),'Unable to get record')
  CASE PropID
  OF 1
    RETURN SELF.Controls.PopupPresent
  END
  ASSERT(1=2,'Unable to get this property')
!******************************************************************************
xCButtonClass.SetProp           PROCEDURE(LONG hWnd, BYTE PropID, LONG Prop)
  CODE
  SELF.Controls.Handle = hWnd
  GET(SELF.Controls, SELF.Controls.Handle)
  ASSERT(~ERRORCODE(),'Unable to get record')
  CASE PropID
  OF 1
    SELF.Controls.PopupPresent = Prop
  END
  PUT(SELF.Controls)
  ASSERT(~ERRORCODE(),'Unable to put record')
!******************************************************************************
xCButtonClass.Msg              PROCEDURE
  CODE
  MESSAGE('Msg!')
!******************************************************************************
! Other procedures
!******************************************************************************
CButtonCallBack                PROCEDURE(theWindow, theMessage, theWparam, theLparam)
TPnt                           LIKE(xcb_TPnt)
rcClient                       LIKE(xcb_RECT)
CB                             &xCButtonClass,AUTO
  CODE
  CB &= xcb_GetWindowLong(theWindow, xcb_GWL_USERDATA)
  IF xcb_GetCursorPos(TPnt) END

  xcb_GetClientRect(theWindow, rcClient)
  xcb_ClientToScreen(theWindow, rcClient)

  IF theMessage = xcb_WM_GETDLGCODE
    RETURN xcb_DLGC_WANTARROWS
  END

  CASE theMessage
  OF xcb_WM_DRAWITEM OROF xcb_REFRESH
    RETURN DrawClassicStyleBtn(theWindow, theMessage, theWparam, theLparam)
  OF xcb_WM_LBUTTONDOWN
    ! кнопу нажали
    IF TPnt.XPos >= (rcClient.left+(rcClient.right-CB.HeightRB)) AND TPnt.XPos <= (rcClient.left + rcClient.right) AND |
       TPnt.YPos >= rcClient.top AND TPnt.YPos <= (rcClient.top + rcClient.bottom)
       IF CB.GetProp(theWindow,1) = 1
         CB.SetProp(theWindow,1,0)
       ELSE
         CB.SetProp(theWindow,1,1)
       END
    END
  OF xcb_WM_LBUTTONUP
    IF TPnt.XPos >= (rcClient.left+(rcClient.right-CB.HeightRB)) AND TPnt.XPos <= (rcClient.left + rcClient.right) AND |
       TPnt.YPos >= rcClient.top AND TPnt.YPos <= (rcClient.top + rcClient.bottom)
      IF CB.GetProp(theWindow,1) = 1
        CB.TakeAccepted(CB.GetActionID(theWindow, 2),theWindow,rcClient.left,rcClient.top+rcClient.bottom)
      END
    ELSE
      IF TPnt.XPos >= (rcClient.left) AND TPnt.XPos <= (rcClient.left + rcClient.right) AND |
         TPnt.YPos >= rcClient.top AND TPnt.YPos <= (rcClient.top + rcClient.bottom)
        CB.TakeAccepted(CB.GetActionID(theWindow, 1),theWindow,theWparam,theLparam)
      END
    END
  OF xcb_WM_KEYUP
    CB.SetProp(theWindow,1,0)
    IF theWparam = xcb_VK_SPACE ! OR theWparam = xcb_VK_RETURN
      CB.TakeAccepted(CB.GetActionID(theWindow, 1),theWindow,theWparam,theLparam)
    END
  OF xcb_WM_KEYDOWN
    IF theWparam = xcb_VK_DOWN
       IF CB.GetProp(theWindow,1) = 1
         CB.SetProp(theWindow,1,0)
       ELSE
         CB.SetProp(theWindow,1,1)
       END
      CB.TakeAccepted(CB.GetActionID(theWindow, 2),theWindow,rcClient.left,rcClient.top+rcClient.bottom)
    END
  END
  RETURN xcb_CallWindowProc(CB.GetCallBack(theWindow), theWindow, theMessage, theWparam, theLparam)
!******************************************************************************
CWindowCallBack                PROCEDURE(theWindow, theMessage, theWparam, theLparam)
CB                             &xCButtonClass,AUTO
  CODE
  !CB &= xGButtonClass.GetAddress(theWindow)
  CB &= xcb_GetProp(theWindow,lPropNameClass)
  CASE theMessage
  OF xcb_WM_DRAWITEM OROF xcb_REFRESH
    RETURN DrawClassicStyleBtn(theWindow, theMessage, theWparam, theLparam)
  ELSE
  END
  RETURN xcb_CallWindowProc(CB.GetWCallBack(), theWindow, theMessage, theWparam, theLparam)
!******************************************************************************
DrawClassicStyleBtn            PROCEDURE(LONG theWindow, theMessage, theWparam, theLparam)!,LONG
CB                             &xCButtonClass,AUTO
tpis                           LIKE(xcb_DrawItemStruct)
pis                            &tpis
uState                         LONG(xcb_DSS_NORMAL)
uEdge                          LONG(xcb_EDGE_RAISED)
bFocus                         BYTE(FALSE)
rFocus                         LIKE(xcb_RECT)
Deflate                        BYTE(4)
BkBrush                        LONG
hDC                            LONG
IconName                       CSTRING(100)
hIcon                          LONG
IXPos                          USHORT
IYPos                          USHORT

  CODE

  CB &= xcb_GetWindowLong(theWindow, xcb_GWL_USERDATA)

  pis &= (theLparam)
  BkBrush = xcb_GetSysColorBrush(xcb_COLOR_BTNFACE)
  IF xcb_FillRect(pis.hDC, pis.rcItem, BkBrush) END
  CASE pis.itemAction
  OF xcb_ODA_SELECT
    IF BAND(pis.itemState, xcb_ODS_SELECTED)
      uEdge = xcb_EDGE_SUNKEN
    END
    DO SetFocus
  OF xcb_ODA_DRAWENTIRE
    IF BAND(pis.itemState, xcb_ODS_DISABLED)
      !uEdge = xcb_DSS_DISABLED
    END
    DO SetFocus
  OF xcb_ODA_FOCUS
    DO SetFocus
  END
  pis.rcItem.right -= CB.HeightRB
  xcb_DrawEdge(pis.hDC, pis.rcItem, uEdge, xcb_BF_RECT);
  IF CB.GetProp(theWindow,1) = 1
    uEdge = xcb_EDGE_SUNKEN
  ELSE
    uEdge = xcb_EDGE_RAISED
  END
  pis.rcItem.right += CB.HeightRB
  pis.rcItem.left = pis.rcItem.right - CB.HeightRB
  xcb_DrawEdge(pis.hDC, pis.rcItem, uEdge, xcb_BF_RECT);

  IconName = 'XCB_DROP_ICO'
  hIcon = xcb_LoadImage(SYSTEM{PROP:AppInstance},ADDRESS(IconName),xcb_IMAGE_ICON,16,16,xcb_LR_SHARED)
  IF hIcon
    IXPos = pis.rcItem.left + ((CB.HeightRB/2)-8)
    IYPos = pis.rcItem.top + ((pis.rcItem.bottom/2)-8)
    IF BAND(pis.itemState,xcb_ODS_SELECTED) AND NOT BAND(pis.itemState,xcb_ODS_DISABLED)
      xcb_DrawIconEx(pis.hDC,IXPos,IYPos,hIcon,0,0,0,0,xcb_DI_NORMAL)
    ELSE
      xcb_DrawIconEx(pis.hDC,IXPos-1,IYPos-1,hIcon,0,0,0,0,xcb_DI_NORMAL)
    END
  END
  IF bFocus = TRUE
    IF xcb_DrawFocusRect(pis.hDC, rFocus) END
  END
  RETURN TRUE

SetFocus ROUTINE
  IF BAND(pis.itemState, xcb_ODS_FOCUS)
    xcb_memcpy(ADDRESS(rFocus), ADDRESS(pis.rcItem), SIZE(xcb_RECT));
    rFocus.left   += deflate
    rFocus.top    += deflate
    rFocus.right  -= (deflate+CB.HeightRB)
    rFocus.bottom -= deflate
    bFocus = TRUE
  END


Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 08 Июль 2010, 10:18
morkovin
А там отвечают:
Welcom to purplesoft.com
Извини, немного ошибся. :(
Правильно http://www.purpleswift.com

P.S.Есть на FTP

Re: Как Button{PROP:ICON} = ? ИЗ ПАМЯТИ

Добавлено: 09 Июль 2010, 0:50
WadimZapara
morkovin писал(а):Может не мудрить, а использовать CoolButtons от PurpleSwift..."
Изучил я это чудо малость.
Возможности обходиться без дискового или прилинкованного в ресурс файла данная приблуда не даёт.
Воспользоваться файлом можно без проблем - для этого CoolButtons не требутся.
Для этого и вопрос задавать не стоило.

Ща изучаю source Admin-а.

Но подозреваю, что есть путь попроще: заметьте, каково описание:

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

ICON:None         EQUATE ('<0FFH,01H,00H,00H>')
ICON:Application  EQUATE ('<0FFH,01H,01H,7FH>')
ICON:Hand         EQUATE ('<0FFH,01H,02H,7FH>')
ICON:Question     EQUATE ('<0FFH,01H,03H,7FH>')
ICON:Exclamation  EQUATE ('<0FFH,01H,04H,7FH>')
уж больно оно похоже на статический адрес в программе, или на дескриптор (ресурса)
и когда мы пишем Button{PROP:ICON} = ICON:Question - мы как раз и передаём дескриптор ресурса

В то же время описание из MSDN: HICON WINAPI LoadIcon(__in_opt HINSTANCE hInstance, __in LPCTSTR lpIconName);
и указание, что для стандартных икон в параметре lpIconName может быть использовано преобразование числового идентификатора с помощью макроса MAKEINTRESOURCE()
а идентификаторы так похожи на наши:
IDI_HAND MAKEINTRESOURCE(32513) 7F01h
IDI_QUESTION MAKEINTRESOURCE(32514) 7F02h
IDI_EXCLAMATION MAKEINTRESOURCE(32515) 7F03h
либо параметр lpIconName должен содержать имя иконочного ресурса

Так вот идея: можно ль создать ресурс ? и его дескриптор (т.е. адрес) подсунуть в выражение Button{PROP:ICON} = <дескриптор ресурса>
Мнения ?