ShowWindow & SW_MAXIMIZE vs WS_POPUP

Тема в разделе "WASM.WIN32", создана пользователем AlexCab, 10 окт 2009.

  1. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    Подскажите как зделать чтоб при разворачивании окна со стилем WS_POPUP оставался виден ТаскБар?
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    WS_EX_APPWINDOW
     
  3. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    AsmGuru62, мимо.

    Код (Text):
    1. ; .asm
    2. .386
    3. .model flat,stdcall
    4. option casemap:none
    5. include \masm32\include\windows.inc
    6. include \masm32\include\user32.inc
    7. include \masm32\include\kernel32.inc
    8. includelib \masm32\lib\user32.lib
    9. includelib \masm32\lib\kernel32.lib
    10. .code
    11. DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    12.   .if uMsg==WM_CLOSE
    13.     invoke EndDialog,hWnd,0
    14.     mov eax,TRUE
    15.   .elseif uMsg==WM_LBUTTONDBLCLK
    16.     invoke IsZoomed,hWnd
    17.     .if eax==0
    18.       mov eax,SW_MAXIMIZE
    19.     .else
    20.       mov eax,SW_SHOWNORMAL
    21.     .endif
    22.     invoke ShowWindow,hWnd,eax
    23.     mov eax,TRUE
    24.     .else
    25.     mov eax,FALSE
    26.   .endif
    27.   ret
    28. DlgProc endp
    29. start:
    30.   invoke GetModuleHandle,0
    31.   invoke DialogBoxParam,eax,100,0,offset DlgProc,0
    32.   invoke ExitProcess,eax
    33. end start
    34.  
    35. ; .rc
    36. #include "\masm32\include\resource.h"
    37. 100 DIALOGEX 0,0,350,50
    38. STYLE WS_POPUP | DS_CENTER | WS_SYSMENU
    39. EXSTYLE WS_EX_TOPMOST | WS_EX_APPWINDOW
    40. CAPTION "WS_EX_APPWINDOW  without  WS_MAXIMIZEBOX  //  < Left double click >"
    41. FONT 8, "Tahoma"
    42. {}
     
  4. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    Sorry kero не работает, окно распахивается на весь экран закрывая собой панель задачь. Нормально работает только со стилем "WS_CAPTION", но надо именно окно без рамки и загодовка.
     
  5. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    AlexCab, так мой пример для AsmGuru62:)
     
  6. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    D’oh!
     
  7. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    AlexCab,
    а вам к своему WS_POPUP без WS_CAPTION придется добавить что-то типа того:

    Код (Text):
    1. ... proc uses ebx hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    2.   local rt:RECT
    3. ...
    4.   .elseif uMsg==WM_GETMINMAXINFO
    5.     invoke SystemParametersInfo,SPI_GETWORKAREA,0,addr rt,0
    6.     mov ebx,lParam
    7.     assume ebx:PTR MINMAXINFO
    8.     mov eax,rt.left
    9.     mov [ebx].ptMaxPosition.x,eax
    10.     mov edx,rt.top
    11.     mov [ebx].ptMaxPosition.y,edx
    12.     mov ecx,rt.right
    13.     sub ecx,eax
    14.     mov [ebx].ptMaxSize.x,ecx
    15.     mov ecx,rt.bottom
    16.     sub ecx,edx
    17.     mov [ebx].ptMaxSize.y,ecx
    18.     assume ebx:nothing
    19. ...
     
  8. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Или так:
    Код (Text):
    1. ...
    2.   local rt:RECT
    3. ...
    4.   .elseif uMsg==WM_WINDOWPOSCHANGING
    5.     invoke SystemParametersInfo,SPI_GETWORKAREA,0,addr rt,0  
    6.     invoke IsZoomed,hWnd
    7.     .if eax!=0
    8.       mov ecx,lParam
    9.       assume ecx:PTR WINDOWPOS
    10.       mov eax,rt.left
    11.       mov [ecx].x,eax
    12.       mov edx,rt.right
    13.       sub edx,eax
    14.       mov [ecx].lx,edx
    15.       mov eax,rt.top
    16.       mov [ecx].y,eax
    17.       mov edx,rt.bottom
    18.       sub edx,eax
    19.       mov [ecx].cy,edx
    20.       assume ecx:nothing
    21.     .endif
    22. ...
     
  9. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    AlexCab
    В стилях диалога не указано, что он может менять размер (WS_THICKFRAME). В то же время кодом вы пытаетесь достичь такой функциональности. Естественно, Windows не понимает.

    В то же время вам надо чтобы окно не имело заголовка и рамки.
    Здесь надо отвечать на WM_NCHITTEST:
    http://msdn.microsoft.com/en-us/library/ms645618(VS.85).aspx
     
  10. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    AsmGuru62
    ??
    ??
     
  11. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    WS_THICKFRAME это вроде просто тонкая рамка, размеры менять можно...

    WS_POPUP - стиль окна, у которого отсутствует ТаскБар

    вроде так...

    все эти стили - 32 разрядные двоичные числа, у которых только один разряд равен 1

    -------------

    комбинация различных WS_.... а так же стилей не относящихся к обычному окну, может привести к непредсказуемым результатам

    -------------

    пытался сделать окно у которого только 2 кнопки - свернуть и закрыть, не получилось... но - не уверен, что такое окно невозможно ... от програмистов мелкософта можно ожидать чего угодно...
     
  12. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Blackbeam, вам это... сейчас за руль - ни-ни :)
     
  13. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    kero спасибо, отлично работает, также я добавил код для случая когда включено автоскрите таскбара:
    Код (Text):
    1.        \\Обработка события WM_WINDOWPOSCHANGING (esi-wmsg,edi-wmsg,ecx-wparam,edx-lparam)
    2.        L_wm_windowposchanging:
    3.        push ebx eax ecx esi edi edx
    4.        pushd [edx]
    5.        call [IsZoomed]
    6.        cmp eax,0
    7.        je No_max
    8.        mov dword [Work_buf + 10h],24h
    9.        push Work_buf + 10h
    10.        push 4 \\ABM_GETTASKBARPOS
    11.        call [SHAppBarMessage] \\Положение таскбара
    12.        cmp eax,0
    13.        je No_max
    14.        cmp eax,3
    15.        je Auto_hide
    16.        push 0
    17.        push Work_buf
    18.        push 0
    19.        push 48 \\SPI_GETWORKAREA
    20.        call [SystemParametersInfo] \\Положение таскбара
    21.        cmp eax,0
    22.        je No_max
    23.        pop edi
    24.        push edi
    25.        mov eax,dword [Work_buf + 00h]
    26.        mov [edi + 08h],eax \\Горизонталь
    27.        mov edx,dword [Work_buf + 08h]
    28.        sub edx,eax
    29.        mov [edi + 10h],edx \\Ширина
    30.        mov eax,dword [Work_buf + 04h]
    31.        mov [edi + 0Ch],eax \\Вертикаль
    32.        mov edx,dword [Work_buf + 0Ch]
    33.        sub edx,eax
    34.        mov [edi + 14h],edx \\Высота
    35.        jmp No_max
    36.        Auto_hide:
    37.        push Work_buf + 10h
    38.        push 5 \\ABM_GETTASKBARPOS
    39.        call [SHAppBarMessage] \\Положение таскбара
    40.        cmp eax,0
    41.        je No_max
    42.        pop edi
    43.        push edi
    44.        mov eax,dword [Work_buf + 1Ch]
    45.        cmp eax,1
    46.        je Top_or_bottom
    47.        cmp eax,3
    48.        je Top_or_bottom
    49.        cmp eax,2
    50.        jne Not_right
    51.        add dword [edi + 08h],02h \\Горизонталь
    52.        Not_right:
    53.        sub dword [edi + 10h],02h \\Ширина
    54.        jmp No_max
    55.        Top_or_bottom:
    56.        cmp eax,1
    57.        jne Not_top
    58.        add dword [edi + 0Ch],02h \\Вертикаль
    59.        Not_top:
    60.        sub dword [edi + 14h],02h \\Высота
    61.        No_max:
    62.        pop edx edi esi ecx eax ebx
    63.        jmp Def_proc
    Если кто предложет проще буду рад:)
     
  14. AlexCab

    AlexCab New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2008
    Сообщения:
    142
    В выше преведённом коде обнаружелось пару жуков (окно при каждом разворачивании сдивигалось ниже, также не развочивалось на весь экран (при включеном автоскрытии)), ниже исправленая версия:
    Код (Text):
    1.        \\Обработка события WM_WINDOWPOSCHANGING (esi-wmsg,edi-wmsg,ecx-wparam,edx-lparam)
    2.        L_wm_windowposchanging:
    3.        push ebx eax ecx esi edi edx
    4.        pushd [edx]
    5.        call [IsZoomed]
    6.        cmp eax,0
    7.        je No_max
    8.        push 0
    9.        push Work_buf
    10.        push 0
    11.        push 48 \\SPI_GETWORKAREA
    12.        call [SystemParametersInfo] \\Координати рабочего пространства
    13.        cmp eax,0
    14.        je No_max
    15.        push Work_buf + 10h
    16.        push 4 \\ABM_GETTASKBARPOS
    17.        call [SHAppBarMessage] \\Состояние автоскрытия
    18.        cmp eax,0
    19.        je No_max
    20.        xor cl,cl
    21.        cmp eax,3
    22.        jne No_auto_hide
    23.        push Work_buf + 10h
    24.        push 5 \\ABM_GETTASKBARPOS
    25.        call [SHAppBarMessage] \\Положение таскбара
    26.        cmp eax,0
    27.        je No_max
    28.        mov ecx,dword [Work_buf + 1Ch]
    29.        add cl,1
    30.        No_auto_hide:
    31.        pop edi
    32.        push edi
    33.        mov eax,dword [Work_buf + 00h]
    34.        cmp cl,1 \\Если не слева
    35.        jne Save_hor
    36.        add eax,2
    37.        Save_hor:
    38.        mov [edi + 08h],eax \\Горизонталь
    39.        mov edx,dword [Work_buf + 08h]
    40.        sub edx,eax
    41.        cmp cl,3   \\Если не справа
    42.        jne Save_wid
    43.        sub edx,2
    44.        Save_wid:
    45.        mov [edi + 10h],edx \\Ширина
    46.        mov eax,dword [Work_buf + 04h]
    47.        cmp cl,2  \\Если не в верху
    48.        jne Save_vrt
    49.        add eax,2
    50.        Save_vrt:
    51.        mov [edi + 0Ch],eax \\Вертикаль
    52.        mov edx,dword [Work_buf + 0Ch]
    53.        sub edx,eax
    54.        cmp cl,4 \\Если не в низу
    55.        jne Save_heig
    56.        sub edx,2
    57.        Save_heig:
    58.        mov [edi + 14h],edx \\Высота
    59.        No_max:
    60.        pop edx edi esi ecx eax ebx
    61.        jmp Def_proc