Цитата:
Сообщение от macomics
Да. Сами выберите.
|
Ну, я выбрал 32767, но меня терзают смутные сомнения, мне кажется, что размер подбирается как-то иначе. А как, есть только предположения, а хочется конкретики.
Цитата:
Сообщение от macomics
Наверное вы забыли учесть размеры рамки. Для функции SetWindowPos надо передавать размеры окна с учетом рамки.
|
И MoveWindow() так же себя ведёт. Если в WM_CREATE это делать тогда всё проходит нормально, хоть и не гладко, но размер задаётся, и окно не схлопывается, хотя размер, почему то, не верный.
Пытаюсь подобрать так:
Код:
struct TABLEPROPERTY
{
TABLEPROPERTY() :cxOneCell(0), cyOneCell(0),
cxWindow(0), cyWindow(0),
nRows(0), nCols(0), cxCellNumber(0)
{ }
unsigned int cxOneCell;
unsigned int cyOneCell;
unsigned int cxWindow;
unsigned int cyWindow;
unsigned int nRows, nCols;
unsigned int cxCellNumber;
};
BOOL CalculateRowsAndColumnsForWindow(HWND hwnd, const TEXTMETRIC& tm, TABLEPROPERTY& res)
{
UINT cxChar, cyChar, cxSpace, cySpace;
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading;
cxSpace = static_cast<int>(round(cxChar * 1.5));
cySpace = (cyChar >> 1);
/*HDC hdc = GetDC(hwnd);
cxSpace = GetDeviceCaps(hdc, LOGPIXELSX);
cySpace = GetDeviceCaps(hdc, LOGPIXELSY);
ReleaseDC(hwnd, hdc);*/
RECT rc;
GetClientRect(hwnd, &rc);
UINT cxCols, cyRows, cyHeight = 0, cxWidth = 0;
for (cyRows = 0; ; ++cyRows, cyHeight += (cyChar + cySpace))
{
if ((cyHeight + (cyChar + cySpace)) > (unsigned int)rc.bottom)
break;
}
for (cxCols = 0; ; ++cxCols, cxWidth += ((cxChar + cxSpace ) * 6 ))
{
if ((cxWidth + ((cxChar + cxSpace) * 6 )) > (unsigned int)rc.right)
break;
}
//UINT cyRows = (rc.bottom - (cyChar + cySpace)) / (cyChar + cySpace);
TCHAR iNum[16];
_stprintf_s(iNum, 16, TEXT("%d"), cyRows);
int sz = _tcslen(iNum)+cxSpace;
int szNumber = sz * cxChar;
//UINT cxCols = (rc.right - szNumber) / ((cxChar + cxSpace) * 6);
res.cxWindow = cxWidth-szNumber;
res.cyWindow = cyHeight - GetSystemMetrics(SM_CYHSCROLL);
res.cxOneCell = (cxChar + cxSpace) * 6;
res.cyOneCell = (cyChar + cySpace);
res.nCols = cxCols-1;
res.nRows = cyRows;
res.cxCellNumber = szNumber;
//ВОТ ТАК СРАБОТАЛО, но осадок, как говорится, остался.
RECT rcWnd;
GetWindowRect(hwnd, &rcWnd);
int diffRight = ((rcWnd.right - rcWnd.left) - rc.right);
int diffBottom = ((rcWnd.bottom - rcWnd.top) - rc.bottom);
rcWnd.right = res.cxWindow + diffRight;
rcWnd.bottom = res.cyWindow + diffBottom+ GetSystemMetrics(SM_CYHSCROLL);
AdjustWindowRect(&rcWnd, WS_OVERLAPPEDWINDOW | WS_HSCROLL, FALSE);
return SetWindowPos(hwnd, 0, 0, 0,
rcWnd.right, rcWnd.bottom,
SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED |
SWP_NOSENDCHANGING);
}
Но столбцов оказывается меньше и прорисовываются столбца не до конца и окно не подгоняется ровно под размер.
Окно2.jpg