splitter
От: Calc Россия  
Дата: 07.07.03 06:44
Оценка:
Знаю, что в MFC есть такой класс.
А на winapi что нибудь подобное сделать можно? ( в смысле есть что нибудь подобное, что можно применить к окнам диалога и вообще к любым окнам)

(для некоторых, кто не в курсе английского названия поясняю: это вертикальная или горизонтальная полоска, если её двигать, то изменяется размер радяом стоящих элементов. Например regedit в винде-в пуске-выплнить)

спасибо!
Re: splitter
От: Sync  
Дата: 07.07.03 08:31
Оценка:
Здравствуйте, Calc, Вы писали:

C>Знаю, что в MFC есть такой класс.

C>А на winapi что нибудь подобное сделать можно? ( в смысле есть что нибудь подобное, что можно применить к окнам диалога и вообще к любым окнам)

C>(для некоторых, кто не в курсе английского названия поясняю: это вертикальная или горизонтальная полоска, если её двигать, то изменяется размер радяом стоящих элементов. Например regedit в винде-в пуске-выплнить)


C>спасибо!


В winapi я искал но не нашел каких либо функция для создания и работы с Splitter-ом.
я использовал WTL (CSplitterWindow m_vSplit).
Re: splitter
От: Lonely Dog Россия  
Дата: 07.07.03 09:01
Оценка:
Здравствуйте, Calc, Вы писали:

C>Знаю, что в MFC есть такой класс.

C>А на winapi что нибудь подобное сделать можно? ( в смысле есть что нибудь подобное, что можно применить к окнам диалога и вообще к любым окнам)

C>(для некоторых, кто не в курсе английского названия поясняю: это вертикальная или горизонтальная полоска, если её двигать, то изменяется размер радяом стоящих элементов. Например regedit в винде-в пуске-выплнить)


C>спасибо!


Если вы посмотрите на реализацию splitter в ATL. то увидете, что они сами его рисуют. Из этого я заключаю,
что такого контрола нет. (м.б. я и не прав...)
Re[2]: splitter
От: Calc Россия  
Дата: 07.07.03 18:53
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Если вы посмотрите на реализацию splitter в ATL. то увидете, что они сами его рисуют. Из этого я заключаю,

LD>что такого контрола нет. (м.б. я и не прав...)


спасибо!
Буду сам писать
Re[3]: splitter
От: Demiurg  
Дата: 08.07.03 08:15
Оценка: 3 (1)
Здравствуйте, Calc, Вы писали:

LD>>Если вы посмотрите на реализацию splitter в ATL. то увидете, что они сами его рисуют. Из этого я заключаю,

LD>>что такого контрола нет. (м.б. я и не прав...)

C>спасибо!

C>Буду сам писать

А что там писать? Ну сделай два окна рядом, и обрабатывай мышиные события в области между ними, соответственно меняя их размеры и обрабатывая сообщения WM_SIZE, WM_SIZING...
... << RSDN@Home 1.1 beta 1 >>
Re[4]: splitter
От: Calc Россия  
Дата: 08.07.03 08:23
Оценка:
Здравствуйте, Demiurg, Вы писали:

D>Здравствуйте, Calc, Вы писали:


D> А что там писать? Ну сделай два окна рядом, и обрабатывай мышиные события в области между ними, соответственно меняя их размеры и обрабатывая сообщения WM_SIZE, WM_SIZING...


А вот и флуд пошёл.
Я уж сам догадался.
Просто это мой первый опыт будет. Начинаю писать первую программу под вин.
Re[5]: splitter
От: Demiurg  
Дата: 08.07.03 08:36
Оценка:
Здравствуйте, Calc, Вы писали:

D>> А что там писать? Ну сделай два окна рядом, и обрабатывай мышиные события в области между ними, соответственно меняя их размеры и обрабатывая сообщения WM_SIZE, WM_SIZING...


C>А вот и флуд пошёл.

C>Я уж сам догадался.

Да какой уж там флуд?? Это первое, что пришло мне в голову, возможно не самый лучший вариант...

C>Просто это мой первый опыт будет. Начинаю писать первую программу под вин.


Получилось сплиттер сделать?
... << RSDN@Home 1.1 beta 1 >>
Re: splitter
От: Aquila http://www.wasm.ru
Дата: 08.07.03 09:37
Оценка:
Здравствуйте, Calc, Вы писали:

C>(для некоторых, кто не в курсе английского названия поясняю: это вертикальная или горизонтальная полоска, если её двигать, то изменяется размер радяом стоящих элементов. Например regedit в винде-в пуске-выплнить)


Вот несколько ссылок, может быть помогут :

http://ourworld.compuserve.com/homepages/ernies_world/split1.htm
http://ourworld.compuserve.com/homepages/ernies_world/split2.htm
http://ourworld.compuserve.com/homepages/ernies_world/split3.htm
http://ourworld.compuserve.com/homepages/ernies_world/split4.htm
Re[3]: splitter
От: Zlobik Россия  
Дата: 08.07.03 09:42
Оценка:
Здравствуйте, Calc, Вы писали:

C>Буду сам писать


Если есть желание, то можете глянуть следующую нитку на данном форуме:
http://www.rsdn.ru/Forum/Message.aspx?mid=137897&amp;only=1
Автор: Dr_Sh0ck
Дата: 23.11.02


или поищите по ключевым словам:
как сделать сплиттер для окна используя АПИ

там приводится неплохой код, того, как можно сделать сплиттер,
по крайней мере мне он помог написать свой.
С найбестевейшими вишезами,
Zlobik
Re: splitter
От: KycoK  
Дата: 08.07.03 10:13
Оценка: 2 (1)
Вот куски моего кода на C++:

//===============
void Splitter(DWORD lParam)
{
    POINT pPOINT;
    RECT pRECT;
    if(split==TRUE)
    {
        GetCursorPos(&pPOINT);
        ScreenToClient(hMainW,&pPOINT);    //hMainW-ýòî õýíäë ðîä. îêíà
        GetClientRect(hMainW,&pRECT);
        pRECT.right-=5;
        x=pPOINT.x;
        if(pPOINT.x > 3 && pPOINT.x < pRECT.right)
        {
            // hControl1  è hControl2 - ýòî õýíäëû äî÷. îêîí ïîáîêàì îò ñïëèòåðà
            MoveWindow(hControl1,x,y,LOWORD(lParam),pRECT.bottom,TRUE);
            MoveWindow(hControl2,LOWORD(lParam)+3,y,pRECT.right,pRECT.bottom,TRUE);
        }
    }
    return;
}
//===============


//========================
     case WM_LBUTTONDOWN:
        split=true;
        SetCapture(hMainW);
        SetCursor(LoadCursor(NULL,IDC_SIZEWE));
        return 0;

     case WM_LBUTTONUP:
        split=false;
        ReleaseCapture();
        return 0;

     case WM_MOUSEMOVE:
        SetCursor(LoadCursor(NULL,IDC_SIZEWE));
        Splitter(lParam);
        return 0;
//========================




А вот программа на asm`е из которой я сделал прогу на С++(). Выдери что надо и переведи на нужный язык:


; #########################################################################

; Splitter Example
; Copyright © 2000 by Brian Burns (aka anon)
;
; This code may be reused for any educational or
; non-commercial application without further licence
; Contact the author at BrianLBurns@att.net for any other use.

; #########################################################################

.386
.model flat, stdcall  ; 32 bit memory model
option casemap :none  ; case sensitive

; #########################################################################

include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\masm32.inc
include \MASM32\INCLUDE\gdi32.inc
include \MASM32\INCLUDE\user32.inc
include \MASM32\INCLUDE\kernel32.inc
include \MASM32\INCLUDE\Comctl32.inc
include \MASM32\INCLUDE\comdlg32.inc
include \MASM32\INCLUDE\shell32.inc

includelib \MASM32\LIB\masm32.lib
includelib \MASM32\LIB\gdi32.lib
includelib \MASM32\LIB\user32.lib
includelib \MASM32\LIB\kernel32.lib
includelib \MASM32\LIB\Comctl32.lib
includelib \MASM32\LIB\comdlg32.lib
includelib \MASM32\LIB\shell32.lib

; #########################################################################

;Local prototypes
WinMain  PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc  PROTO :DWORD,:DWORD,:DWORD,:DWORD
TopXY    PROTO :DWORD,:DWORD
Splitter PROTO :DWORD
Resizer  PROTO :DWORD

;Local macros
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp    lbl
Name   db Text,0
lbl:
ENDM

m2m MACRO M1, M2
push   M2
pop    M1
ENDM

return MACRO arg
mov    eax, arg
ret
ENDM

.data
szDisplayName db "Splitter Example",0
CommandLine   dd 0
hWnd          dd 0
hInstance     dd 0
hIcon         dd 0
StatClass     db "STATIC",0
EditClass     db "EDIT",0
hSplitter     dd 0
hLeftWindow   dd 0
hRightWindow  dd 0
split         dd 0
CurWidth      dd 500

.code
start:
invoke GetModuleHandle,NULL
mov    hInstance,eax
invoke GetCommandLine
mov    CommandLine,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax

; #########################################################################

WinMain proc hInst: DWORD,hPrevInst: DWORD,CmdLine: DWORD,CmdShow: DWORD

LOCAL wc   :WNDCLASSEX
LOCAL msg  :MSG
LOCAL Wwd  :DWORD
LOCAL Wht  :DWORD
LOCAL Wtx  :DWORD
LOCAL Wty  :DWORD

invoke LoadIcon,hInst,500
mov    hIcon,eax
szText szClassName,"Project_Class"
mov    wc.cbSize,sizeof WNDCLASSEX
mov    wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
mov    wc.lpfnWndProc,offset WndProc
mov    wc.cbClsExtra,NULL
mov    wc.cbWndExtra,NULL
m2m    wc.hInstance,hInst
mov    wc.hbrBackground,COLOR_BTNFACE+1
mov    wc.lpszMenuName,NULL
mov    wc.lpszClassName,offset szClassName
m2m    wc.hIcon,hIcon
invoke LoadCursor,NULL,IDC_SIZEWE
mov    wc.hCursor,eax
m2m    wc.hIconSm,hIcon
invoke RegisterClassEx,addr wc
;Center window at following size
mov    Wwd,500
mov    Wht,350
invoke GetSystemMetrics,SM_CXSCREEN
invoke TopXY,Wwd,eax
mov    Wtx,eax
invoke GetSystemMetrics,SM_CYSCREEN
invoke TopXY,Wht,eax
mov    Wty,eax
invoke CreateWindowEx,WS_EX_LEFT,addr szClassName,addr szDisplayName,WS_OVERLAPPEDWINDOW,
                      Wtx,Wty,Wwd,Wht,NULL,NULL,hInst,NULL
mov    hWnd,eax
invoke LoadMenu,hInst,600
invoke SetMenu,hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
;Loop until PostQuitMessage is sent
StartLoop:
invoke GetMessage,addr msg,NULL,0,0
cmp    eax,0
je     ExitLoop
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
jmp    StartLoop
ExitLoop:
return msg.wParam

WinMain endp

; #########################################################################

WndProc proc hWin: DWORD,uMsg: DWORD,wParam: DWORD,lParam: DWORD

LOCAL var    :DWORD
LOCAL caW    :DWORD
LOCAL caH    :DWORD
LOCAL Rct    :RECT
LOCAL hDC    :DWORD
LOCAL Ps     :PAINTSTRUCT
LOCAL buffer1[128]:BYTE  ; these are two spare buffers
LOCAL buffer2[128]:BYTE  ; for text manipulation etc..
LOCAL right  :DWORD

.if uMsg == WM_COMMAND
;======== menu commands ========
   .if wParam == 1010
      invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
   .elseif wParam == 1900
      szText AboutMsg,"Prostart Pure Assembler Template",13,10,\
             "Copyright © Prostart 1999"
      invoke ShellAbout,hWin,ADDR szDisplayName,ADDR AboutMsg,hIcon
   .endif
;====== end menu commands ======
.elseif uMsg == WM_CREATE
   invoke GetClientRect,hWin,Addr Rct
   mov    eax,Rct.right
   shr    eax,1
   mov    right,eax
   invoke CreateWindowEx,WS_EX_CLIENTEDGE,Addr EditClass,NULL,WS_CHILD or WS_VISIBLE,0,0,right,Rct.bottom,hWin,NULL,hInstance,0
   mov    hLeftWindow,eax
   mov    eax,right
   add    eax,4
   mov    right,eax
   invoke CreateWindowEx,WS_EX_CLIENTEDGE,Addr EditClass,NULL,WS_CHILD or WS_VISIBLE,right,0,Rct.right,Rct.bottom,hWin,NULL,hInstance,0
   mov    hRightWindow,eax

.elseif uMsg == WM_SIZE
   invoke Resizer,lParam
   return 0

.elseif uMsg == WM_LBUTTONDOWN
   mov    split,TRUE
   invoke SetCapture,hWnd
   return 0

.elseif uMsg == WM_MOUSEMOVE
   invoke Splitter,lParam
   return 0

.elseif uMsg == WM_LBUTTONUP
   mov    split,FALSE
   invoke ReleaseCapture
   return 0

.elseif uMsg == WM_CLOSE

.elseif uMsg == WM_DESTROY
   invoke PostQuitMessage,NULL
   return 0 

.endif

invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret

WndProc endp

; ########################################################################

TopXY proc wDim:DWORD, sDim:DWORD

shr    sDim,1      ; divide screen dimension by 2
shr    wDim,1      ; divide window dimension by 2
mov    eax,wDim    ; copy window dimension into eax
sub    sDim,eax    ; sub half win dimension from half screen dimension
return sDim

TopXY endp

; #########################################################################

Splitter proc lParam:DWORD

LOCAL pPOINT: POINT
LOCAL pRECT: RECT

.if    split == TRUE
   invoke GetCursorPos,addr pPOINT
   invoke ScreenToClient,hWnd,addr pPOINT
   invoke GetClientRect,hWnd,addr pRECT
   sub    pRECT.right,5
   mov    eax,pRECT.right
   .if    pPOINT.x > 3 && pPOINT.x < eax         ;limit travel of 'splitter' to edges of parent window
      and    lParam,0ffffh                       ;mouse X (horiz) position in LoWord
      invoke MoveWindow,hLeftWindow,0,0,lParam,pRECT.bottom,TRUE
      add    lParam,4                            ;save room for 'splitter'
      invoke MoveWindow,hRightWindow,lParam,0,pRECT.right,pRECT.bottom,TRUE
   .endif
.endif
return 0

Splitter endp

; ########################################################################

Resizer proc lParam:DWORD   ;make window split proportional on resize

LOCAL ClientRect: RECT
LOCAL WindowRect: RECT

invoke GetClientRect,hWnd,addr ClientRect
invoke GetClientRect,hLeftWindow,addr WindowRect
finit
fld    WindowRect.right
fld    CurWidth
fdiv
and    lParam,0ffffh        ;new window width in LoWord
fld    lParam
fmul
fstp   WindowRect.right
invoke MoveWindow,hLeftWindow,0,0,WindowRect.right,ClientRect.bottom,TRUE
add    WindowRect.right,4   ;save room for 'splitter'
invoke MoveWindow,hRightWindow,WindowRect.right,0,ClientRect.right,ClientRect.bottom,TRUE
m2m    CurWidth,lParam
return 0

Resizer endp

; ########################################################################

end start
Re[6]: splitter
От: Calc Россия  
Дата: 08.07.03 10:36
Оценка:
Здравствуйте, Demiurg, Вы писали:

D> Получилось сплиттер сделать?


Пока нет. (ещё не пробовал)
Застрял на этом:

У меня в роли главного окна выступает диалог.
На нём есть Tree Control и List Control.
Делаю, чтоб они меняли свои размеры при изменении размеров диалога:


void Dlg_OnSize(HWND hwnd, UINT state, int cx, int cy)
{
    RECT rectClient;
    GetClientRect(hwnd, &rectClient);

    MoveWindow(GetDlgItem(hwnd, IDC_TREE), rectClient.left, rectClient.top,rectClient.right/2 - 2,rectClient.bottom, TRUE);
    MoveWindow(GetDlgItem(hwnd, IDC_LIST), rectClient.right/2 + 2, rectClient.top,rectClient.right/2,rectClient.bottom, TRUE);
}
// + 2 и - 2 потом будут заменены на переменные или на одну переменную, в зависимости от реализации сплиттера.

Это обработка сообщения WM_SIZE.
Код работает, но вот при дизайне диалога я просто разбросал эти control в произвольном порядке и форме.
Теперь при запуске приложения, появляется диалоговое окно и внём как при дизайне всё разбросано.
Начинаю менять размеры и всё в порядке.
Сижу ломаю голову, как сделать тоже самое, но ещё до появления окна.
WM_INITDIALOG не подходит.

Посоветуйте, что нибудь.

Пробовал отправить сообщение WM_SIZE из сообщения WM_INITDIALOG, но помоему сообщение WM_INITDIALOG возникает ещё до создания окна, так что нет смысла посылать.

Ну хотя бы подскажите в каком сообщении можно это сделать.
Re[7]: splitter
От: Calc Россия  
Дата: 08.07.03 10:51
Оценка:
Блин, ну как всегда сначало пожулуюсь, а потом получается.
Ток больше нельзя
Всё начинаю сплиттер мучить.
Re[2]: splitter
От: Calc Россия  
Дата: 08.07.03 12:11
Оценка:
Здравствуйте, KycoK, Вы писали:

KK>Вот куски моего кода на C++:

KK> ...
KK>//========================

Вот что у меня получилось:


void Splitter(HWND hwnd, DWORD lParam)
{
    RECT rectClient;

    GetClientRect(hwnd, &rectClient);
    if(LOWORD(lParam) > 50 && LOWORD(lParam) < (rectClient.right - 50))
    {
        MoveWindow(GetDlgItem(hwnd, IDC_TREE), rectClient.left, rectClient.top, LOWORD(lParam) - 2, rectClient.bottom, TRUE);
        MoveWindow(GetDlgItem(hwnd, IDC_LIST), LOWORD(lParam) + 2, rectClient.top, rectClient.right - LOWORD(lParam), rectClient.bottom, TRUE);
    }
}

/////////////////////////////////////////////////////////////////////////////

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg) {
        chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
        chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand);
        chHANDLE_DLGMSG(hwnd, WM_SIZE, Dlg_OnSize);
    case WM_LBUTTONUP:
        ReleaseCapture();
        break;
    case WM_MOUSEMOVE:
        SetCursor(LoadCursor(NULL, IDC_SIZEWE));
        if(wParam == MK_LBUTTON)
        {
            SetCapture(hwnd);
            Splitter(hwnd, lParam);
        }
        break;
    }
    return(FALSE);
}


Помоему короче и легче.
Доработать надо только:
При нажатии на мышь, курсор меняется на стандартную стрелку.
При наведении курсора предположем на левый край сплиттера и зажатии кнопки, а потом движении влево сообщение WM_MOUSEMOVE не генерируется и сплиттер не перемещается.
Думаю это можно доработать
1) WM_LMOUSEDOWN
2) WM_MOUSELEAVE

Вот ваш код:

//========================

    case WM_LBUTTONDOWN:
        split=true;
        SetCapture(hMainW);
        SetCursor(LoadCursor(NULL,IDC_SIZEWE));
    return 0;

    case WM_LBUTTONUP:
        split=false;
        ReleaseCapture();
    return 0;

    case WM_MOUSEMOVE:
        SetCursor(LoadCursor(NULL,IDC_SIZEWE));
        Splitter(lParam);
    return 0;
//========================

Заметил такую вещь:
При генерации сообщения WM_LMOUSEDOWN у меня почемуто после этого не генерировалось сообщение WM_MOUSEMOVE

Вот ещё:
MoveWindow(hControl2, LOWORD(lParam)+3, y, pRECT.right, pRECT.bottom, TRUE);

При размере больше 3х курсор IDC_SIZEWE находиться не по середине сплиттера.

И ещё вопрос, только он по C++ а не по WinApi

Обязательно ли завершать функции типа void ключевым словом return; ?


Жду похожей критики в адрес моего кода.
Re[3]: splitter
От: KycoK  
Дата: 09.07.03 12:25
Оценка:
Здравствуйте, Calc, Вы писали:


C>

C>void Splitter(HWND hwnd, DWORD lParam)
C>{
C>    RECT rectClient;

C>    GetClientRect(hwnd, &rectClient);
C>    if(LOWORD(lParam) > 50 && LOWORD(lParam) < (rectClient.right - 50))
C>    {
C>        MoveWindow(GetDlgItem(hwnd, IDC_TREE), rectClient.left, rectClient.top, LOWORD(lParam) - 2, rectClient.bottom, TRUE);
C>        MoveWindow(GetDlgItem(hwnd, IDC_LIST), LOWORD(lParam) + 2, rectClient.top, rectClient.right - LOWORD(lParam), rectClient.bottom, TRUE);
C>    }
C>}

C>/////////////////////////////////////////////////////////////////////////////

C>INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
C>{
C>    switch (uMsg) {
C>        chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
C>        chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand);
C>        chHANDLE_DLGMSG(hwnd, WM_SIZE, Dlg_OnSize);
C>    case WM_LBUTTONUP:
C>        ReleaseCapture();
C>        break;
C>    case WM_MOUSEMOVE:
C>        SetCursor(LoadCursor(NULL, IDC_SIZEWE));
C>        if(wParam == MK_LBUTTON)
C>        {
C>            SetCapture(hwnd);
C>            Splitter(hwnd, lParam);
C>        }
C>        break;
C>    }
C>    return(FALSE);
C>}
C>



WM_MOUSEMOVE посылается очень часто при движении мыши, а у Вас тут вызывается функция SetCapture каждый раз. Это может затормозить машину или ещё какая гадость случится.

C>Вот ваш код:


C>
C>//========================

C>    case WM_LBUTTONDOWN:
C>        split=true;
C>        SetCapture(hMainW);
C>        SetCursor(LoadCursor(NULL,IDC_SIZEWE));
C>    return 0;

C>    case WM_LBUTTONUP:
C>        split=false;
C>        ReleaseCapture();
C>    return 0;

C>    case WM_MOUSEMOVE:
C>        SetCursor(LoadCursor(NULL,IDC_SIZEWE));
C>        Splitter(lParam);
C>    return 0;
C>//========================
C>

C>Заметил такую вещь:
C>При генерации сообщения WM_LMOUSEDOWN у меня почемуто после этого не генерировалось сообщение WM_MOUSEMOVE

Не знаю: у меня всё работало. У меня тоже было с одной стороны дерево а с другой лист, но не в диалоге. Я при WM_CREATE создавал окна там где надо а потом уже обрабатывал WM_SIZE всякий.

C>Вот ещё:

C>
C>MoveWindow(hControl2, LOWORD(lParam)+3, y, pRECT.right, pRECT.bottom, TRUE);
C>

C>При размере больше 3х курсор IDC_SIZEWE находиться не по середине сплиттера.

На счёт всяких там пикселей не помню: делал подбором, и потом у меня там ещё тулбар и статусбар были, так что не знаю. Я выдрал из программы и на скорую руку убрал что не надо...

C>И ещё вопрос, только он по C++ а не по WinApi


C>Обязательно ли завершать функции типа void ключевым словом return; ?


Нет. Это тебе надо только для досрочного завершения. Типа, если в if`е.


C>Жду похожей критики в адрес моего кода.

Ну, небольшую ты получил.
Re[4]: splitter
От: Calc Россия  
Дата: 09.07.03 14:21
Оценка:
Здравствуйте, KycoK, Вы писали:

KK>Здравствуйте, Calc, Вы писали:

KK>Ну, небольшую ты получил.

Изменил код, получился как и ваш. Недостатки моей реализации исчезли.

//----------------

Вот фрагмент вашего кода:
case WM_MOUSEMOVE:
       SetCursor(LoadCursor(NULL,IDC_SIZEWE));
       Splitter(lParam);
    return 0;



Вот мой:
case WM_MOUSEMOVE:
       SetCursor(LoadCursor(NULL,IDC_SIZEWE));
       if(split) Splitter(hwnd, lParam);

Помоему он лучше тем, что функция Splitter вызывается не каждый раз(что замедляет работу программы), а только тогда, когда нажата кнопка мыши.(в функции splitter отменена проверка перменной split)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.