Аналог Align и Ahcors в VC++
Ну что неужто никто не подскажет такую фигню?
Фигня довольно простая - отлавливаешь сообщение WM_SIZE этого окна, и в обработчике этого сообщения соотв. меняешь размеры и позиции всех элементов как душа пожелает.
Фигня довольно простая - отлавливаешь сообщение WM_SIZE этого окна, и в обработчике этого сообщения соотв. меняешь размеры и позиции всех элементов как душа пожелает.
Этого я и боялся. А попроше чего нить нет, ну типа стиль какой нибудь у контрола выставить...
Этого я и боялся. А попроше чего нить нет, ну типа стиль какой нибудь у контрола выставить...
Во всяком случае я не знаю, может и есть. Мои знакомые тоже так делают :-). Не нужно бояться, ничего страшного в этом нет.
ну и кто скажет после этого что разработка приложений с сложным пользовательским интерфейсом в Borlande намного проще и быстрее ......
to dvp.
Да на Borlande, похоже, быстрее. Не отвлекаешься на такую фигню.
to Krivonos.
А как быть, если у Вас на панели CFrameView размещён объект CTabCtrl c 5-ю закладками, и на каждой из них по 5 контролов? Для каждого диалога (для каждой пейджи) переопределять OnSize(.....)?
Да что уж там говорить по поводу создания контролов с динамически меняющими размеры относительно друг друга ...
Что да?
Ред. Смущает CFramtView а не FormView?
На счет "на панели CFrameView размещён объект CTabCtrl c 5-ю закладками, и на каждой из них по 5 контролов" - как одно из решений вижу разрешение ресайза до размеров табконтрола. Или создать свой класс окна, в котором прописать алгоритм смены положения всех контролов на сообщение WM_SIZE.
Так что, никто не предлагает никакого решения?
На счет "на панели CFrameView размещён объект CTabCtrl c 5-ю закладками, и на каждой из них по 5 контролов" - как одно из решений вижу разрешение ресайза до размеров табконтрола. Или создать свой класс окна, в котором прописать алгоритм смены положения всех контролов на сообщение WM_SIZE.
to ДВП.
Я посмотрел, как люди делают. Вот тебе совет - программируй на Borlande или .NET, но только последний релиз 2003 года(рание релизы 2002 и 2003 не поддерживают визуального дизайнера Windows Forms для проектов C++; только для С# и VB). В указанном дотнете ты сможешь почти также комфортно визуально!!! работать с пропертями контролов. Там появилось проперти Anchor. Вообщем там клёво должно быть. Наконец мелкософт дорос немного до Borland!
Если ты упрямый, и хочешь MFC, то либо используй классы других, например, либо делай, как говорит товарищ Кривонос с Украины, см.выше.
Можешь сделать сам, приблизительно, так:
// dialDlg.h : header file
#define MAXCTRL 100
#define A_TOP 2
#define A_BOTTOM 4
#define A_LEFT 8
#define A_RIGHT 16
typedef struct listctrl
{
unsigned long idc;
unsigned char ank_type;
CRect rct_client;
} LISTCTRL;
// CdialDlg dialog
class CdialDlg : public CDialog
{
...
...
public:
LISTCTRL ctr_list[MAXCTRL];
int cnt_list;
CPoint ptBottomRight;
void AddAnchor(int IDC,unsigned char type )
{
ctr_list[cnt_list].idc = IDC;
ctr_list[cnt_list].ank_type = type;
GetDlgItem(IDC)->GetWindowRect(ctr_list[cnt_list].rct_client);
ScreenToClient(ctr_list[cnt_list].rct_client);
cnt_list ++;
};
void SaveFormRect(void)
{
CRect rc;
GetClientRect( rc );
ptBottomRight = rc.BottomRight();
}
...
...
public:
afx_msg void OnSize(UINT nType, int cx, int cy);
};
//----------------------------------------------
// dialDlg.cpp : implementation file
//
BOOL CdialDlg::OnInitDialog()
{
...
...
// TODO: Add extra initialization here
SaveFormRect();
AddAnchor(IDC_STATIC, A_TOP | A_LEFT);
AddAnchor(IDC_EDIT1, A_TOP | A_LEFT);
AddAnchor(IDOK, A_BOTTOM | A_RIGHT);
AddAnchor(IDCANCEL, A_BOTTOM | A_RIGHT);
return TRUE; // return TRUE unless you set the focus to a control
}
//------------------------------------------------------------------------------
void CdialDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
CRect rc;
GetClientRect( rc );
CPoint offset = rc.BottomRight() - ptBottomRight;
for (int i = 0; i < cnt_list; i++)
{
unsigned char ank = ctr_list.ank_type;
int j;
CRect rct_item = ctr_list.rct_client;
if (ank & A_TOP) {
Делай чегото с ректанглом
}
if (ank & A_LEFT) {
Делай чегото с ректанглом
}
}
if (ank & A_BOTTOM) {
Например,
rct_item.MoveToXY(rct_item.TopLeft().x,rct_item.TopLeft().y + offset.y);
}
if (ank & A_RIGHT) {
Например,
rct_item.MoveToXY(rct_item.TopLeft().x + offset.x,rct_item.TopLeft().y);
}
CWnd* item = (CWnd* ) GetDlgItem(ctr_list.idc);
item->MoveWindow(rct_item);
item->RedrawWindow();
}
}
to Krivonos.
Вы правы. Лучше руками. Я посмотрел, как люди пытаются прикрутить чужие классы - жуть. Лучше руками. Прокоментируйте мой код. Программирую давно, но в MFC - новенький.
Редакц. ДВП, я забыл кинуть ссылку с форума bugtraq.ru -
"
Заодно там есть и всякие функции AddAnchor.
http://www.codeproject.com/dialog/resizabledialog.asp"
Прокоментируйте мой код.
Пойдет!
________________
товарищ Кривонос с Украины :-)