特性:
1. 用户可动态指定n*n格子
2. 支持bmp图片
3. 需要父窗口支持
以下是头文件:
// CPicGrid
class CPicGrid : public CWnd
{
DECLARE_DYNAMIC(CPicGrid)
public:
CPicGrid(CWnd* pParent, int n, int iSpace);
virtual ~CPicGrid();
int GetGridNum() const { return m_n*m_n; }
int GetGridDim() const { return m_n; }
int GetGridWidth() const { return m_iWidth; }
int GetGridHeight() const { return m_iHeight; }
int GetGridSpace() const { return m_iSpace; }
CStatic* operator[](int i);
CStatic* GetGrid(int i, int j);
BOOL SetImgToGrid(int i, const TCHAR* szPath);
BOOL SetImgToGrid(int i, int j, const TCHAR* szPath);
protected:
DECLARE_MESSAGE_MAP()
private:
CPicGrid();
CStatic** p;
int m_n;
int m_iWidth;
int m_iHeight;
int m_iSpace;
};
以下是实现文件:
// CPicGrid
IMPLEMENT_DYNAMIC(CPicGrid, CWnd)
CPicGrid::CPicGrid() : CWnd()
{
}
CPicGrid::CPicGrid(CWnd* pParent, int n, int iSpace) : CWnd()
{
CRect rect;
pParent->GetClientRect(&rect);
this->Create(0, 0, WS_CHILD | WS_VISIBLE, rect, pParent, 0x1234);
this->ShowWindow(SW_SHOW);
m_iWidth = (rect.Width()-iSpace*(n-1))/n;
m_iHeight = (rect.Height()-iSpace*(n-1))/n;
m_iSpace = iSpace;
m_n = n;
int index = 0;
CRect grid;
grid.left = 0;
grid.top = 0;
grid.bottom = m_iHeight;
grid.right = m_iWidth;
p = new CStatic*[n*n];
for(int i=0; i<n*n; ++i)
{
p[i] = new CStatic;
p[i]->Create(0, WS_CHILD | SS_BITMAP | WS_BORDER | WS_VISIBLE, grid, this);
p[i]->ShowWindow(SW_SHOW);
grid.left += (m_iWidth + m_iSpace);
grid.right += (m_iWidth + m_iSpace);
if((i+1)%n == 0)
{
grid.top += (m_iHeight + m_iSpace);
grid.bottom += (m_iHeight + m_iSpace);
grid.left = 0;
grid.right = m_iWidth;
}
}
}
CPicGrid::~CPicGrid()
{
for(int i=0; i<9; ++i)
{
if(p[i]) delete p[i];
}
}
BEGIN_MESSAGE_MAP(CPicGrid, CWnd)
END_MESSAGE_MAP()
CStatic* CPicGrid::operator[](int i)
{
if(i < m_n*m_n)
{
return p[i];
}
else
return NULL;
}
CStatic* CPicGrid::GetGrid(int i, int j)
{
if(i>=0 && i<m_n && j>=0 && j<m_n)
{
return p[i*m_n + j];
}
else
return NULL;
}
BOOL CPicGrid::SetImgToGrid(int i, const TCHAR* szPath)
{
if(i<0 || i>m_n*m_n) return FALSE;
CRect grid;
p[i]->GetClientRect(&grid);
HBITMAP hbt = (HBITMAP)::LoadImage(NULL, szPath, IMAGE_BITMAP, grid.Width(), grid.Height(), LR_LOADFROMFILE);
if(hbt)
{
p[i]->SetBitmap(hbt);
return TRUE;
}
return FALSE;
}
BOOL CPicGrid::SetImgToGrid(int i, int j, const TCHAR* szPath)
{
if(i>=0 && i<m_n && j>=0 && j<m_n)
{
CRect grid;
p[i*m_n + j]->GetClientRect(&grid);
HBITMAP hbt = (HBITMAP)::LoadImage(NULL, szPath, IMAGE_BITMAP, grid.Width(), grid.Height(), LR_LOADFROMFILE);
if(hbt)
{
p[i*m_n + j]->SetBitmap(hbt);
return TRUE;
}
}
return FALSE;
}
应用示例:
// 。。。
// IDC_TTT是一个CStatic控件
CWnd* pParent = GetDlgItem(IDC_TTT);
p = new CPicGrid(pParent, 2, 10);