Добрый день. Я новичок в программировании, поэтому не знаю где задать вопрос. Есть основное окно, в нем два окна: слева дерево, справа обычный текст. Как правильно делать изменение размеров этих окошек? Например, в тоталкоммандере 2 панельки можно перемещать за центральную часть вправо или влево. У яндекса спрашивал - посылает на готовые библиотеки на сях. Мне бы сам принцип, если возможно. Например, может надо создать третье окно, но тогда какое? Как ему присвоить курсор, если он указывается в классе, а не в окне. Может я что-то пропустил в теории? Тогда сильно ногами не пинать. Может есть тут где-то пример? Я бы его разобрал сам и не приставал с ламерскими вопросами, к сожалению ни чего не нашел. Спасибо P.S. masm, win32 и 64, начиная с win2000 и до win7, в том числе и сервера
Хорошо, это уже делаю. Подскажите еще как курсор поменять, а то он только классу присваивается, как его окну присвоить? Или можно как-то подменять? Может есть какая-нибудь функция?
http://msdn.microsoft.com/en-us/library/ms648393(VS.85).aspx http://msdn.microsoft.com/en-us/library/ms633588(VS.85).aspx
регистрируешь свой класс, например называешь его "SplitWindowClass", которому присваиваешь нужный курсор. Затем разделительную панельку создаешь как окошко класса SplitWindowClass. При наведении на него курсор будет автоматом меняться на нужный
Ухтыыыыы... спасибо, народ. Я чувствую себя неучем. Скоро будет у меня супер-мега-пупер прога. Про множество классов не знал. Пошел делать В общем еще раз спасибо.
Еще вопрос в продолжение: подскажите где можно надыбать справочник по всем предопределенным классам окошек? Такой вообще существует?
и кажется SplitWindowClass не так называется. Уже вечер не соображу как назвать. Подскажите как правильно писать?
Что-то перерыл справочники и ни где такого не нашел. За то все больше и больше натыкаюсь на инфу, что split-окна это не виндовый класс, а разработки для разных языков. Подскажите я прав или нет? Если да, то каким делать разделительное окно?
strange2007, Это всё детали реализации. Можно создать свой класс с именем "SplitWindowClass" (как предложил cresta) и разместить экземпляр окна этого класса между нормальных окон, можно ловить WM_MOUSEMOVE и прочие мышения основным окном — в общем, простор ограничен только фантазией (ну и способностью её реализовать).
Дык вот я и не знал варианты. Уже пятый раз переделываю заготовку SDI окна, до этого только в системной части писал. Народ, такой алгоритм нормальный или кривой как турецкая сабля? Основное окно выступает в качестве split-а. Правое и левое окно любое, между ними пару точек. Отлавливаю движения мыши над основным окном, захватываю мышь и жду отпускания кнопки. После опять пересчитываю координаты всех окон и изменяю при необходимости. Может есть что-то более цивилизованное или правильное? Опять же, что из себя представляет SplitWindowClass? Какие у него свойства? Что он должен делать? Задаю такие вопросы, потому что пока кроме описанного алгоритма даже не представляю варианты. Думал еще сделать в качестве разделителя отдельное окно, но тогда какое оно должно быть?
Код (Text): .586 .model flat,stdcall option casemap:none ;================================================================================== include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\shell32.inc include \masm32\include\gdi32.inc include \masm32\include\advapi32.inc include \masm32\include\comctl32.inc include \masm32\include\comdlg32.inc include \masm32\include\masm32.inc include \masm32\RadASM\RadASM\masm\inc\debug.inc include \masm32\RadASM\RadASM\masm\inc\radbg.inc ;================================================================================== includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\shell32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\advapi32.lib includelib \masm32\lib\comctl32.lib includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\masm32.lib includelib \masm32\RadASM\RadASM\masm\lib\debug.lib ;================================================================================== WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD ;================================================================================== .const szClassName db "MainWinClass",0 szAppName db "App Name",0 szStatic db "button",0 szSplitName db "mySuperPuperClass",0 ;================================================================================== .data ;================================================================================== .data? hInstance dd ? lpCmdLine dd ? hWnd dd ? hLeft dd ? hRight dd ? hSplit dd ? .code ; --------------------------------------------------------------------------- start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov lpCmdLine,eax invoke WinMain, hInstance, NULL, lpCmdLine, SW_SHOWDEFAULT invoke ExitProcess, eax ;================================================================================== WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD LOCAL wc :WNDCLASSEX LOCAL msg :MSG LOCAL wx, wy, ww, wh :DWORD mov wc.cbSize, sizeof(WNDCLASSEX) mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, offset WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_BTNFACE+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,offset szClassName invoke LoadIcon, NULL, IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor, NULL, IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc ;------------------------------------------------- mov ww,600 mov wh,440 invoke GetSystemMetrics,SM_CXSCREEN sub eax,ww shr eax,1 mov wx,eax invoke GetSystemMetrics,SM_CYSCREEN sub eax,wh shr eax,1 mov wy,eax invoke CreateWindowEx, NULL, addr szClassName, addr szAppName, 14CA0000h, ;WS_OVERLAPPEDWINDOW, wx, wy, ww, wh, NULL, NULL, hInst, NULL mov hWnd,eax .if eax invoke CreateWindowEx, NULL, addr szStatic, NULL, WS_CHILD or WS_VISIBLE, 5,5,290,390,hWnd, NULL, hInstance, NULL mov hLeft,eax invoke CreateWindowEx, NULL, addr szStatic, NULL, WS_CHILD or WS_VISIBLE, 305,5,290,390,hWnd, NULL, hInstance, NULL mov hRight, eax ;- здесь регистрируется собственный класс (для разделителя) со своими аттрибутами (курсор, бэкграунд, оконная процедура) mov wc.cbSize, sizeof(WNDCLASSEX) mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, offset SplitProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW mov wc.lpszMenuName,NULL mov wc.lpszClassName,offset szSplitName mov wc.hIcon,NULL mov wc.hIconSm,NULL invoke LoadCursor, NULL, IDC_SIZEWE mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateWindowEx, NULL, addr szSplitName, NULL, WS_CHILD or WS_VISIBLE, 295,5,10,390,hWnd, NULL, hInstance, NULL mov hSplit,eax .endif invoke ShowWindow, hWnd,SW_SHOWNORMAL invoke UpdateWindow, hWnd .while (TRUE) invoke GetMessage, addr msg, NULL, NULL, NULL .break .if (!eax) invoke TranslateMessage, addr msg invoke DispatchMessage, addr msg .endw mov eax,msg.wParam ret WinMain endp ;================================================================================== SplitProc proc uses ebx hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD mov eax,uMsg .if eax==WM_LBUTTONDOWN ; - здесь обрабатывается перетаскивание разделителя ; - нужно добавить ограничение перетаскивания по вертикали ; - и вписать изменение размеров левого и правого полей в зависимости от положения разделителя invoke ReleaseCapture invoke SendMessage, hWin, WM_NCLBUTTONDOWN, HTCAPTION, 0 .else invoke DefWindowProc, hWin, uMsg, wParam, lParam ret .endif xor eax,eax ret SplitProc endp ;================================================================================== WndProc proc uses ebx hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD mov eax,uMsg .if (eax==WM_CREATE) m2m hWnd,hWin .elseif (eax==WM_DESTROY) invoke PostQuitMessage, NULL .else invoke DefWindowProc, hWin, uMsg, wParam, lParam ret .endif xor eax,eax ret WndProc endp end start
Изменение левой и правой частей примерно так: Код (Text): SplitProc proc uses ebx hWin:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD mov eax,uMsg .if eax==WM_LBUTTONDOWN ; - здесь обрабатывается перетаскивание разделителя ; - нужно добавить ограничение перетаскивания по вертикали invoke ReleaseCapture invoke SendMessage, hWin, WM_NCLBUTTONDOWN, HTCAPTION, 0 .elseif eax==WM_MOVE mov ebx,lParam and ebx,0FFFFh mov ecx,ebx sub ecx,5 invoke MoveWindow, hLeft, 5, 5, ecx, 390, TRUE mov ecx, 580 sub ecx,ebx add ebx,10 invoke MoveWindow, hRight, ebx, 5, ecx, 390, TRUE .else invoke DefWindowProc, hWin, uMsg, wParam, lParam ret .endif xor eax,eax ret SplitProc endp