News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

non moveable dialogs?

Started by shuttlebug, October 20, 2007, 11:58:18 PM

Previous topic - Next topic

shuttlebug

Ive been looking for a way to make a non moveable dialog with no luck. Is it possible to do so?

MichaelW

This seems to work:

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    include \masm32\include\masm32rt.inc
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    .data
      hInstance dd 0
      orig_rc   RECT <>
    .code
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
DlgProc proc hDlg:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD

    Switch uMsg

      Case WM_INITDIALOG

        invoke GetWindowRect,hDlg,ADDR orig_rc

      Case WM_MOVING

        mov edx, lParam
        mov eax, orig_rc.left
        mov [edx].RECT.left, eax
        mov eax, orig_rc.top
        mov [edx].RECT.top, eax
        mov eax, orig_rc.right
        mov [edx].RECT.right, eax
        mov eax, orig_rc.bottom
        mov [edx].RECT.bottom, eax

        return 1

      Case WM_COMMAND

        .IF wParam == IDCANCEL
          invoke EndDialog,hDlg,0
        .ENDIF

      Case WM_CLOSE

        invoke EndDialog,hDlg,0

    EndSw

    return 0

DlgProc endp
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
    mov hInstance, FUNC(GetModuleHandle,NULL)

    Dialog "Non-Moveable Dialog", \         ; caption
           "MS Sans Serif",10, \            ; font,pointsize
            WS_OVERLAPPED or \              ; styles for
            WS_SYSMENU or DS_CENTER, \      ; dialog window
            0, \                            ; number of controls
            0,0,120,90, \                   ; x y co-ordinates
            1024                            ; memory buffer size

    CallModalDialog hInstance,0,DlgProc,NULL

    invoke ExitProcess,eax

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
end start


Initially I tried resetting only the left and top coordinates, but this had the unexpected effect of making the dialog non-moveable but resizable.

eschew obfuscation

hoverlees

I think processing WM_NCLBUTTONDOWN may help.



DlgProc proc hWnd,uMsg,wParam,lParam
.if uMsg==WM_INITDIALOG
;...
.elseif uMsg==WM_NCLBUTTONDOWN
mov eax,wParam
.if eax==HTCAPTION  || eax==HTLEFT || eax==HTRIGHT  ;and so on.
invoke ReleaseCapture
.else
mov eax,FALSE
ret
.endif
.elseif uMsg==WM_COMMAND
;.....
.elseif uMsg==WM_CLOSE
invoke EndDialog,hWnd,wParam
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp


MichaelW

Processing WM_NCLBUTTONDOWN does not appear to work, and I can't see how it could. Per MSDN: WM_NCLBUTTONDOWN Notification:

"If a window has captured the mouse, this message is not posted."

Per MSDN: WM_MOVING Notification:

"By processing this message, an application can monitor the position of the drag rectangle and, if needed, change its position."

And since I can't see any motion when I attempt to drag the window, even on my relatively slow system, I assume that the message is sent before the window is moved. I think Microsoft intended that this method be used to limit the ability of the user to move the window, just as WM_SIZING is used to limit the ability to resize the window.
eschew obfuscation