#include LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hwnd; MSG msg; WNDCLASS wndclass; static char *szAppName = "Splitter Example"; wndclass.style = 0; //CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_INFORMATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; RegisterClass(&wndclass); hwnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HINSTANCE hInst; RECT rect; static HCURSOR hCursor; static BOOL bSplitterMoving; static DWORD dwSplitterPos; static HWND hWnd1, hWnd2; switch (uMsg) { case WM_CREATE: hInst = ((LPCREATESTRUCT) lParam) -> hInstance; hWnd1 = CreateWindowEx( WS_EX_CLIENTEDGE, "edit", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | ES_MULTILINE | WS_VSCROLL, 0, 0, 0, 0, hWnd, (HMENU) 1, hInst, NULL ); hWnd2 = CreateWindowEx( WS_EX_CLIENTEDGE, "edit", NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | ES_MULTILINE | WS_VSCROLL, 0, 0, 0, 0, hWnd, (HMENU) 2, hInst, NULL ); hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS)); bSplitterMoving = FALSE; dwSplitterPos = 130; return 0; case WM_SIZE: /* If window is shrunk so that splitter now lies outside the window boundaries, move the splitter within the window. */ if ((wParam != SIZE_MINIMIZED) && (HIWORD(lParam) < dwSplitterPos)) dwSplitterPos = HIWORD(lParam) - 10; /* Adjust the children's size and position */ MoveWindow(hWnd1, 0, 0, LOWORD(lParam), dwSplitterPos - 1, TRUE); MoveWindow(hWnd2, 0, dwSplitterPos+2, LOWORD(lParam) , HIWORD(lParam) - dwSplitterPos - 2, TRUE); return 0; case WM_MOUSEMOVE: if (HIWORD(lParam) > 10) // do not allow above this mark { SetCursor(hCursor); if ((wParam == MK_LBUTTON) && bSplitterMoving) { GetClientRect(hWnd, &rect); if (HIWORD(lParam) > rect.bottom) return 0; dwSplitterPos = HIWORD(lParam); SendMessage(hWnd, WM_SIZE, 0, MAKELPARAM(rect.right, rect.bottom)); } } return 0; case WM_LBUTTONDOWN: SetCursor(hCursor); bSplitterMoving = TRUE; SetCapture(hWnd); return 0; case WM_LBUTTONUP: ReleaseCapture(); bSplitterMoving = FALSE; return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, uMsg, wParam, lParam); }