October 28, 2025, 02:03:45 PM

News:

Own IWBasic 2.x ? -----> Get your free upgrade to 3.x now.........


Ownerdraw button not work

Started by fasecero, November 22, 2008, 02:30:56 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

fasecero

Sorry, me again.
I'm trying to make an ownerdraw button... what's wrong here?

Quote

/* OWNERDRAW BUTTON */

$include "windows.inc"

window w1
CONST BUTTON_1 = 1
uint hDC ' Device context for the button

OPENWINDOW w1,0,0,300,202,@MINBOX|@MAXBOX|@SIZE|@NOAUTODRAW,NULL,"Ownerdraw Button",&main

REM when w1 = 0 the window has been closed
WAITUNTIL w1 = 0
END

SUB main
   SELECT @MESSAGE
      CASE @IDCREATE
         ' creating the ownerdraw button
         CONTROLEX w1, "BUTTON", "", 82, 85, 136, 32, BS_OWNERDRAW, 0, BUTTON_1

      CASE WM_DRAWITEM ' message send to w1 when the button need to be painted
         ' @LPARAM contain the type DRAWITEMSTRUCT
         ' the member hdc contain the DC of the button
         ' the member rcItem the type WINRECT of the button
         hDC = _CreateCompatibleDC(*<DRAWITEMSTRUCT>@LPARAM.hdc)
            ' here i wanna draw the frame
            _DrawFrameControl(hDC,*<DRAWITEMSTRUCT>@LPARAM.rcItem,DFC_BUTTON,DFCS_BUTTONPUSH)
            ' then here other stuff...
            ' ...
            ' ...
         _DeleteDC(hDC)

      CASE @IDCLOSEWINDOW
         CLOSEWINDOW w1

      CASE @IDCONTROL
         SELECT @CONTROLID
            CASE BUTTON_1
               IF @NOTIFYCODE = 0
                  /*button clicked*/
                  MESSAGEBOX w1,"hello","ownerdraw button clicked"
               ENDIF
         ENDSELECT
   ENDSELECT
RETURN
ENDSUB


The button exist because the click work, but the frame is not painted.
Any help are welcome :)

Ionic Wind Support Team

In Emergence BASIC WM_DRAWITEM is sent to the controls handler, reflected from the internal WinProc.  So you'll need to subclass the control to get the message, or subclass the window to process it before it is reflected.

This is done because Emergence uses two owner drawn button types, @BUTTON and @RGNBUTTON.

If you don't know how to subclass a control then search the forums here, or ask ;)

Paul.
Ionic Wind Support Team

fasecero

Ahhh i understand now, i see why the win procedure never get the message... i will subclass the button. Ty so much for your help and time  :)

fasecero

Well, i cannot get it... here i did make a try using a button subclass, but the button still don't draw anything



/* OWNERDRAW BUTTON */

$include "windows.inc"

window w1
CONST BUTTON_1 = 1
uint hDC ' Device context for the button
int hbutton 'hwnd of the button
int oldbuttonproc ' contain the button procedure without subclassing


OPENWINDOW w1,0,0,300,202,@MINBOX|@MAXBOX|@SIZE,NULL,"Ownerdraw Button",&main

REM when w1 = 0 the window has been closed
WAITUNTIL w1 = 0
END

SUB main
   SELECT @MESSAGE
      CASE @IDCREATE
         ' creating the ownerdraw button
         CONTROLEX w1, "BUTTON", "", 82, 85, 136, 32, BS_OWNERDRAW, 0, BUTTON_1
' subclassing the control...
' drawbutton is the new button procedure
hbutton = GETCONTROLHANDLE(w1,BUTTON_1)
oldbuttonproc = _SetWindowLong(hbutton,GWL_WNDPROC,&drawbutton)


      CASE @IDCLOSEWINDOW
         CLOSEWINDOW w1

      CASE @IDCONTROL
         SELECT @CONTROLID
            CASE BUTTON_1
               IF @NOTIFYCODE = 0
                  /*button clicked*/
                  MESSAGEBOX w1,"ownerdraw button clicked","Hello"
               ENDIF
         ENDSELECT
   ENDSELECT
RETURN
ENDSUB

SUB drawbutton(hWnd:INT,uMsg:INT,wParam:INT,lParam:INT),INT
SELECT uMsg
CASE WM_DRAWITEM ' message send to w1 when the button need to be painted
' @LPARAM contain the type DRAWITEMSTRUCT
' the member hdc contain the DC of the button
' the member rcItem the type WINRECT of the button
SELECT *<DRAWITEMSTRUCT>lParam.CtlID
CASE BUTTON_1
hDC = _CreateCompatibleDC(*<DRAWITEMSTRUCT>lParam.hdc)
' here i wanna draw the frame
_DrawFrameControl(hDC,*<DRAWITEMSTRUCT>lParam.rcItem,DFC_BUTTON,DFCS_BUTTONPUSH)
' then here other stuff...
' ...
' ...
_DeleteDC(hDC)
ENDSELECT
ENDSELECT
RETURN _CallWindowProc(oldbuttonproc,hWnd,uMsg,wParam,lParam)
ENDSUB


fasecero

k, don't know why, but works if i not use a DC Compatible, just directly draw in the DC obtained from lParam.
I mean replacing...


hDC = _CreateCompatibleDC(*<DRAWITEMSTRUCT>lParam.hdc)
    _DrawFrameControl(hDC,*<DRAWITEMSTRUCT>lParam.rcItem,DFC_BUTTON,DFCS_BUTTONPUSH)
_DeleteDC(hDC)


with...


hDC=*<DRAWITEMSTRUCT>lParam.hdc
_DrawFrameControl(hDC,*<DRAWITEMSTRUCT>lParam.rcItem,DFC_BUTTON,DFCS_BUTTONPUSH)


Ionic Wind Support Team

Yes, it is a requirement of ownerdrawn controls that you have to use the device context passed by the WM_DRAWITEM message.  At least according to Microsoft ;)
Ionic Wind Support Team

fasecero

lol, understood  :). Now i will to add the things that i wanna put in the buttons (image, text and so on). ty for you help in this issue.