AsmGuru62, мимо. Код (Text): ; .asm .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .code DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .if uMsg==WM_CLOSE invoke EndDialog,hWnd,0 mov eax,TRUE .elseif uMsg==WM_LBUTTONDBLCLK invoke IsZoomed,hWnd .if eax==0 mov eax,SW_MAXIMIZE .else mov eax,SW_SHOWNORMAL .endif invoke ShowWindow,hWnd,eax mov eax,TRUE .else mov eax,FALSE .endif ret DlgProc endp start: invoke GetModuleHandle,0 invoke DialogBoxParam,eax,100,0,offset DlgProc,0 invoke ExitProcess,eax end start ; .rc #include "\masm32\include\resource.h" 100 DIALOGEX 0,0,350,50 STYLE WS_POPUP | DS_CENTER | WS_SYSMENU EXSTYLE WS_EX_TOPMOST | WS_EX_APPWINDOW CAPTION "WS_EX_APPWINDOW without WS_MAXIMIZEBOX // < Left double click >" FONT 8, "Tahoma" {}
Sorry kero не работает, окно распахивается на весь экран закрывая собой панель задачь. Нормально работает только со стилем "WS_CAPTION", но надо именно окно без рамки и загодовка.
AlexCab, а вам к своему WS_POPUP без WS_CAPTION придется добавить что-то типа того: Код (Text): ... proc uses ebx hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM local rt:RECT ... .elseif uMsg==WM_GETMINMAXINFO invoke SystemParametersInfo,SPI_GETWORKAREA,0,addr rt,0 mov ebx,lParam assume ebx:PTR MINMAXINFO mov eax,rt.left mov [ebx].ptMaxPosition.x,eax mov edx,rt.top mov [ebx].ptMaxPosition.y,edx mov ecx,rt.right sub ecx,eax mov [ebx].ptMaxSize.x,ecx mov ecx,rt.bottom sub ecx,edx mov [ebx].ptMaxSize.y,ecx assume ebx:nothing ...
Или так: Код (Text): ... local rt:RECT ... .elseif uMsg==WM_WINDOWPOSCHANGING invoke SystemParametersInfo,SPI_GETWORKAREA,0,addr rt,0 invoke IsZoomed,hWnd .if eax!=0 mov ecx,lParam assume ecx:PTR WINDOWPOS mov eax,rt.left mov [ecx].x,eax mov edx,rt.right sub edx,eax mov [ecx].lx,edx mov eax,rt.top mov [ecx].y,eax mov edx,rt.bottom sub edx,eax mov [ecx].cy,edx assume ecx:nothing .endif ...
AlexCab В стилях диалога не указано, что он может менять размер (WS_THICKFRAME). В то же время кодом вы пытаетесь достичь такой функциональности. Естественно, Windows не понимает. В то же время вам надо чтобы окно не имело заголовка и рамки. Здесь надо отвечать на WM_NCHITTEST: http://msdn.microsoft.com/en-us/library/ms645618(VS.85).aspx
WS_THICKFRAME это вроде просто тонкая рамка, размеры менять можно... WS_POPUP - стиль окна, у которого отсутствует ТаскБар вроде так... все эти стили - 32 разрядные двоичные числа, у которых только один разряд равен 1 ------------- комбинация различных WS_.... а так же стилей не относящихся к обычному окну, может привести к непредсказуемым результатам ------------- пытался сделать окно у которого только 2 кнопки - свернуть и закрыть, не получилось... но - не уверен, что такое окно невозможно ... от програмистов мелкософта можно ожидать чего угодно...
kero спасибо, отлично работает, также я добавил код для случая когда включено автоскрите таскбара: Код (Text): \\Обработка события WM_WINDOWPOSCHANGING (esi-wmsg,edi-wmsg,ecx-wparam,edx-lparam) L_wm_windowposchanging: push ebx eax ecx esi edi edx pushd [edx] call [IsZoomed] cmp eax,0 je No_max mov dword [Work_buf + 10h],24h push Work_buf + 10h push 4 \\ABM_GETTASKBARPOS call [SHAppBarMessage] \\Положение таскбара cmp eax,0 je No_max cmp eax,3 je Auto_hide push 0 push Work_buf push 0 push 48 \\SPI_GETWORKAREA call [SystemParametersInfo] \\Положение таскбара cmp eax,0 je No_max pop edi push edi mov eax,dword [Work_buf + 00h] mov [edi + 08h],eax \\Горизонталь mov edx,dword [Work_buf + 08h] sub edx,eax mov [edi + 10h],edx \\Ширина mov eax,dword [Work_buf + 04h] mov [edi + 0Ch],eax \\Вертикаль mov edx,dword [Work_buf + 0Ch] sub edx,eax mov [edi + 14h],edx \\Высота jmp No_max Auto_hide: push Work_buf + 10h push 5 \\ABM_GETTASKBARPOS call [SHAppBarMessage] \\Положение таскбара cmp eax,0 je No_max pop edi push edi mov eax,dword [Work_buf + 1Ch] cmp eax,1 je Top_or_bottom cmp eax,3 je Top_or_bottom cmp eax,2 jne Not_right add dword [edi + 08h],02h \\Горизонталь Not_right: sub dword [edi + 10h],02h \\Ширина jmp No_max Top_or_bottom: cmp eax,1 jne Not_top add dword [edi + 0Ch],02h \\Вертикаль Not_top: sub dword [edi + 14h],02h \\Высота No_max: pop edx edi esi ecx eax ebx jmp Def_proc Если кто предложет проще буду рад
В выше преведённом коде обнаружелось пару жуков (окно при каждом разворачивании сдивигалось ниже, также не развочивалось на весь экран (при включеном автоскрытии)), ниже исправленая версия: Код (Text): \\Обработка события WM_WINDOWPOSCHANGING (esi-wmsg,edi-wmsg,ecx-wparam,edx-lparam) L_wm_windowposchanging: push ebx eax ecx esi edi edx pushd [edx] call [IsZoomed] cmp eax,0 je No_max push 0 push Work_buf push 0 push 48 \\SPI_GETWORKAREA call [SystemParametersInfo] \\Координати рабочего пространства cmp eax,0 je No_max push Work_buf + 10h push 4 \\ABM_GETTASKBARPOS call [SHAppBarMessage] \\Состояние автоскрытия cmp eax,0 je No_max xor cl,cl cmp eax,3 jne No_auto_hide push Work_buf + 10h push 5 \\ABM_GETTASKBARPOS call [SHAppBarMessage] \\Положение таскбара cmp eax,0 je No_max mov ecx,dword [Work_buf + 1Ch] add cl,1 No_auto_hide: pop edi push edi mov eax,dword [Work_buf + 00h] cmp cl,1 \\Если не слева jne Save_hor add eax,2 Save_hor: mov [edi + 08h],eax \\Горизонталь mov edx,dword [Work_buf + 08h] sub edx,eax cmp cl,3 \\Если не справа jne Save_wid sub edx,2 Save_wid: mov [edi + 10h],edx \\Ширина mov eax,dword [Work_buf + 04h] cmp cl,2 \\Если не в верху jne Save_vrt add eax,2 Save_vrt: mov [edi + 0Ch],eax \\Вертикаль mov edx,dword [Work_buf + 0Ch] sub edx,eax cmp cl,4 \\Если не в низу jne Save_heig sub edx,2 Save_heig: mov [edi + 14h],edx \\Высота No_max: pop edx edi esi ecx eax ebx jmp Def_proc