new topic     » goto parent     » topic index » view thread      » older message » newer message

Hi Euphorians,
Below is a small library coded in API that creates a custom control 
called the hot buttons. i haven't added round button/roundrect but those 
are very easy. the reason i'm submitting this is because i'm planning to 
revamp the library for efficiency and speed.

for win32lib users you'll have to wait i wrap a wrapper over it. 
experienced win32lib users will have no problems.....

HB_Create(atom parent,sequence text,atom x,atom y,atom cx,atom 
cy,integer Style)
================================================================

This creates a hotbutton control. parent requires a real win32 handle so 
for win32lib users you'll have to use getHandle() for the parent window. 
Style can be HBS_RECT(HBS_ROUND/ROUNDRECT not yet 
supported),HBS_TOGGLE(Button is toggle style),HBS_ENABLED,HBS_DISABLED 
etc. You can use or_all() on these styles to get the final value. using 
0 uses the default values

-------------------------------------------
HB_SetFont(atom hwnd,sequence fontname,integer height,atom fntdata)
-------------------------------------------

hwn should be the handle returned by HB_Create() fontname is the name of 
the font.height is the font height needed. fntdata is the style. it can 
be HBF_BOLD,HBF_ITALIC,HBF_UNDERLINE. u will have to use or_all() too 
get the final style. when fntdata is 0 default values are used

-------------------------------------------
HB_SetImage(atom hwnd,atom image,integer State,integer Type,integer 
bltForm,atom colorref)
===========================================
hwnd: is the value returned after HB_Create()
image: this is a handle to the image. it can be a bitmap or icon handle
State: this is for the button state inwhich this image will be shown.
      it can be HBIS_HOT(when mouse is over button) HBIS_DISABLED(Button 
is disabled),HBIS_COLD(Button has no focus)
Type: Type of image used HBI_ICO for an icon. HBI_BMP for a bitmap
bltForm: This is needed when drawing the bitmaps (HBI_BMP) using 
HBLT_OPAQUE draws the image "as-is", HBLT_TRANSPARENT draws a bitmap 
with a transparent background
colorref: This is the background color used when HBLT_TRANSPARENT is 
specified

HB_SetAlignment(atom hwnd,integer style)
========================================
if style is HBA_LEFT image is drawn to the left of the text. if style is 
HBA_BOTTOM image is drawn above the text

-----------------------------------------
HB_SetText(atom hwnd,sequence text)
=========================================
changes the current text of the hotbutton. hwnd is the value returned 
from hb_create(). Note text with & prefix returns an underscore on the 
character after the ampersand

-----------------------------------------
HB_GetText(atom hwnd)
=========================================

retuens the hotbutton's text

-----------------------------------------
HB_SetBackColor(atom hwnd,object clr)
=========================================

changes the background color of a button. clr can be a sequence of rgb 
triads {r,g,b} or the COLORREF value.

-----------------------------------------
HB_GetBackColor(atom hwnd)
=========================================

returns the colorref value of the current buttons background color

-----------------------------------------
HB_SetTextColor(atom hwnd,object clr)
=========================================
Changes the text color

-----------------------------------------
HB_GetTextColor(atom hwnd)
=========================================
Returns the text color of the hot button


-----------------------------------------
--File   : HotButtons Module           --
--Version: 0.1.5                       --
--Date   : Thursday, October 10, 2002  --
--Author : Jordah Ferguson             --
-----------------------------------------

--** Font heights vary
--** Check if we really need saveDC and RestoreDC
--** Make Drop down style
--** Parents should be noted in the structure

without warning
without type_check
include dll.e
include machine.e
include msgbox.e

constant
   HBUSER32 = open_dll("user32.dll"  ),
   HBGDI32  = open_dll("gdi32.dll"   ),
   HBKRN32  = open_dll("kernel32.dll"),

-- kernel32.dll C routines
hlstrlen               = define_c_func(HBKRN32 , 
"lstrlenA",{C_LONG},C_INT),
     
-- User32.dll C routines
hRegisterClassEx       = define_c_func(HBUSER32, "RegisterClassExA", 
{C_LONG}, C_LONG ),
hCreateWindowExA       = define_c_func(HBUSER32, "CreateWindowExA", 
{C_LONG, C_LONG, C_LONG, C_LONG, C_INT, C_INT, C_INT, C_INT, C_LONG, 
C_LONG, C_LONG, C_LONG}, C_LONG ),
hCallWindowProcA       = define_c_func(HBUSER32, "CallWindowProcA", 
{C_POINTER, C_LONG, C_INT, C_INT, C_LONG}, C_LONG ),
hPostMessage           = define_c_proc(HBUSER32, "PostMessageA", 
{C_LONG, C_INT, C_INT, C_LONG}),   
hGetClientRect         = define_c_proc(HBUSER32, "GetClientRect", 
{C_LONG, C_LONG}),
hSetPropA              = define_c_proc(HBUSER32, "SetPropA", {C_LONG, 
C_LONG, C_LONG}),
hGetPropA              = define_c_func(HBUSER32, "GetPropA", {C_LONG, 
C_LONG}, C_LONG ),
hDefWindowProcA        = define_c_func(HBUSER32, "DefWindowProcA", 
{C_LONG, C_INT, C_INT, C_LONG}, C_LONG ),
hGetWindowLongA        = define_c_func(HBUSER32, "GetWindowLongA", 
{C_LONG, C_INT}, C_LONG ),
hBeginPaint            = define_c_func(HBUSER32, "BeginPaint", {C_LONG, 
C_LONG}, C_LONG ),
hEndPaint              = define_c_proc(HBUSER32, "EndPaint", {C_LONG, 
C_LONG} ),
hInvalidateRect        = define_c_proc(HBUSER32, "InvalidateRect", 
{C_LONG, C_LONG, C_LONG}),
hGetDC                 = define_c_func(HBUSER32, "GetDC", {C_LONG}, 
C_LONG ),
hReleaseDC             = define_c_proc(HBUSER32, "ReleaseDC", {C_LONG, 
C_LONG}),
hDrawEdge              = define_c_proc(HBUSER32, "DrawEdge", {C_LONG, 
C_LONG, C_INT, C_INT} ),
hDrawTextA             = define_c_proc(HBUSER32, "DrawTextA", {C_LONG, 
C_LONG, C_INT, C_LONG, C_INT} ),
hSetWindowLongA        = define_c_proc(HBUSER32, "SetWindowLongA", 
{C_LONG, C_INT, C_LONG}),
hDrawIconEx            = define_c_proc(HBUSER32, "DrawIconEx", {C_LONG, 
C_INT, C_INT, C_LONG, C_INT, C_INT, C_INT, C_LONG, C_INT}),
hGetIconInfo           = define_c_proc(HBUSER32, "GetIconInfo", {C_LONG, 
C_POINTER}),
hGetUpdateRect         = define_c_func(HBUSER32, "GetUpdateRect", 
{C_LONG, C_LONG, C_LONG}, C_LONG ),

-- gdi32 C routines
hCreateCompatibleDC    = define_c_func(HBGDI32, "CreateCompatibleDC", 
{C_LONG}, C_LONG ),
hPatBlt                = define_c_proc(HBGDI32, "PatBlt", {C_LONG, 
C_INT, C_INT, C_INT, C_INT, C_LONG}),
hCreateCompatibleBitmap= define_c_func(HBGDI32, 
"CreateCompatibleBitmap", {C_LONG, C_INT, C_INT}, C_LONG ),
hCreateBitmap          = define_c_func(HBGDI32, "CreateBitmap", {C_INT, 
C_INT, C_INT, C_INT, C_LONG}, C_LONG ),
hCreateSolidBrush      = define_c_func(HBGDI32, "CreateSolidBrush", 
{C_POINTER}, C_LONG ),
hCreateBrushIndirect   = define_c_func(HBGDI32, "CreateBrushIndirect", 
{C_LONG}, C_LONG ),
hGetStockObject        = define_c_func(HBGDI32, "GetStockObject", 
{C_INT}, C_LONG ),
hDeleteObject          = define_c_func(HBGDI32, "DeleteObject", 
{C_LONG},C_LONG ),
hBitBlt                = define_c_proc(HBGDI32, "BitBlt", {C_LONG, 
C_INT, C_INT, C_INT, C_INT, C_LONG, C_INT, C_INT, C_LONG}),
hDeleteDC              = define_c_func(HBGDI32, "DeleteDC", 
{C_LONG},C_LONG),
hSelectObject          = define_c_func(HBGDI32, "SelectObject", {C_LONG, 
C_LONG},C_LONG),
hSetTextColor          = define_c_proc(HBGDI32, "SetTextColor", {C_LONG, 
C_POINTER}),
hGetObject             = define_c_func(HBGDI32, "GetObjectA", {C_LONG, 
C_INT, C_LONG}, C_INT ),
hSaveDC                = define_c_proc(HBGDI32, "SaveDC", {C_LONG} ),
hRestoreDC             = define_c_proc(HBGDI32, "RestoreDC", {C_LONG, 
C_INT}),
hSetPixel              = define_c_proc(HBGDI32, "SetPixel", {C_LONG, 
C_INT, C_INT, C_POINTER}),
hSetBkColor            = define_c_func(HBGDI32, "SetBkColor", {C_LONG, 
C_POINTER}, C_POINTER ),
hCreateFont            = define_c_func(HBGDI32, "CreateFontA",{C_INT, 
C_INT, C_INT, C_INT, C_INT, C_INT,C_INT, C_INT, C_INT, C_INT, C_INT, 
C_INT, C_INT, C_POINTER}, C_INT),
hSetBkMode             = define_c_proc(HBGDI32, "SetBkMode", {C_LONG, 
C_INT})
---------------------------------------------------------

constant
   WM_PAINT      = #000F,
   WM_LBUTTONDOWN= #0201,
   WM_MOUSEMOVE  = #0200,
   WM_DESTROY    = #0002,
   WM_LBUTTONUP  = #0202,
   FW_NORMAL     = 400,
   BMask         =
   {{1,0,1,0,1,0,1,0},
    {0,1,0,1,0,1,0,1},
    {1,0,1,0,1,0,1,0},
    {0,1,0,1,0,1,0,1},
    {1,0,1,0,1,0,1,0},
    {0,1,0,1,0,1,0,1},
    {1,0,1,0,1,0,1,0},
    {0,1,0,1,0,1,0,1}}
---------------------------------------------------------
constant
   HBPROPCB         = allocate_string("HotButton CallBack "),
   HBPROPLP         = allocate_string("HotButton Structure"),
   WC_HBUTTON       = allocate_string("HotButton"),
   aRECT            = allocate( 16 ),
   aPS              = allocate( 64 ),
   aBmp             = allocate( 32 ),
   aLOGBRUSH        = allocate( 12 ),
   aICONINFO        = allocate( 20 ),
   WS_HBUTTON       = #50000000,
   WM_USER          = #0400,
   
-- HB Ver and Error Msgs
   HB_VER           = "Hot Button 0.1.4",
   HB_CREATE_FAIL   = "Failed to create Hot Button",
   HB_REG_FAIL      = "Failed to Register Hot Button Class",
   HB_DEL_BRUSH_FAIL= "Failed to delete brush!",
   HB_DEL_DC_FAIL   = "Failed to delete Compatible Device Context",
   HB_BRSH_FAIL     = "Failed to create brush",
   HB_CDC_FAIL      = "Failed to create Compatible Device Context",
   HB_CBM_FAIL      = "Failed to create Compatible Bitmap",
   HB_CBM_DEL_FAIL  = "Failed to delete Compatible Bitmap",
   HB_GetDC_FAIL    = "Failed to acquire the Device Context",
   HB_BAD_SET       = "Invalid Group Index Specified",

-- Font Structure
   hbf_fntsz        = 00,
   hbf_fntstyle     = 04,
   hbf_fntheight    = 05,
   sizeof_hbf       = 06,

-- Image Structure
   hbi_onbitmap     = 00,
   hbi_disbitmap    = 04,
   hbi_offbitmap    = 08,
   hbi_ontransclr   = 12,
   hbi_offtransclr  = 16,
   hbi_distransclr  = 20,
   hbi_onbitprop    = 24,
   hbi_disbitprop   = 25,
   hbi_offbitprop   = 26,
   hbi_alignment    = 27,
   sizeof_hbi       = 28,

-- Control Structure
   hb_font          = 00,
   hb_image         = 04,
   hb_txtcolor      = 08,
   hb_text          = 12,
   hb_bkcolor       = 16,
   hb_active        = 20,
   hb_mstatus       = 21,
   hb_hover         = 22,
   hb_togstatus     = 23,
   hb_sstyle        = 24,
   hb_stype         = 25,
   hb_set           = 26,
   sizeof_hb        = 27,
   bit_pos          = {#1,#2,#4,#8,#10,#20}

-- Global Button Styles
global constant
   WM_HBCLICKED     = WM_USER + 20,
   HBS_ENABLED      = #01,   -- Btn Enabled
   HBS_DISABLED     = #02,   -- Btn Disabled
   HBS_TOGGLE       = #04,   -- Btn is toggled
   HBS_ROUNDRECT    = #08,  
   HBS_ELLIPSE      = #10, 
   HBS_RECT         = #20,
   HBI_ICO          = #01,   -- HB_SetImage(); Type:Image Presented is 
an icon
   HBI_BMP          = #02,   -- HB_SetImage(); Type:Image Presented is a 
bitmap
   HBIS_DISABLED    = #01,   -- HB_SetImage(); Image is intended for 
disabled view
   HBIS_HOT         = #02,   -- HB_SetImage(); Image is intended for Hot 
view ie has focus
   HBIS_COLD        = #03,   -- HB_SetImage(); Image is intended for 
Cold view ie lostfocus
   HBLT_OPAQUE      = #01,   -- HB_SetImage(); Image bitblt uses OPAQUE 
mode ie no blending
   HBLT_TRANSPARENT = #02,   -- HB_SetImage(); Transparent; image blends 
with current brush
   HBA_LEFT         = #00,   -- Text is to the left of image
   HBA_BOTTOM       = #01,   -- Text is displayed below image
   HBF_NORMAL       = #01,   -- Use Normal font width/style/underline
   HBF_BOLD         = #02,   -- Use Bold Font
   HBF_ITALIC       = #04,   -- Use Italics
   HBF_UNDERLINE    = #08    -- Use UnderlineStyle

---------------------------------------------------------
integer Type,Style,Void,ExcGrp
atom 
ParentCB,CurParentCB,ACTIVE,Defaultfont,Struct,DefBrush,CurBrush,HDC
sequence rect,ExcSet
  Void     = -1
  ACTIVE   = -1
  Struct   = -1
  Type     = -1
  Style    = -1
  ExcSet   = {}

-------------------------------------------
procedure Report(sequence msg)
-------------------------------------------
   Void = message_box(msg,HB_VER&" Error!",MB_ICONINFORMATION)
end procedure

-------------------------------------------
function RGB(sequence Triad)
-------------------------------------------
   return Triad[1] * #1 +
          Triad[2] * #100 +
          Triad[3] * #10000
end function

-------------------------------------------
function LO_BIT(integer a)
-------------------------------------------
   return and_bits(a,#F)
end function

-------------------------------------------
function HI_BIT(integer a)
-------------------------------------------
   return floor(a/#10)
end function

-------------------------------------------
function MAKE_BYTE(integer a,integer b)
-------------------------------------------
   a = and_bits(a,#F)
   b = and_bits(b,#F)
   return ((b*#10) + a)
end function

-------------------------------------------
function abs(atom a)
-------------------------------------------
   if a > 0 then return a else return (-a) end if
end function

-------------------------------------------
procedure StoreBits(atom Struct,integer val)
-------------------------------------------
   sequence bits
   integer hibit,lobit
   lobit = 0 hibit = 0 bits = {}
   if not val then
      bits = {HBS_ENABLED,HBS_RECT}
   else
      for n = 1 to length(bit_pos) do
         Void = bit_pos[n]
         if and_bits(val,Void) then
            bits &= Void
         end if
      end for
   end if
   for n = 1 to length(bits) do
       Void = bits[n]
       if Void <= HBS_TOGGLE then
          lobit = or_bits(lobit,Void)
       else
          hibit = or_bits(hibit,Void)
       end if
   end for
   poke(Struct + hb_sstyle,hibit)
   poke(Struct + hb_stype ,lobit)
end procedure

-------------------------------------------
function GetClientRect(atom hwnd)
-------------------------------------------
   c_proc(hGetClientRect,{hwnd,aRECT})
   return peek4u({aRECT,4})
end function

-------------------------------------------
function GetBmpSize(atom Bmp)
-------------------------------------------
   if c_func(hGetObject,{Bmp,32,aBmp}) then
      return peek4u({aBmp+04,2})
   end if
   return {0,0}
end function

-------------------------------------------
function GetIcoSize(atom icon)
-------------------------------------------
   atom AndMask
   c_proc(hGetIconInfo,{icon,aICONINFO})
   AndMask = peek4u(aICONINFO + 16)
   return GetBmpSize(AndMask)
end function

-------------------------------------------
function CreateSolidBrush(atom Clr)
-------------------------------------------
   atom brush
   brush = c_func(hCreateSolidBrush,{Clr})
   if not brush then
      Report(HB_BRSH_FAIL)
   end if
   return brush
end function

-------------------------------------------
procedure DeleteBrush(atom brush)
-------------------------------------------
   if not c_func(hDeleteObject,{brush}) then
      Report(HB_DEL_BRUSH_FAIL)
   end if
end procedure

-------------------------------------------
function CreateFont(atom fntAddr)
-------------------------------------------
  integer width,und,ita,fntheight,fntdata
  atom fntname
  sequence bits
  bits = {}
  fntname   = peek4u(fntAddr + hbf_fntsz)
  fntheight = peek(fntAddr + hbf_fntheight)
  fntdata   = peek(fntAddr + hbf_fntstyle)
  if not fntdata then
     width = FW_NORMAL
     und   = 0
     ita   = 0
  else
     for n = 1 to length(bit_pos) do
         Void = bit_pos[n]
         if and_bits(fntdata,Void) then
            bits &= Void
         end if
     end for
     if not find(HBF_BOLD,bits) then width = FW_NORMAL else width = 
FW_NORMAL * 1.5 end if
     if not find(HBF_ITALIC,bits) then ita = 0 else ita = 1 end if
     if not find(HBF_UNDERLINE,bits) then und = 0 else und = 1 end if
  end if
  return 
c_func(hCreateFont,{fntheight,0,0,0,width,ita,und,0,0,0,0,0,0,fntname})
end function

-------------------------------------------
function GetDC(atom hwnd)
-------------------------------------------
   hwnd = c_func(hGetDC,{hwnd})
   if not hwnd then
      Report(HB_GetDC_FAIL)
   end if
   c_proc(hSaveDC,{hwnd})
   return hwnd
end function

-------------------------------------------
procedure ReleaseDC(atom hwnd,atom HDC)
-------------------------------------------
   c_proc(hRestoreDC,{HDC,-1})
   c_proc(hReleaseDC,{hwnd,HDC})
end procedure

-------------------------------------------
function CreateCompatibleDC(atom HDC)
-------------------------------------------
   HDC = c_func(hCreateCompatibleDC,{HDC})
   if not HDC then
      Report(HB_CDC_FAIL)
   end if
   return HDC
end function

-------------------------------------------
procedure DeleteDC(atom HDC)
-------------------------------------------
   if not c_func(hDeleteDC,{HDC}) then
      Report(HB_DEL_DC_FAIL)
   end if
end procedure

-------------------------------------------
function CreateCompatibleBitmap(atom HDC,atom cx,atom cy)
-------------------------------------------
   HDC = c_func(hCreateCompatibleBitmap,{HDC,cx,cy})
   if not HDC then
      Report(HB_CBM_FAIL)
   end if
   return HDC
end function

-------------------------------------------
procedure DeleteCompatibleBitmap(atom bm)
-------------------------------------------
   if not c_func(hDeleteObject,{bm}) then
      Report(HB_CBM_DEL_FAIL)
   end if
end procedure

-------------------------------------------
function SelectObject(atom HDC,atom Obj)
-------------------------------------------
   return c_func(hSelectObject,{HDC,Obj})
end function

-------------------------------------------
function CreatePatternBrush(atom HDC,atom clr)
-------------------------------------------
   atom MbmBMP,MemDC,OldBm,Brush
   MemDC = CreateCompatibleDC(HDC)
   MbmBMP= CreateCompatibleBitmap(HDC,8,8)
   OldBm = SelectObject(MemDC,MbmBMP)
   c_proc(hPatBlt,{MemDC,0,0,8,8,#00F00021})
   if clr = #FFFFFF then clr = #C0C0C0 end if
   for n = 1 to 8 do
       for m = 1 to 8 do
           Void = BMask[n][m]
           if Void then
              c_proc(hSetPixel,{MemDC,n-1,m-1,clr})
           end if
       end for
   end for
   poke4(aLOGBRUSH,{3,0,MbmBMP})
   Brush = c_func(hCreateBrushIndirect,{aLOGBRUSH})
   OldBm = SelectObject(MemDC,OldBm)
   DeleteCompatibleBitmap(MbmBMP)
   DeleteDC(MemDC)
   return Brush
end function

-------------------------------------------
procedure BltBitMap(atom HDC,atom bitmap,atom x,atom y,atom cx,atom cy)
-------------------------------------------
   atom MemDC
   MemDC = CreateCompatibleDC(HDC)
   Void = SelectObject(MemDC,bitmap)
   c_proc(hBitBlt,{HDC,x,y,cx,cy,MemDC,0,0,#00CC0020})
   DeleteDC(MemDC)
end procedure

-------------------------------------------
procedure TransparentBlt(atom HDC,atom bitmap,atom x,atom y,atom cx,atom 
cy,atom bkcolor)
-------------------------------------------
   atom 
SourceDC,SavedDC,InvertedDC,MaskDC,FinalDC,InvertedBmp,MaskBmp,FinalBmp,SavedBmp,

        
PrevInvBmp,PrevMaskBmp,PrevFinalBmp,PrevSavedBmp,PrevSourceBmp,PrevColor
   SourceDC   = CreateCompatibleDC(HDC)
   SavedDC    = CreateCompatibleDC(HDC)
   InvertedDC = CreateCompatibleDC(HDC)
   FinalDC    = CreateCompatibleDC(HDC)
   MaskDC     = CreateCompatibleDC(HDC)
   FinalBmp   = CreateCompatibleBitmap(HDC,cx,cy)
   SavedBmp   = CreateCompatibleBitmap(HDC,cx,cy)
   InvertedBmp= c_func(hCreateBitmap,{cx,cy,1,1,0})
   MaskBmp    = c_func(hCreateBitmap,{cx,cy,1,1,0})
   PrevSourceBmp = SelectObject(SourceDC,bitmap )
   PrevSavedBmp  = SelectObject(SavedDC,SavedBmp)
   PrevFinalBmp  = SelectObject(FinalDC,FinalBmp)
   PrevMaskBmp   = SelectObject(MaskDC ,MaskBmp )
   PrevInvBmp    = SelectObject(InvertedDC,InvertedBmp)
   c_proc(hBitBlt,{SavedDC,0,0,cx,cy,SourceDC,0,0,#00CC0020})
   PrevColor = c_func(hSetBkColor,{SourceDC,bkcolor})
   c_proc(hBitBlt,{MaskDC,0,0,cx,cy,SourceDC,0,0,#00CC0020})
   PrevColor = c_func(hSetBkColor,{SourceDC,PrevColor})
   c_proc(hBitBlt,{InvertedDC,0,0,cx,cy,MaskDC,0,0,#00330008})
   c_proc(hBitBlt,{FinalDC,0,0,cx,cy,HDC,x,y,#00CC0020})
   c_proc(hBitBlt,{FinalDC,0,0,cx,cy,MaskDC,0,0,#008800C6})
   c_proc(hBitBlt,{SourceDC,0,0,cx,cy,InvertedDC,0,0,#008800C6})
   c_proc(hBitBlt,{FinalDC,0,0,cx,cy,SourceDC,0,0,#00EE0086})
   c_proc(hBitBlt,{HDC,x,y,cx,cy,FinalDC,0,0,#00CC0020})
   c_proc(hBitBlt,{SourceDC,0,0,cx,cy,SavedDC,0,0,#00CC0020})
   Void = SelectObject(SourceDC,PrevSourceBmp)
   Void = SelectObject(SavedDC,PrevSavedBmp  )
   Void = SelectObject(FinalDC,PrevFinalBmp  )
   Void = SelectObject(MaskDC,PrevMaskBmp    )
   Void = SelectObject(InvertedDC,PrevInvBmp )
   DeleteCompatibleBitmap(FinalBmp)
   DeleteCompatibleBitmap(SavedBmp)
   DeleteCompatibleBitmap(MaskBmp )
   DeleteCompatibleBitmap(InvertedBmp)
   DeleteDC(FinalDC)
   DeleteDC(InvertedDC)
   DeleteDC(MaskDC)
   DeleteDC(SavedDC)
   DeleteDC(SourceDC)
end procedure

-------------------------------------------
function PrepareDC(atom HDC,sequence rect,atom str)
-------------------------------------------
   atom Oldfont,Oldbrush,fontAddr,hfont,brush hfont= 0
   brush = peek4u(str+hb_bkcolor)
   fontAddr = peek4u(str+hb_font)
   if fontAddr then
     hfont = CreateFont(fontAddr)
     Oldfont = SelectObject(HDC,hfont)
   else
     Oldfont = SelectObject(HDC,Defaultfont)
   end if
   c_proc(hSetBkMode,{HDC,1})
   brush = CreateSolidBrush(brush)
   Oldbrush = SelectObject(HDC,brush)
   c_proc(hSetTextColor,{HDC,peek4u(str+hb_txtcolor)})
   c_proc(hPatBlt,{HDC,rect[1],rect[2],rect[3],rect[4],#00F00021})
   Oldbrush = SelectObject(HDC,Oldbrush)
   DeleteBrush(brush)
   return {Oldfont,hfont}
end function

-------------------------------------------
function CalculateRect(sequence rect,sequence imgrect,integer 
alignment,integer txtflag)
-------------------------------------------
   atom X1,Y1,R1,R2,R3,R4,C,DT_Flag
   if txtflag then
      if not alignment then
         Y1 = floor(abs(rect[4]-imgrect[2])/2)
         X1 = 2
         R1 = imgrect[1]+ X1 + 4
         R2 = Y1 + floor((imgrect[2]/4))
         R3 = rect[3]
         R4 = rect[4]
         DT_Flag = #20
      else
         X1 = floor(abs(rect[3]-imgrect[1])/2)
         Y1 = 2
         C  = imgrect[2] + Y1 + 4
         R1 = rect[1]
         R2 = (C + floor(abs(rect[4]-C)/2))
         R3 = rect[3]
         R4 = rect[4]
         DT_Flag = #125
      end if
   else
      Y1 = floor(abs(rect[4]-imgrect[2])/2)
      X1 = floor(abs(rect[3]-imgrect[1])/2)
      R1 = 0 R2 = 0 R3 = 0 R4 = 0 DT_Flag = 0
   end if
   return {X1,Y1,R1,R2,R3,R4,DT_Flag}
end function

-------------------------------------------
procedure DisplayRectButton(atom str,atom HDC,sequence rect,atom 
HImage,integer Style,integer tog,atom transclr,integer alignment)
-------------------------------------------
   integer imgType,bltType,DT_Flag,len
   atom PatBrush,OldBrush,pszAddr
   sequence imgrect,frect,fnt
   fnt = PrepareDC(HDC,rect,str)
   pszAddr = peek4u(str + hb_text)
   len = c_func(hlstrlen,{pszAddr})
   if tog then
      PatBrush = CreatePatternBrush(HDC,peek4u(str+hb_bkcolor))
      OldBrush = SelectObject(HDC,PatBrush)
      c_proc(hPatBlt,{HDC,0,0,rect[3],rect[4],#00F00021})
   end if
   if HImage then
      imgType = HI_BIT(Style)
      bltType = LO_BIT(Style)
      if imgType = HBI_BMP then
         imgrect = GetBmpSize(HImage)
         frect = CalculateRect(rect,imgrect,alignment,len)
         if tog then frect[1] += 2 frect[3] += 2 end if
         poke4(aRECT,{frect[3],frect[4],frect[5],frect[6]})
         if bltType = HBLT_OPAQUE then
            
BltBitMap(HDC,HImage,frect[1],frect[2],imgrect[1],imgrect[2])
         elsif bltType = HBLT_TRANSPARENT then
            
TransparentBlt(HDC,HImage,frect[1],frect[2],imgrect[1],imgrect[2],transclr)

         end if
         DT_Flag = frect[7]
      elsif imgType = HBI_ICO then
         imgrect = GetIcoSize(HImage)
         frect = CalculateRect(rect,imgrect,alignment,len)
         if tog then frect[1] += 2 frect[3] += 2 end if
         poke4(aRECT,{frect[3],frect[4],frect[5],frect[6]})
         
c_proc(hDrawIconEx,{HDC,frect[1],frect[2],HImage,imgrect[1],imgrect[2],0,0,3})

         DT_Flag = frect[7]
      end if
   else
      DT_Flag = #125            
      if tog then
         poke4(aRECT,rect[1] + 3 & rect[2..4])
      end if
   end if
   if tog then
      OldBrush = SelectObject(HDC,OldBrush)
      DeleteBrush(PatBrush)  
   end if
   if len then
      c_proc(hDrawTextA,{HDC,pszAddr,len,aRECT,DT_Flag})
   end if
   Void = SelectObject(HDC,fnt[1])
   if fnt[2] then
      Void = c_func(hDeleteObject,{fnt[2]})
   end if
end procedure

-------------------------------------------
procedure BltOnImage_RECT(atom hwnd,atom HDC,atom str)
-------------------------------------------
   sequence rect
   atom ImageAddr
   rect = GetClientRect(hwnd)
   ImageAddr = peek4u(str + hb_image)
   if ImageAddr then
      DisplayRectButton(str,HDC,rect,
                        peek4u(ImageAddr + hbi_onbitmap),
                        peek(ImageAddr + hbi_onbitprop),0,
                        peek4u(ImageAddr+hbi_ontransclr),
                        peek(ImageAddr + hbi_alignment))
   else
      DisplayRectButton(str,HDC,rect,0,0,0,0,0)
   end if
   poke4(aRECT,rect)
   c_proc(hDrawEdge,{HDC,aRECT,#4,15})
end procedure

-------------------------------------------
procedure BltOffImage_RECT(atom hwnd,atom HDC,atom str)
-------------------------------------------
   sequence rect
   atom ImageAddr
   rect = GetClientRect(hwnd)
   ImageAddr = peek4u(str + hb_image)
   if ImageAddr then
      DisplayRectButton(str,HDC,rect,
                        peek4u(ImageAddr + hbi_offbitmap),
                        peek(ImageAddr + hbi_offbitprop),0,
                        peek4u(ImageAddr+hbi_offtransclr),
                        peek(ImageAddr + hbi_alignment))
   else
      DisplayRectButton(str,HDC,rect,0,0,0,0,0)
   end if
end procedure

-------------------------------------------
procedure BltTogImage_RECT(atom hwnd,atom HDC,atom str)
-------------------------------------------
   sequence rect
   atom ImageAddr
   rect = GetClientRect(hwnd)
   ImageAddr = peek4u(str + hb_image)
   if ImageAddr then
      DisplayRectButton(str,HDC,rect,
                        peek4u(ImageAddr + hbi_onbitmap),
                        peek(ImageAddr + hbi_onbitprop),1,
                        peek4u(ImageAddr+hbi_ontransclr),
                        peek(ImageAddr + hbi_alignment))
   else
      DisplayRectButton(str,HDC,rect,0,0,1,0,0)
   end if
   poke4(aRECT,rect)
   c_proc(hDrawEdge,{HDC,aRECT,10,15})
end procedure

-------------------------------------------
procedure ReleaseToggle(integer grp,atom btn)
-------------------------------------------
    atom hwnd,Struct
    if grp >0 and grp <= length(ExcSet) then
       hwnd = ExcSet[grp]
       ExcSet[grp] = btn
       if hwnd then
          Struct = c_func(hGetPropA,{hwnd,HBPROPLP})
          if Struct then
             if peek(Struct + hb_togstatus) then
                poke(Struct + hb_active   , 1 )
                poke(Struct + hb_mstatus  , 0 )
                poke(Struct + hb_togstatus, 0 )
                c_proc(hInvalidateRect,{hwnd,0,1})
             end if
          end if
       end if
    end if
end procedure

-------------------------------------------
global function HB_Create(atom parent,sequence text,atom x,atom y,atom 
cx,atom cy,integer Style)
-------------------------------------------
   atom hwnd,sz,CallBackA,str
   sequence r
   hwnd = 
c_func(hCreateWindowExA,{0,WC_HBUTTON,0,WS_HBUTTON,x,y,cx,cy,parent,0,instance(),0})

   if not hwnd then
      Report(HB_CREATE_FAIL)
      return hwnd
   end if
   CallBackA = c_func(hGetWindowLongA,{parent,-4})
   if CallBackA != CurParentCB then
      c_proc(hSetPropA,{parent,HBPROPCB,CallBackA})
      c_proc(hSetWindowLongA,{parent,-4,CurParentCB})
   end if
   str = allocate(sizeof_hb)
   sz  = allocate_string(text)
   mem_set(str,0,sizeof_hb)
   poke4(str+hb_bkcolor ,#C0C0C0)
   poke4(str+hb_text    ,sz     )
   StoreBits(str,Style)
   c_proc(hSetPropA,{hwnd,HBPROPLP,str})
   return hwnd
end function

-------------------------------------------
global procedure HB_SetFont(atom hwnd,sequence fontname,integer 
height,atom fntdata)
-------------------------------------------
   atom str,sz,fntname,fntAddr
   str = c_func(hGetPropA,{hwnd,HBPROPLP})
   if str then
      sz = peek4u(str + hb_font)
      if sz then
        fntname = peek4u(sz + hbf_fntsz)
        if fntname then
           free(fntname)
        end if
        poke4(sz + hbf_fntsz,allocate_string(fontname))
        poke(sz + hbf_fntheight,height)
        poke(sz + hbf_fntstyle,fntdata)
        return
      end if
      fntAddr = allocate(sizeof_hbf)
      mem_set(fntAddr,0,sizeof_hbf)
      poke4(fntAddr + hbf_fntsz,allocate_string(fontname))
      poke(fntAddr + hbf_fntheight,height)
      poke(fntAddr + hbf_fntstyle,fntdata)
      poke4(str + hb_font,fntAddr)
   end if
end procedure

-------------------------------------------
global procedure HB_SetText(atom hwnd,sequence text)
-------------------------------------------
   atom str,sz,psz
   str = c_func(hGetPropA,{hwnd,HBPROPLP})
   if str then
      psz = peek4u(str + hb_text)
      if psz then
        free(psz)
      end if
      poke4(str+hb_text,allocate_string(text))
   end if
end procedure

-------------------------------------------
global function HB_GetText(atom hwnd)
-------------------------------------------
   atom str,sz
   str = c_func(hGetPropA,{hwnd,HBPROPLP})
   if str then
      sz = peek4u(str+hb_text)
      return peek({sz,c_func(hlstrlen,{sz})})
   end if
   return {}
end function

-------------------------------------------
global procedure HB_SetTextColor(atom hwnd,object clr)
-------------------------------------------
    atom colorref,str
    if sequence(clr) then
       colorref =  RGB(clr)
    else
       colorref = clr
    end if
    str = c_func(hGetPropA,{hwnd,HBPROPLP})
    if str then
      poke4(str+hb_txtcolor,colorref)
    end if
end procedure

-------------------------------------------
global function HB_GetTextColor(atom hwnd)
-------------------------------------------
   atom str
   str = c_func(hGetPropA,{hwnd,HBPROPLP})
   if str then
      return peek4u(str + hb_txtcolor)
   end if
   return -1
end function

-------------------------------------------
global procedure HB_SetBackColor(atom hwnd,object clr)
-------------------------------------------
    atom colorref,str
    if sequence(clr) then
       colorref = RGB(clr)
    else
       colorref = clr
    end if
    str = c_func(hGetPropA,{hwnd,HBPROPLP})
    if str then
       poke4(str+hb_bkcolor,colorref)
    end if
end procedure

-------------------------------------------
global function HB_GetBackColor(atom hwnd)
-------------------------------------------
   atom str
   str = c_func(hGetPropA,{hwnd,HBPROPLP})
   if str then
      return peek4u(str + hb_bkcolor)
   end if
   return -1
end function

-------------------------------------------
global procedure HB_SetAlignment(atom hwnd,integer flag)
-------------------------------------------
  atom str,image str = c_func(hGetPropA,{hwnd,HBPROPLP})
  if str then
     image = peek4u(str + hb_image)
     if image then
        poke(image + hbi_alignment,flag)
     end if
  end if
end procedure

-------------------------------------------
global procedure HB_SetImage(atom hwnd,atom image,integer State,integer 
Type,integer bltForm,atom colorref)
-------------------------------------------
  atom str,imgAddr
  integer pack,x x = 0
  str = c_func(hGetPropA,{hwnd,HBPROPLP})
  if str then
     pack = MAKE_BYTE(bltForm,Type)
     imgAddr = peek4u(str + hb_image)
     if not imgAddr then
        imgAddr = allocate(sizeof_hbi)
        mem_set(imgAddr,0,sizeof_hbi)
        x = 1
     end if
     if State = HBIS_DISABLED then
        poke4(imgAddr + hbi_disbitmap,image)
        poke4(imgAddr + hbi_distransclr,colorref)
        poke (imgAddr + hbi_disbitprop,pack)
     elsif State = HBIS_HOT then
        poke4(imgAddr + hbi_onbitmap,image)
        poke4(imgAddr + hbi_ontransclr,colorref)
        poke (imgAddr + hbi_onbitprop,pack)
     elsif State = HBIS_COLD then
        poke4(imgAddr + hbi_offbitmap,image)
        poke4(imgAddr + hbi_offtransclr,colorref)
        poke (imgAddr + hbi_offbitprop,pack)
     end if
     if x then poke4(str + hb_image,imgAddr) end if
  end if
end procedure

-------------------------------------------
global function HB_MakeToggleGroup()
-------------------------------------------
   ExcSet &= 0
   return length(ExcSet)
end function

-------------------------------------------
global procedure HB_AddToGroup(integer grp,object Btn)
-------------------------------------------
   atom Str
   if grp < 1 and grp > length(ExcSet) then
      Report(HB_BAD_SET)
   end if
   if atom(Btn) then
      Str = c_func(hGetPropA,{Btn,HBPROPLP})
      if Str then
         poke(Str + hb_set,grp)
      end if
   else
      for n = 1 to length(Btn) do
         HB_AddToGroup(grp,Btn[n])
      end for
   end if
end procedure

-------------------------------------------
procedure HB_BtnCleanup(atom hwnd)
-------------------------------------------
   atom StrAddr,fontAddr,imgAddr
   Struct = c_func(hGetPropA,{hwnd,HBPROPLP})
   if Struct then
      StrAddr = peek4u(Struct + hb_text)
      if StrAddr then
         free(StrAddr)
      end if
      fontAddr = peek4u(Struct + hb_font)
      if fontAddr then
         StrAddr = peek4u(fontAddr + hbf_fntsz)
         if StrAddr then free(StrAddr) end if
         free(fontAddr)
      end if
      imgAddr = peek4u(Struct + hb_image)
      if imgAddr then
         free(imgAddr)
      end if
      free(Struct)
   end if
end procedure

-------------------------------------------
procedure HB_Cleanup()
-------------------------------------------
   free(HBPROPCB)
   free(HBPROPLP)
   free(WC_HBUTTON)
   free(aRECT)
   free(aPS)
   free(aBmp)
   free(aLOGBRUSH)
   free(aICONINFO)
   DeleteBrush(Defaultfont)
end procedure

-------------------------------------------
function HBWndProc(atom hwnd,atom msg,atom wParam,atom lParam)
-------------------------------------------
   if msg = WM_PAINT then
      if c_func(hGetUpdateRect,{hwnd,0,0}) then
        HDC = c_func(hBeginPaint,{hwnd,aPS})
        c_proc(hSaveDC,{HDC})
        Struct = c_func(hGetPropA,{hwnd,HBPROPLP})
        Type     = peek(Struct + hb_stype)
        Style    = peek(Struct + hb_sstyle)
        if Style = HBS_RECT then
           if Type = HBS_ENABLED then
              BltOffImage_RECT(hwnd,HDC,Struct)
           elsif Type = HBS_TOGGLE then
               if peek(Struct + hb_togstatus) then
                  BltTogImage_RECT(hwnd,HDC,Struct)
               else
                  BltOffImage_RECT(hwnd,HDC,Struct)
               end if
           elsif Type = HBS_DISABLED then
           end if
        elsif Style = HBS_ROUNDRECT then
        elsif Style = HBS_ELLIPSE then
        end if
        c_proc(hRestoreDC,{HDC,-1})
        c_proc(hEndPaint,{hwnd,aPS})
      end if
   elsif msg = WM_LBUTTONDOWN then
      Struct = c_func(hGetPropA,{hwnd,HBPROPLP})
      HDC = GetDC(hwnd)
      Type     = peek(Struct + hb_stype)
      Style    = peek(Struct + hb_sstyle)
      poke(Struct + hb_active , 1 )
      poke(Struct + hb_mstatus, 1 )
      poke(Struct + hb_hover  , 1 )
      if Style = HBS_RECT then
         if Type = HBS_TOGGLE then
            if peek(Struct + hb_togstatus) then
               poke(Struct + hb_togstatus, 0 )
            else
               poke(Struct + hb_togstatus, 1 )
               ExcGrp = peek(Struct + hb_set)
               if ExcGrp then
                  ReleaseToggle(ExcGrp,hwnd)
               end if
            end if
         elsif Type = HBS_DISABLED then
         end if
         BltTogImage_RECT(hwnd,HDC,Struct)
      elsif Style = HBS_ROUNDRECT then
      elsif Style = HBS_DISABLED then
      end if
      ACTIVE = hwnd
      ReleaseDC(hwnd,HDC)
   elsif msg = WM_MOUSEMOVE then
       if ACTIVE != hwnd then
         if ACTIVE > 0 then
           Struct = c_func(hGetPropA,{ACTIVE,HBPROPLP})
           poke(Struct + hb_active, 0 )
           poke(Struct + hb_mstatus,0 )
           poke(Struct + hb_hover  ,0 )
           c_proc(hInvalidateRect,{ACTIVE,0,1})
           ACTIVE = hwnd
           return 0
        end if
      end if
      Struct = c_func(hGetPropA,{hwnd,HBPROPLP})
      if not peek(Struct + hb_hover) then
        poke(Struct + hb_active , 1 )
        poke(Struct + hb_hover  , 1 )
        HDC = GetDC(hwnd)
        Type     = peek(Struct + hb_stype)
        Style    = peek(Struct + hb_sstyle)
        if Style = HBS_RECT then
           if Type = HBS_TOGGLE then
              if peek(Struct + hb_togstatus) then
                 BltTogImage_RECT(hwnd,HDC,Struct)
              else
                 BltOnImage_RECT(hwnd,HDC,Struct)
              end if
           elsif Type = HBS_ENABLED then
              BltOnImage_RECT(hwnd,HDC,Struct)
           elsif Type = HBS_DISABLED then
           end if
        elsif Style = HBS_ROUNDRECT then
        elsif Style = HBS_ELLIPSE then
        end if
        ReleaseDC(hwnd,HDC)
      end if
      ACTIVE = hwnd
   elsif msg = WM_LBUTTONUP then
      Struct = c_func(hGetPropA,{hwnd,HBPROPLP})
      poke(Struct + hb_active , 1 )
      poke(Struct + hb_mstatus, 0 )
      Type     = peek(Struct + hb_stype)
      Style    = peek(Struct + hb_sstyle)
      HDC = GetDC(hwnd)
      if Style = HBS_RECT then
         if Type = HBS_TOGGLE then
            if not peek(Struct + hb_togstatus) then
               BltOnImage_RECT(hwnd,HDC,Struct)
            end if
         elsif Type = HBS_ENABLED then
            BltOnImage_RECT(hwnd,HDC,Struct)
         elsif Type = HBS_DISABLED then
         end if
      elsif Style = HBS_ROUNDRECT then
      elsif Style = HBS_ELLIPSE then
      end if
      ReleaseDC(hwnd,HDC)
      c_proc(hPostMessage,{#FFFF,WM_HBCLICKED,0,hwnd})
      c_proc(hPostMessage,{hwnd,WM_HBCLICKED,0,hwnd})
   elsif msg = WM_DESTROY then
      HB_BtnCleanup(hwnd)
   end if
   return c_func(hCallWindowProcA,{CurParentCB,hwnd,msg,wParam,lParam})
end function

-------------------------------------------
function ParentWndProc(atom hwnd,atom msg,atom wParam,atom lParam)
-------------------------------------------
   ParentCB = c_func(hGetPropA,{hwnd,HBPROPCB})
   if not ParentCB then
       return c_func(hDefWindowProcA,{hwnd,msg,wParam,lParam})
   end if
   if msg = WM_MOUSEMOVE then
      if ACTIVE then
         Struct = c_func(hGetPropA,{ACTIVE,HBPROPLP})
         if Struct then
            poke(Struct + hb_active , 0 )
            poke(Struct + hb_hover  , 0 )
            if not peek(Struct + hb_mstatus) then
                c_proc(hInvalidateRect,{ACTIVE,0,1})
                ACTIVE = 0
            end if
         end if
      end if
   elsif msg = WM_LBUTTONUP then
      if ACTIVE then
          Struct = c_func(hGetPropA,{ACTIVE,HBPROPLP})
          if Struct then
             if peek(Struct + hb_mstatus) then
                c_proc(hInvalidateRect,{ACTIVE,0,1})
                poke(Struct + hb_mstatus, 0 )
                ACTIVE = 0
             end if
          end if
      end if
   elsif msg = WM_DESTROY then
      HB_Cleanup()
   end if
   return c_func(hCallWindowProcA,{ParentCB,hwnd,msg,wParam,lParam})
end function
CurParentCB = call_back(routine_id("ParentWndProc"))

-------------------------------------------
procedure StartHBClass()
-------------------------------------------
   atom wca,hInst,HBCBA
   HBCBA = call_back(routine_id("HBWndProc"))
   hInst = instance()
   wca = allocate(48)
   Defaultfont = c_func(hGetStockObject, { 12 } )
   mem_set(wca,0,48)
   poke4(wca+00,48   )
   poke4(wca+08,HBCBA)
   poke4(wca+20,hInst)
   poke4(wca+32,16   )
   poke4(wca+40,WC_HBUTTON)
   if not c_func(hRegisterClassEx,{wca}) then
      Report(HB_REG_FAIL)
   end if   
   free(wca)
end procedure
StartHBClass()
---------------------------------------------------------

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu