Как окна передвигать?

Тема в разделе "WASM.BEGINNERS", создана пользователем strange2007, 9 ноя 2010.

  1. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Добрый день. Я новичок в программировании, поэтому не знаю где задать вопрос.
    Есть основное окно, в нем два окна: слева дерево, справа обычный текст. Как правильно делать изменение размеров этих окошек? Например, в тоталкоммандере 2 панельки можно перемещать за центральную часть вправо или влево.
    У яндекса спрашивал - посылает на готовые библиотеки на сях. Мне бы сам принцип, если возможно. Например, может надо создать третье окно, но тогда какое? Как ему присвоить курсор, если он указывается в классе, а не в окне. Может я что-то пропустил в теории? Тогда сильно ногами не пинать. Может есть тут где-то пример? Я бы его разобрал сам и не приставал с ламерскими вопросами, к сожалению ни чего не нашел.

    Спасибо

    P.S. masm, win32 и 64, начиная с win2000 и до win7, в том числе и сервера
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
  3. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Хорошо, это уже делаю. Подскажите еще как курсор поменять, а то он только классу присваивается, как его окну присвоить? Или можно как-то подменять? Может есть какая-нибудь функция?
     
  4. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Можно ещё использовать SetWindowPos.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    регистрируешь свой класс, например называешь его "SplitWindowClass", которому присваиваешь нужный курсор. Затем разделительную панельку создаешь как окошко класса SplitWindowClass. При наведении на него курсор будет автоматом меняться на нужный
     
  7. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Ухтыыыыы... спасибо, народ. Я чувствую себя неучем. Скоро будет у меня супер-мега-пупер прога. Про множество классов не знал. Пошел делать
    В общем еще раз спасибо.
     
  8. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Еще вопрос в продолжение: подскажите где можно надыбать справочник по всем предопределенным классам окошек? Такой вообще существует?
     
  9. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    и кажется SplitWindowClass не так называется. Уже вечер не соображу как назвать. Подскажите как правильно писать?
     
  10. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Что-то перерыл справочники и ни где такого не нашел. За то все больше и больше натыкаюсь на инфу, что split-окна это не виндовый класс, а разработки для разных языков. Подскажите я прав или нет? Если да, то каким делать разделительное окно?
     
  11. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    strange2007,

    Это всё детали реализации. Можно создать свой класс с именем "SplitWindowClass" (как предложил cresta) и разместить экземпляр окна этого класса между нормальных окон, можно ловить WM_MOUSEMOVE и прочие мышения основным окном — в общем, простор ограничен только фантазией (ну и способностью её реализовать).
     
  12. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Дык вот я и не знал варианты. Уже пятый раз переделываю заготовку SDI окна, до этого только в системной части писал.
    Народ, такой алгоритм нормальный или кривой как турецкая сабля?
    Основное окно выступает в качестве split-а. Правое и левое окно любое, между ними пару точек. Отлавливаю движения мыши над основным окном, захватываю мышь и жду отпускания кнопки. После опять пересчитываю координаты всех окон и изменяю при необходимости.
    Может есть что-то более цивилизованное или правильное?
    Опять же, что из себя представляет SplitWindowClass? Какие у него свойства? Что он должен делать? Задаю такие вопросы, потому что пока кроме описанного алгоритма даже не представляю варианты. Думал еще сделать в качестве разделителя отдельное окно, но тогда какое оно должно быть?
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Код (Text):
    1. .586
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. ;==================================================================================
    6.     include     \masm32\include\windows.inc
    7.     include     \masm32\include\user32.inc
    8.     include     \masm32\include\kernel32.inc
    9.     include     \masm32\include\shell32.inc
    10.     include     \masm32\include\gdi32.inc
    11.     include     \masm32\include\advapi32.inc
    12.     include     \masm32\include\comctl32.inc
    13.     include     \masm32\include\comdlg32.inc
    14.     include     \masm32\include\masm32.inc
    15.  
    16.     include     \masm32\RadASM\RadASM\masm\inc\debug.inc
    17.     include     \masm32\RadASM\RadASM\masm\inc\radbg.inc
    18.  
    19.  
    20. ;==================================================================================  
    21.     includelib  \masm32\lib\user32.lib
    22.     includelib  \masm32\lib\kernel32.lib
    23.     includelib  \masm32\lib\shell32.lib
    24.     includelib  \masm32\lib\gdi32.lib
    25.     includelib  \masm32\lib\advapi32.lib
    26.     includelib  \masm32\lib\comctl32.lib
    27.     includelib  \masm32\lib\comdlg32.lib
    28.     includelib  \masm32\lib\masm32.lib
    29.  
    30.     includelib  \masm32\RadASM\RadASM\masm\lib\debug.lib
    31.  
    32.  
    33. ;==================================================================================
    34.     WinMain     PROTO :DWORD,:DWORD,:DWORD,:DWORD
    35.  
    36.  
    37.  
    38. ;==================================================================================
    39. .const
    40.     szClassName         db  "MainWinClass",0
    41.     szAppName           db  "App Name",0
    42.    
    43.     szStatic            db  "button",0
    44.     szSplitName         db  "mySuperPuperClass",0
    45.    
    46. ;==================================================================================
    47. .data
    48.    
    49.    
    50.  
    51. ;==================================================================================
    52. .data?
    53.     hInstance           dd  ?
    54.     lpCmdLine           dd  ?
    55.     hWnd                dd  ?
    56.     hLeft               dd ?
    57.     hRight              dd  ?
    58.     hSplit              dd  ?
    59.    
    60. .code
    61.  
    62.  
    63. ; ---------------------------------------------------------------------------
    64.  
    65.  
    66. start:
    67.     invoke  GetModuleHandle, NULL
    68.     mov     hInstance,eax
    69.    
    70.     invoke  GetCommandLine
    71.     mov     lpCmdLine,eax
    72.    
    73.     invoke  WinMain, hInstance, NULL, lpCmdLine, SW_SHOWDEFAULT
    74.     invoke  ExitProcess, eax
    75.  
    76.  
    77. ;==================================================================================
    78. WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
    79.     LOCAL wc                :WNDCLASSEX
    80.     LOCAL msg               :MSG
    81.     LOCAL wx, wy, ww, wh    :DWORD
    82.    
    83.     mov     wc.cbSize, sizeof(WNDCLASSEX)
    84.     mov     wc.style, CS_HREDRAW or CS_VREDRAW
    85.     mov     wc.lpfnWndProc, offset WndProc
    86.     mov     wc.cbClsExtra,NULL
    87.     mov     wc.cbWndExtra,NULL
    88.     push    hInstance
    89.     pop     wc.hInstance
    90.     mov     wc.hbrBackground,COLOR_BTNFACE+1
    91.     mov     wc.lpszMenuName,NULL
    92.     mov     wc.lpszClassName,offset szClassName
    93.    
    94.     invoke  LoadIcon, NULL, IDI_APPLICATION
    95.     mov     wc.hIcon,eax
    96.     mov     wc.hIconSm,eax
    97.    
    98.     invoke  LoadCursor, NULL, IDC_ARROW
    99.     mov     wc.hCursor,eax
    100.    
    101.     invoke RegisterClassEx, addr wc
    102.     ;-------------------------------------------------
    103.     mov     ww,600
    104.     mov     wh,440
    105.     invoke  GetSystemMetrics,SM_CXSCREEN
    106.     sub     eax,ww
    107.     shr     eax,1
    108.     mov     wx,eax
    109.     invoke  GetSystemMetrics,SM_CYSCREEN
    110.     sub     eax,wh
    111.     shr     eax,1
    112.     mov     wy,eax
    113.  
    114.     invoke  CreateWindowEx, NULL, addr szClassName, addr szAppName,
    115.                            14CA0000h,   ;WS_OVERLAPPEDWINDOW,
    116.                            wx,
    117.                            wy,
    118.                            ww,
    119.                            wh,
    120.                            NULL,
    121.                            NULL,
    122.                            hInst,
    123.                            NULL
    124.     mov     hWnd,eax
    125.     .if     eax
    126.         invoke CreateWindowEx, NULL, addr szStatic, NULL, WS_CHILD or WS_VISIBLE, 5,5,290,390,hWnd, NULL, hInstance, NULL
    127.         mov     hLeft,eax
    128.         invoke CreateWindowEx, NULL, addr szStatic, NULL, WS_CHILD or WS_VISIBLE, 305,5,290,390,hWnd, NULL, hInstance, NULL
    129.         mov     hRight, eax
    130.        
    131.         ;- здесь регистрируется собственный класс (для разделителя) со своими аттрибутами (курсор, бэкграунд, оконная процедура)
    132.         mov     wc.cbSize, sizeof(WNDCLASSEX)
    133.         mov     wc.style, CS_HREDRAW or CS_VREDRAW
    134.         mov     wc.lpfnWndProc, offset SplitProc
    135.         mov     wc.cbClsExtra,NULL
    136.         mov     wc.cbWndExtra,NULL
    137.         push    hInstance
    138.         pop     wc.hInstance
    139.         mov     wc.hbrBackground,COLOR_WINDOW
    140.         mov     wc.lpszMenuName,NULL
    141.         mov     wc.lpszClassName,offset szSplitName
    142.         mov     wc.hIcon,NULL
    143.         mov     wc.hIconSm,NULL
    144.        
    145.         invoke  LoadCursor, NULL, IDC_SIZEWE
    146.         mov     wc.hCursor,eax
    147.        
    148.         invoke RegisterClassEx, addr wc
    149.         invoke CreateWindowEx, NULL, addr szSplitName, NULL, WS_CHILD or WS_VISIBLE, 295,5,10,390,hWnd, NULL, hInstance, NULL
    150.         mov     hSplit,eax
    151.        
    152.     .endif
    153.    
    154.     invoke  ShowWindow, hWnd,SW_SHOWNORMAL
    155.     invoke  UpdateWindow, hWnd
    156.    
    157.     .while  (TRUE)
    158.         invoke GetMessage, addr msg, NULL, NULL, NULL
    159.         .break .if (!eax)
    160.         invoke TranslateMessage, addr msg
    161.         invoke DispatchMessage, addr msg
    162.     .endw
    163.    
    164.     mov     eax,msg.wParam
    165.     ret
    166. WinMain endp
    167.  
    168.  
    169. ;==================================================================================
    170. SplitProc proc uses ebx hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    171.    
    172.     mov     eax,uMsg
    173.     .if     eax==WM_LBUTTONDOWN
    174.     ; - здесь обрабатывается перетаскивание разделителя
    175.     ; - нужно добавить ограничение перетаскивания по вертикали
    176.     ; - и вписать изменение размеров левого и правого полей в зависимости от положения разделителя
    177.         invoke ReleaseCapture
    178.         invoke SendMessage, hWin, WM_NCLBUTTONDOWN, HTCAPTION, 0
    179.     .else
    180.         invoke  DefWindowProc, hWin, uMsg, wParam, lParam        
    181.         ret
    182.     .endif
    183.    
    184.     xor eax,eax
    185.     ret
    186. SplitProc endp
    187.  
    188.  
    189. ;==================================================================================
    190. WndProc proc uses ebx hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    191.    
    192.     mov     eax,uMsg
    193.     .if     (eax==WM_CREATE)
    194.         m2m     hWnd,hWin
    195.        
    196.     .elseif (eax==WM_DESTROY)
    197.         invoke  PostQuitMessage, NULL
    198.  
    199.     .else
    200.         invoke  DefWindowProc, hWin, uMsg, wParam, lParam        
    201.         ret
    202.     .endif
    203.    
    204.     xor eax,eax
    205.     ret
    206. WndProc endp
    207.  
    208.  
    209. end start
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Изменение левой и правой частей примерно так:

    Код (Text):
    1. SplitProc proc uses ebx hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
    2.    
    3.     mov     eax,uMsg
    4.     .if     eax==WM_LBUTTONDOWN
    5.     ; - здесь обрабатывается перетаскивание разделителя
    6.     ; - нужно добавить ограничение перетаскивания по вертикали
    7.         invoke ReleaseCapture
    8.         invoke SendMessage, hWin, WM_NCLBUTTONDOWN, HTCAPTION, 0
    9.        
    10.     .elseif eax==WM_MOVE
    11.         mov ebx,lParam
    12.         and ebx,0FFFFh
    13.         mov ecx,ebx
    14.         sub ecx,5
    15.         invoke  MoveWindow, hLeft, 5, 5, ecx, 390, TRUE
    16.         mov ecx, 580
    17.         sub ecx,ebx
    18.         add ebx,10
    19.         invoke  MoveWindow, hRight, ebx, 5, ecx, 390, TRUE
    20.     .else
    21.         invoke  DefWindowProc, hWin, uMsg, wParam, lParam        
    22.         ret
    23.     .endif
    24.    
    25.     xor eax,eax
    26.     ret
    27. SplitProc endp
     
  15. strange2007

    strange2007 New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2010
    Сообщения:
    126
    Спасибо, cresta. Начал переделывать последний раз. Думаю теперь я понял как надо делать.