Announcement

Collapse
No announcement yet.

Moveable Dialog without a Caption bar?

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Guest's Avatar
    Guest replied
    Thanks Lance! Your code, of course, works. It seems easier to me, however to use:
    Code:
      SELECT CASE CBMSG
         CASE %WM_LBUTTONDOWN
           SendMessage ghDlg, %WM_NCLBUTTONDOWN, %HTCAPTION, BYVAL %NULL
      END SELECT
    which also works. Is there anything that makes (your) subclassing method 'better', 'safer', etc. ?

    Thanks!

    William Fletcher

    Leave a comment:


  • Lance Edmonds
    replied
    DDT does withhold %WM_NCHITTEST messages from your dialog callback... the easy solution is to subclass the DDT dialog... with DDT this is really easy as we can use a CALLBACK function for the subclass procedure.

    Try this example:
    Code:
    #COMPILE EXE
    #INCLUDE "win32api.INC"
     
    GLOBAL oldproc AS LONG
     
    CALLBACK FUNCTION DlgProc
      IF CBMSG = %WM_COMMAND AND CBCTL = %IDOK THEN DIALOG END CBHNDL
      IF CBMSG = %WM_DESTROY THEN SetWindowLong CBHNDL, %GWL_WNDPROC, oldproc
    END FUNCTION
     
    CALLBACK FUNCTION subclass
      IF CBMSG = %WM_NCHITTEST THEN
          FUNCTION = %HTCAPTION
      ELSE
          FUNCTION = CallWindowProc(oldproc, CBHNDL, CBMSG, CBWPARAM, CBLPARAM)
      END IF
    END FUNCTION
     
    FUNCTION PBMAIN
        DIALOG NEW 0, "HTCAPTION test", , , 100, 200, %WS_BORDER TO hDlg&
        CONTROL ADD BUTTON, hDlg&, %IDOK, "&Quit", 30, 90, 40, 14
        OldProc = SetWindowLong(hDlg&, %GWL_WNDPROC, CODEPTR(subclass))
        DIALOG SHOW MODAL hDlg&, CALL DlgProc
    END FUNCTION
    -------------
    Lance
    PowerBASIC Support
    mailto:[email protected][email protected]</A>

    Leave a comment:


  • Chris Boss
    replied
    Maybe it is a DDT thing !

    WM_NCHITTEST should work the way you use it if it was in a normal Dialog Procedure (SDK style). You may need to ask someone who knows DDT well, if DDT does any other processing of the message .

    Leave a comment:


  • Guest's Avatar
    Guest replied
    Dominic: when I use the following code (inserted above) in PBdll6 the dialog still cannot be moved -
    Code:
    CALLBACK FUNCTION DlgProc () AS LONG
    
      SELECT CASE CBCTL
        CASE %ID_OK_BUTTON
          DIALOG END ghDlg, 1
      END SELECT
      
      SELECT CASE CBMSG
        CASE %WM_CREATE
    
        CASE %WM_NCHITTEST
          FUNCTION = %HTCAPTION
          EXIT FUNCTION
      END SELECT
    
    END FUNCTION  'DlgProc
    Am I doing something wrong?

    William Fletcher

    Leave a comment:


  • Jules Marchildon
    replied
    william, here is a nice example of putting together a window with
    a tiny caption bar for your floating toolbar application. you can
    extract/modify what you need and adjust the caption height to your
    specifications.

    http://www.powerbasic.com/support/pb...ad.php?t=22550

    regards, jules


    Leave a comment:


  • Dominic Mitchell
    replied
    Chris;
    This would allow you to click on a control (ie. Static Label, Bitmap) and then drag
    the window. You could simulate your own "smaller" Caption bar.
    You can accomplish all that and much more without using SendMessage.
    The forms designer part of the package I am writing is as sophisticated as the one
    in Visual Basic but it does not use SendMessage anywhere. It all depends on hit
    testing code and a couple of the mouse messages.
    SendMessage has a major drawback in that you need to have a valid window handle. How
    would you implement lightweight control such as lines, ellipses, bezier curves and polygons
    using SendMessage?

    Leave a comment:


  • Chris Boss
    replied
    While it normally doesn't matter which method you use, there is an advantage of using SendMessage. This would allow you to click on a control (ie. Static Label, Bitmap) and then drag the window. You could simulate your own "smaller" Caption bar.

    By using SendMessage, windows won't care "where" you clicked.

    Leave a comment:


  • Dominic Mitchell
    replied
    Why are you guys using SendMessage?
    To return a value just do the following

    Code:
      SELECT CASE lMsg
        CASE %WM_CREATE
    
        CASE %WM_NCHITTEST
    
          FUNCTION = %HTCAPTION 
          EXIT FUNCTION          <-- This is required so that execution does
      END SELECT                     not fall through to the default window procedure

    Leave a comment:


  • Guest's Avatar
    Guest replied
    Thanks Chris - that worked! BTW the ' in front of any code above is to include my failures as a demo in case there were any syntax errors someone else might catch.

    I've updated the code (above) with your suggestion.

    Thanks!

    William Fletcher

    Leave a comment:


  • Chris Boss
    replied
    William;

    Use the following code in your Dialog procedure:

    Code:
        CASE %WM_LBUTTONDOWN        
            SendMessage hWnd, %WM_NCLBUTTONDOWN, %HTCAPTION, byval %NULL
    In your sample code you had a ' in front the of the FUNCTION=%HTCAPTION line of code, so it was only a remark.


    Leave a comment:


  • Guest's Avatar
    Guest replied
    Help! - for the WM_NCHITTEST message, how do I "return" the HTCAPTION value?

    Here's my setup:
    Code:
    GLOBAL ghDlg AS LONG
    '----------------------------------------------------
    CALLBACK FUNCTION DlgProc () AS LONG
      SELECT CASE CBMSG
    '    CASE %WM_NCHITTEST
    '     FUNCTION = %HTCAPTION
    '       ---> no effect at all
    '     CALL  SendMessage(ghDlg, %WM_SYSCOMMAND, %SC_MOVE, 0)
    '       ---> constant "Move" cursor
    '     CALL  SendMessage(ghDlg, %WM_SYSCOMMAND, %HTCAPTION, 0)
    '       ---> no effect, it seems
    '     CASE %WM_LBUTTONDOWN
    '       ReleaseCapture
    '       CALL  SendMessage(ghDlg, %WM_SYSCOMMAND, %SC_MOVE, 0)
    '       ---> "Move" cursor appears but Dialog doesn't move
    
          CASE %WM_LBUTTONDOWN
            SendMessage ghDlg, %WM_NCLBUTTONDOWN, %HTCAPTION, BYVAL %NULL
    '       ---> THIS WORKS!  (...thanks Chris)
    
      END SELECT       
    END FUNCTION  'DlgProc
    '----------------------------------------------------
    FUNCTION PBMAIN () AS LONG
      LOCAL Style AS LONG
      Style = %WS_POPUP OR _
              %DS_SETFONT OR _
              %DS_NOFAILCREATE OR _
              %DS_MODALFRAME OR _
              %DS_3DLOOK
      DIALOG NEW 0,"",,,160,50,Style TO ghDlg
      DIALOG SHOW MODAL ghDlg, CALL DlgProc
    END FUNCTION  'PBMAIN                   
    '----------------------------------------------------
    Thanks everyone for all the advice!

    William Fletcher



    [This message has been edited by William Fletcher (edited January 24, 2000).]

    Leave a comment:


  • Borje Hagsten
    replied
    The following also seems to work fine:

    Code:
    CASE %WM_LBUTTONDOWN
      ReleaseCapture
      CALL  SendMessage(hWnd, %WM_SYSCOMMAND, %SC_MOVE, 0)

    Leave a comment:


  • Lance Edmonds
    replied
    there is a toolbar "demo" in the source code forum which (if i remember)uses a conventional toolbar window approach (ws_ex_toolwindow).
    http://www.powerbasic.com/support/pb...ad.php?t=25000

    if you wish to move a dialog that has no caption bar, then respond to %wm_nchittest messages, and return the value %htcaption. this tricks windows into moving the window as it thinks the caption is being dragged.

    -------------
    lance
    powerbasic support
    mailto:[email protected][email protected]</a>

    Leave a comment:


  • Chris Boss
    replied
    William;


    Process the

    WM_NCHITTEST

    message yourself

    When the mouse is clicked this message is sent to the window to find out "where" the mouse was clicked. You can fool Windows by returning the


    HTCAPTION value

    when the mouse is clicked on the client area. This will tell windows that the mouse clicked on the Caption bar (which it didn't) and it will allow the window to be dragged by the client area.

    Read the API docs about WM_NCHITTEST


    Leave a comment:


  • Guest's Avatar
    Guest started a topic Moveable Dialog without a Caption bar?

    Moveable Dialog without a Caption bar?

    I need to make a floating toolbar (actually a dialog with buttons) as small as possible, yet moveable. Can anyone suggest a way to make it moveable *without* the Caption bar?

    Many TIA

    William Fletcher
Working...
X