Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.237.232.196] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Всем привет!
создаю внизу виртуального окна со скролом кнопку, все чикибамбони , прокручиваю кнопка есть, НО вот если окно обновляется (например по CDocument::OnNewDocument) когда мы находимся внизу окна, ну или где-то между, то все кнопка исчезает, как Алладин Все работает пока окно находится в не прокрученом состоянии вооот такие дела, че делать? void CExample4View::OnInitialUpdate() { //TRACE("CExample4View::OnInitialUpdate\n"); CScrollView::OnInitialUpdate(); const int cMapMode = MM_HIMETRIC; // устанавливаем размеры окна 20 Х 40 см const int cX = 20000; const int cY = 40000; CSize sizeTotal(cX, cY); CSize sizePage(sizeTotal.cx / 2, sizeTotal.cy / 2); CSize sizeLine(sizeTotal.cx / 50, sizeTotal.cy / 50); SetScrollSizes(cMapMode, sizeTotal, sizePage, sizeLine); // Располагаем кнопку во вьшке CClientDC dc(this); dc.SetMapMode(cMapMode); CPoint pt(0, -cY + 1000); dc.LPtoDP(&pt); mFirstPageButton.SetWindowPos(&wndTop, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW); } сама кнопка создается в OnCreate int CExample4View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CScrollView::OnCreate(lpCreateStruct) == -1) return -1; // создаем кнопку mFirstPageButton.Create(_T("First"), BS_PUSHBUTTON, CRect(0,0,76,23), this, ID_FIRST_BUTTON); return 0; } |
Сообщ.
#2
,
|
|
|
Цитата Cfon @ создаю внизу виртуального окна со скролом кнопку, все чикибамбони , прокручиваю кнопка есть, НО вот если окно обновляется (например по CDocument::OnNewDocument) когда мы находимся внизу окна, ну или где-то между, то все кнопка исчезает, как Алладин Все работает пока окно находится в не прокрученом состоянии вооот такие дела, че делать? А ты что хочешь сделать-то? Чтоб у тебя кнопка всегда висела в левом нижнем углу окна? Добавлено И, возможно, тебе для CExample4View нужно установить флажки WS_CLIPCHILDREN и WS_CLIPSIBLINGS, где-нибудь в PreCreateWindow |
Сообщ.
#3
,
|
|
|
Цитата Олег М @ Цитата Cfon @ создаю внизу виртуального окна со скролом кнопку, все чикибамбони , прокручиваю кнопка есть, НО вот если окно обновляется (например по CDocument::OnNewDocument) когда мы находимся внизу окна, ну или где-то между, то все кнопка исчезает, как Алладин Все работает пока окно находится в не прокрученом состоянии вооот такие дела, че делать? А ты что хочешь сделать-то? Чтоб у тебя кнопка всегда висела в левом нижнем углу окна? да я ща делаю страничный просмотр данных по 50 строк, решил сделать кнопки для этого. они будут снизу под таблицей, фиксировать их положение нельзя так как число записей меняется. можно конечно вверху, но хотелось бы снизу Цитата Олег М @ И, возможно, тебе для CExample4View нужно установить флажки WS_CLIPCHILDREN и WS_CLIPSIBLINGS, где-нибудь в PreCreateWindow для чего? |
Сообщ.
#4
,
|
|
|
Цитата Cfon @ И, возможно, тебе для CExample4View нужно установить флажки WS_CLIPCHILDREN и WS_CLIPSIBLINGS, где-нибудь в PreCreateWindow для чего? Чтоб дочерние окна не перерисовывались по отрисовке родителя Добавлено Цитата Cfon @ они будут снизу под таблицей, фиксировать их положение нельзя так как число записей меняется. можно конечно вверху, но хотелось бы снизу Тогда тебе надо будет их перемещать, по WM_WINDOWPOSCHANGING |
Сообщ.
#5
,
|
|
|
Цитата Олег М @ Цитата Cfon @ они будут снизу под таблицей, фиксировать их положение нельзя так как число записей меняется. можно конечно вверху, но хотелось бы снизу Тогда тебе надо будет их перемещать, по WM_WINDOWPOSCHANGING ща проверю |
Сообщ.
#6
,
|
|
|
блин сори чето не въеду как по WM_WINDOWPOSCHANGING сделать
если не сложно можно примерчик, вот мой пример в действии Прикреплённый файлExample4.zip (77,26 Кбайт, скачиваний: 88) Добавлено как вариант мне подойдет прокрутка окна наверх, но как это сделать программно?! |
Сообщ.
#7
,
|
|
|
Цитата Cfon @ блин сори чето не въеду как по WM_WINDOWPOSCHANGING сделать если не сложно можно примерчик, вот мой пример в действии В обработчике CExample4View::OnWindowPosChanging вызывай SetWindowPos для кнопки с новыми координатами и флагами SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW |
Сообщ.
#8
,
|
|
|
Цитата Олег М @ В обработчике CExample4View::OnWindowPosChanging вызывай SetWindowPos для кнопки с новыми координатами и флагами SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW ты сам то сделаешь? без обид |
Сообщ.
#9
,
|
|
|
Цитата Cfon @ ты сам то сделаешь? В смысле? |
Сообщ.
#10
,
|
|
|
Цитата Олег М @ Цитата Cfon @ ты сам то сделаешь? В смысле? У меня не получается может быть ты меня неправильно понял, я не умею объяснять, запусти мой код если есть желание тогда будет проще понять что я хочу если уж никак нельзя, то есть вариант (он даже правильнее) юзать тулбар и на нем разместить эти кнопки скорее всего я так сделаю, но мне хочеться ради интереса сделать по другому |
Сообщ.
#11
,
|
|
|
Как вариант, чтоб не заморачиваться со скроллингом (я тупо не помню, как он работет), можно сделать эти кнопки принадлежащими тому же окну, которому принадлежит View. Просто поместить их выше по z-order
Добавлено При создании указать mFirstPageButton.Create(_T("First"), BS_PUSHBUTTON, CRect(0,0,76,23), GetParent(), ID_FIRST_BUTTON); Добавлено А здесь mFirstPageButton.SetWindowPos(this, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW); |
Сообщ.
#12
,
|
|
|
Цитата Олег М @ Как вариант, чтоб не заморачиваться со скроллингом (я тупо не помню, как он работет), можно сделать эти кнопки принадлежащими тому же окну, которому принадлежит View. Просто поместить их выше по z-order Добавлено При создании указать mFirstPageButton.Create(_T("First"), BS_PUSHBUTTON, CRect(0,0,76,23), GetParent(), ID_FIRST_BUTTON); Добавлено А здесь mFirstPageButton.SetWindowPos(this, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW); нет все не то, видимо ты давно не юзал MFC решение в CScrollView::GetScrollPosition void CExample4View::OnInitialUpdate() { TRACE("CExample4View::OnInitialUpdate\n"); CScrollView::OnInitialUpdate(); //CSize sizeTotal; //// TODO: calculate the total size of this view //sizeTotal.cx = sizeTotal.cy = 100; //SetScrollSizes(MM_TEXT, sizeTotal); const int cMapMode = MM_HIMETRIC; // устанавливаем размеры окна 20 Х 40 см const int cX = 20000; const int cY = 40000; CSize sizeTotal(cX, cY); CSize sizePage(sizeTotal.cx / 2, sizeTotal.cy / 2); CSize sizeLine(sizeTotal.cx / 50, sizeTotal.cy / 50); SetScrollSizes(cMapMode, sizeTotal, sizePage, sizeLine); CPoint scrlPos = GetScrollPosition(); //<--- вот ана спасение :D TRACE("(%d, %d\n)", scrlPos.x, scrlPos.y); // Располагаем кнопку во вьшке CClientDC dc(this); dc.SetMapMode(cMapMode); CPoint pt(0, -cY - scrlPos.y + 1000); //<--- здесь коррекция положения dc.LPtoDP(&pt); mFirstPageButton.SetWindowPos(&wndTop, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW); } |
Сообщ.
#13
,
|
|
|
Цитата Cfon @ нет все не то, видимо ты давно не юзал MFC Что именно не то? Чего я не знаю в MFC, что знаешь ты? Цитата Cfon @ // Располагаем кнопку во вьшке CClientDC dc(this); dc.SetMapMode(cMapMode); CPoint pt(0, -cY - scrlPos.y + 1000); //<--- здесь коррекция положения dc.LPtoDP(&pt); Зачем тебе здесь CDC, ты что-то рисовать собрался? Чтобы определить координаты левого-нижнего угла, достаточно вызвать GetClientRect |
Сообщ.
#14
,
|
|
|
Цитата Олег М @ Зачем тебе здесь CDC, ты что-то рисовать собрался? Чтобы определить координаты левого-нижнего угла, достаточно вызвать GetClientRect CDC здесь чтобы установить режим преобразования mm_himetric и перевести из логических координат в координаты устройства Добавлено ты немного смотри код то |
Сообщ.
#15
,
|
|
|
Цитата Cfon @ CDC здесь чтобы установить режим преобразования mm_himetric и перевести из логических координат в координаты устройства Зачем для SetWindowPos himetric? Сравни полученную координату c GetClientRect, думаю, будет то же самое значение |