#include /* required for all Windows applications */ #include /* required for all Windows applications */ #include "wizunzip.h" /* specific to this program */ /* sizewndw.c module of WizUnzip. * Author: Robert A. Heath * I, Robert Heath, place this source code module in the public domain. */ #define MIN_LISTBOX_LINES 2 /* Call this when the window size changes or needs to change. */ void SizeWindow(HWND hWnd, BOOL bOKtoMovehWnd) { WORD wListAreaWidth; /* width list box and modifiers */ WORD wMinClientWidth; /* minimum client width */ WORD wButtonWidth; int nListBoxHeight; /* height of listbox in pix */ WORD wVariableHeight; /* no. variable pixels on client */ WORD wVariableLines; /* no. variable lines on client window */ WORD wMessageBoxHeight; /* message box height in pixels */ int nCxBorder = GetSystemMetrics(SM_CXBORDER); int nCyBorder = GetSystemMetrics(SM_CYBORDER); int nCxVscroll = GetSystemMetrics(SM_CXVSCROLL); /* vertical scroll width */ int nCyHscroll = GetSystemMetrics(SM_CYHSCROLL); /* vertical scroll width */ int nCyCaption = GetSystemMetrics(SM_CYCAPTION); /* caption height */ int nButtonsYpos; short xClient, yClient; /* size of client area */ RECT WindowRect; /* full window rectangle structure */ RECT ClientRect; /* full window rectangle structure */ GetWindowRect(hWnd, &WindowRect); GetClientRect(hWnd, &ClientRect); xClient = ClientRect.right-ClientRect.left+1; /* x size of client area */ yClient = ClientRect.bottom-ClientRect.top+1; /* y size of client area */ if (bStatusMaxed) { /* position the status window to fill entire client window */ MoveWindow(hWndStatus, 0, 0, xClient, yClient, TRUE); MessageWinLines = yClient / ychar ; } else /* else status window is its normal size */ { /* List Box gets roughly 1/2 of lines left over on client * window after subtracting fixed overhead for borders, * horizontal scroll bar, * button margin spacing, header, and trailer lines. */ wVariableHeight = yClient - (4 * nCyBorder) - (7 * ychar) - nCyHscroll - nCyCaption; wVariableLines = wVariableHeight / ychar; ListBoxLines = wVariableLines / 2 ; if (ListBoxLines < MIN_LISTBOX_LINES) ListBoxLines = MIN_LISTBOX_LINES; MessageWinLines = wVariableLines - ListBoxLines; /* vis. msg. wnd lines */ wListAreaWidth = (!wFormat ? MIN_SHORT_FORMAT_CHARS : MIN_LONG_FORMAT_CHARS) * xchar + nCxVscroll + 2 * nCxBorder; wMinClientWidth = wListAreaWidth; /* if we moved the hWnd from WM_SIZE, we'd probably get into * a nasty, tight loop since this generates a WM_SIZE. */ if (bOKtoMovehWnd && xClient < wMinClientWidth) { xClient = wMinClientWidth; MoveWindow(hWnd, WindowRect.left, WindowRect.top, xClient + 2*GetSystemMetrics(SM_CXFRAME), yClient, TRUE); } /* divide buttons up into 4 equal zones each button separated by * a 1-character buffer. */ wButtonWidth = (xClient - 5 * xchar)/4 ; /* width of button itself */ MoveWindow(hWndHeaderLine1, nCxBorder, 0, xClient, ychar, TRUE); MoveWindow(hWndHeaderLine2, nCxBorder, ychar, xClient, ychar, TRUE); nListBoxHeight = ListBoxLines * ychar + 2 * nCyBorder; MoveWindow(hWndList, 0, 2*ychar , xClient, nListBoxHeight, TRUE); MoveWindow(hWndTotalLine1, nCxBorder, ((ListBoxLines+2) * ychar + (2 * nCyBorder)), xClient, ychar, TRUE); MoveWindow(hWndTotalLine2, nCxBorder, ((ListBoxLines+3) * ychar + (2 * nCyBorder)), xClient, ychar, TRUE); nButtonsYpos = ListBoxLines * ychar + 9 * ychar / 2 + (2 * nCyBorder); /* position the 4 buttons */ MoveWindow(hExtract, xchar, nButtonsYpos, wButtonWidth , 2 * ychar, TRUE); MoveWindow(hDisplay, wButtonWidth+ (2 * xchar), nButtonsYpos, wButtonWidth , 2 * ychar, TRUE); MoveWindow(hTest, 2*(wButtonWidth+xchar)+xchar, nButtonsYpos, wButtonWidth , 2 * ychar, TRUE); MoveWindow(hShowComment, 3*(wButtonWidth+xchar)+xchar, nButtonsYpos, wButtonWidth , 2 * ychar, TRUE); /* Position the status (Message) window. * The Message windows is positioned relative to the bottom * of the client area rather than relative to the top of the client. */ wMessageBoxHeight = wVariableHeight - nListBoxHeight + 2 * nCyBorder + nCyHscroll + nCyCaption ; MoveWindow(hWndStatus, 0, yClient - wMessageBoxHeight, xClient, wMessageBoxHeight, TRUE); } /* bottom of status window is normal size */ }