特性: 1. 用户可动态指定n*n格子 2. 支持bmp图片 3. 需要父窗口支持 以下是头文件: #pragma once // 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; }; 以下是实现文件: #include "CPicGrid.h" // 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; } 应用示例: CPicGrid* p; // 。。。 // IDC_TTT是一个CStatic控件 CWnd* pParent = GetDlgItem(IDC_TTT); p = new CPicGrid(pParent, 2, 10);