00001
00002
00003
00004
00005
00006
00007
00008 #include "Volumizer.h"
00009
00010 extern HWND wnd_main, wnd_3d, wnd_front, wnd_left, wnd_top;
00011
00012 ATOM RegisterSplitterClass(HINSTANCE hInstance)
00013 {
00014 WNDCLASSEX wcex;
00015
00016 wcex.cbSize = sizeof(WNDCLASSEX);
00017
00018 wcex.style = CS_HREDRAW | CS_VREDRAW;
00019 wcex.lpfnWndProc = SplitterProc;
00020 wcex.cbClsExtra = 0;
00021 wcex.cbWndExtra = 0;
00022 wcex.hInstance = hInstance;
00023 wcex.hIcon = NULL;
00024 wcex.hCursor = LoadCursor(NULL, IDC_SIZEWE);
00025 wcex.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
00026 wcex.lpszMenuName = NULL;
00027 wcex.lpszClassName = L"SplitterWnd";
00028 wcex.hIconSm = NULL;
00029
00030 return RegisterClassEx(&wcex);
00031 }
00032
00036 LRESULT CALLBACK SplitterProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
00037 {
00038 PAINTSTRUCT ps;
00039 HDC hdc;
00040 POINT mpos;
00041
00042 switch (message)
00043 {
00044 case WM_LBUTTONDOWN:
00045
00046 SetCapture(hWnd);
00047 break;
00048 case WM_LBUTTONUP:
00049 ReleaseCapture();
00050 break;
00051 case WM_MOUSEMOVE:
00052
00053 if (GetCapture() == hWnd)
00054 {
00055 GetCursorPos(&mpos);
00056 RECT rect;
00057 GetClientRect(wnd_main, &rect);
00058
00059 ScreenToClient(wnd_main, &mpos);
00060
00061 if (mpos.x < 20)
00062 mpos.x = 20;
00063
00064 if (mpos.x > rect.right - 20)
00065 mpos.x = rect.right - 20;
00066
00067 SetWindowPos(hWnd, NULL, mpos.x, TOOL_HEIGHT, 0, 0, SWP_NOSIZE);
00068 SetWindowPos(wnd_3d, NULL, mpos.x + SPLITTER_WIDTH, TOOL_HEIGHT, rect.right - (mpos.x + SPLITTER_WIDTH), rect.bottom - TOOL_HEIGHT - HISTOGRAM_HEIGHT, NULL);
00069
00070 SetWindowPos(wnd_histogram, NULL, mpos.x + SPLITTER_WIDTH, rect.bottom - HISTOGRAM_HEIGHT, rect.right - (mpos.x + SPLITTER_WIDTH), HISTOGRAM_HEIGHT, NULL);
00071
00072 SetWindowPos(wnd_front, NULL, 0, TOOL_HEIGHT, mpos.x, (rect.bottom - TOOL_HEIGHT)/3, NULL);
00073 SetWindowPos(wnd_left, NULL, 0, (rect.bottom - TOOL_HEIGHT)/3 + TOOL_HEIGHT, mpos.x, (rect.bottom - TOOL_HEIGHT)/3, NULL);
00074 SetWindowPos(wnd_top, NULL, 0, (rect.bottom - TOOL_HEIGHT)*2/3 + TOOL_HEIGHT, mpos.x, (rect.bottom - TOOL_HEIGHT)/3, NULL);
00075
00076 UpdateWindow(hWnd);
00077 UpdateWindow(wnd_3d);
00078
00079 UpdateWindow(wnd_front);
00080 UpdateWindow(wnd_left);
00081 UpdateWindow(wnd_top);
00082 }
00083 break;
00084 case WM_SIZE:
00085
00086 RECT rect;
00087 GetClientRect(wnd_main, &rect);
00088
00089 RECT splitterrect;
00090 GetWindowRect(hWnd, &splitterrect);
00091 POINT splitterpos;
00092 splitterpos.x = splitterrect.left;
00093
00094 ScreenToClient(wnd_main, &splitterpos);
00095
00096 SetWindowPos(hWnd, NULL, 0, 0, SPLITTER_WIDTH, rect.bottom - TOOL_HEIGHT, SWP_NOMOVE);
00097 SetWindowPos(wnd_3d, NULL, splitterpos.x + SPLITTER_WIDTH, TOOL_HEIGHT, rect.right - (splitterpos.x + SPLITTER_WIDTH), rect.bottom - TOOL_HEIGHT - HISTOGRAM_HEIGHT, NULL);
00098
00099 SetWindowPos(wnd_histogram, NULL, splitterpos.x + SPLITTER_WIDTH, rect.bottom - HISTOGRAM_HEIGHT, rect.right - (splitterpos.x + SPLITTER_WIDTH), HISTOGRAM_HEIGHT, NULL);
00100
00101 SetWindowPos(wnd_front, NULL, 0, TOOL_HEIGHT, splitterpos.x, (rect.bottom - TOOL_HEIGHT)/3, SWP_NOMOVE);
00102 SetWindowPos(wnd_left, NULL, 0, (rect.bottom - TOOL_HEIGHT)/3 + TOOL_HEIGHT, splitterpos.x, (rect.bottom - TOOL_HEIGHT)/3, NULL);
00103 SetWindowPos(wnd_top, NULL, 0, (rect.bottom - TOOL_HEIGHT)*2/3 + TOOL_HEIGHT, splitterpos.x, (rect.bottom - TOOL_HEIGHT)/3, NULL);
00104 break;
00105 case WM_PAINT:
00106 hdc = BeginPaint(hWnd, &ps);
00107
00108 EndPaint(hWnd, &ps);
00109 break;
00110 case WM_DESTROY:
00111 PostQuitMessage(0);
00112 break;
00113 default:
00114 return DefWindowProc(hWnd, message, wParam, lParam);
00115 }
00116 return 0;
00117 }