15,979
社区成员
发帖
与我相关
我的任务
分享
/*
注意的地方:
1.对话框创立后,会发送一个WM_SIZE消息,但此时的控件还没有创建。如果你调用依赖于此控件窗口句柄的函数,会出错。比如你调用m_edit.MoveWindow() 而此时m_edit控件又没有产生,程序已启动就显示错误结束,你想查原因都查不到。
所以你应该在OnInitDialog函数里(此时控件已产生)令一个标志为true,在OnSize判断此标志为true时才开始调整控件位置。
2.在OnInitDialog里应该调用多一个SetWindowPos改变窗口的大小,令其触发WM_SIZE消息。
3.改变ItemListStyle的值可以改变分布方式 垂直或水平分布
*/
UINT ItemListStyle=0; //水平或垂直
SIZE ItemSize; //Item的尺寸
RECT ListRect; //整个List的Rect
vector <RECT> item;
/****************************************************************************
计算每个ItemRect的值,利用ListRect.left List.top ItemSize.cx ItemSize.cy
4个参数计算,并最后确定ListRect.right 和 ListRect.bottom
****************************************************************************/
void RecountEachItemRect()
{
if(ItemListStyle==0) //Item垂直分布
{
for(int i=0;i<item.size();i++)
{
item[i].left=ListRect.left;
item[i].top=ListRect.top+i*ItemSize.cy;
item[i].right=ListRect.left+ItemSize.cx;
item[i].bottom=ListRect.top+(i+1)*ItemSize.cy;
}
ListRect.right=ListRect.left+ItemSize.cx;
ListRect.bottom=ListRect.top+ItemSize.cy*item.size();
}
else //Item水平分布
{
for(int i=0;i<item.size();i++)
{
item[i].left=ListRect.left+i*ItemSize.cx;
item[i].top=ListRect.top;
item[i].right=ListRect.left+(i+1)*ItemSize.cx;
item[i].bottom=ListRect.top+ItemSize.cy;
}
ListRect.right=ListRect.left+ItemSize.cx*item.size();
ListRect.bottom=ListRect.top+ItemSize.cy;
}
}
/****************************************************************************
用rect来确定List的大小位置
****************************************************************************/
void SetListRect(RECT& rect)
{
ASSERT(item.size()!=0);
//更新ListRect
ListRect=rect;
//确定每一项的宽和高
if(ItemListStyle==0) //Item垂直分布
{
ItemSize.cx =(rect.right-rect.left);
ItemSize.cy=(rect.bottom-rect.top)/item.size();
}
else //Item水平分布
{
ItemSize.cx=(rect.right-rect.left)/item.size();
ItemSize.cy=(rect.bottom-rect.top);
}
//更新每一项Rect
RecountEachItemRect();
}
BOOL CDemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(AfxGetApp()->LoadIcon(IDR_MAINFRAME), TRUE); // Set big icon
::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); //设置窗口最顶
static CLoadMyLibrary inst(m_hWnd);
//-----------------------------------------------------------------------------
item.resize(6);
::SetWindowPos(m_hWnd,HWND_TOPMOST,10,10,700,400,SWP_NOMOVE);
return TRUE;
}
void CDemoDlg::OnButton1()
{
ItemListStyle=1;
::SetWindowPos(m_hWnd,HWND_TOPMOST,10,10,700,402,SWP_NOMOVE);
::SetWindowPos(m_hWnd,HWND_TOPMOST,10,10,700,400,SWP_NOMOVE);
}
void CDemoDlg::OnButton2()
{
ItemListStyle=0;
::SetWindowPos(m_hWnd,HWND_TOPMOST,10,10,700,402,SWP_NOMOVE);
::SetWindowPos(m_hWnd,HWND_TOPMOST,10,10,700,400,SWP_NOMOVE);
}
//将RECT转为4个值:左上角2个坐标,宽度,高度。在一些函数中会用到,如:SetWindowPos,Create
#define RECT_TO_4VAL(rect) rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top
void CDemoDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (item.size()!=0)
{
RECT rect={10,10,cx-200,cy-10};
SetListRect(rect);
::MoveWindow(::GetDlgItem(m_hWnd,IDC_BUTTON1),RECT_TO_4VAL(item[0]),TRUE);
::MoveWindow(::GetDlgItem(m_hWnd,IDC_BUTTON2),RECT_TO_4VAL(item[1]),TRUE);
::MoveWindow(::GetDlgItem(m_hWnd,IDC_BUTTON3),RECT_TO_4VAL(item[2]),TRUE);
::MoveWindow(::GetDlgItem(m_hWnd,IDC_BUTTON4),RECT_TO_4VAL(item[3]),TRUE);
::MoveWindow(::GetDlgItem(m_hWnd,IDC_BUTTON5),RECT_TO_4VAL(item[4]),TRUE);
::MoveWindow(::GetDlgItem(m_hWnd,IDC_BUTTON6),RECT_TO_4VAL(item[5]),TRUE);
}
}