Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2022, 04:37   #51
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от 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

Последний раз редактировалось apofioz; 15.10.2022 в 10:24.
apofioz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нарисовать круговую диаграмму Proskurina Паскаль, Turbo Pascal, PascalABC.NET 2 08.11.2012 08:50
Нарисовать столбиковую диаграмму по результатам сдачи экзамена по матану Proskurina Паскаль, Turbo Pascal, PascalABC.NET 8 07.11.2012 23:14
Нарисовать столбиковую диаграмму Proskurina Помощь студентам 2 24.10.2012 13:40
Нарисовать диаграмму сравнения методов Gebbellz Помощь студентам 0 15.12.2010 17:52
нарисовать круговую диаграмму в паскале vbchristy46 Помощь студентам 2 28.06.2010 20:33