⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multicell.cpp

📁 wxGTK 是 wxWidgets 的 linux GTK+ (>2.2.3)版本。wxWidgets 是一个跨平台的 GUI 框架
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            if (rect->GetStyle() & wxVERTICAL_RESIZABLE ||                rect->GetHeight() > 1 ||                m_minSizes[rect->GetRow()]->GetHeight() < 0)            {                int h = 0;                for (int x = 0; x < rect->GetHeight(); x++)                {                    h += m_maxHeight[rect->GetRow() + x];                }                c_size.SetHeight(h);            }            else            {                c_size.SetHeight(minSize.GetHeight());            }            int extraHeight = (m_maxHeight[rect->GetRow()] - c_size.GetHeight());            int extraWidth = (m_maxWidth[rect->GetColumn()] - c_size.GetWidth());            if (rect->GetWidth() == 1 && rect->GetAlignment() & wxALIGN_CENTER_HORIZONTAL)            {                c_point.x += extraWidth / 2;            }            if (rect->GetWidth() == 1 && rect->GetAlignment() & wxALIGN_RIGHT)            {                c_point.x += extraWidth;            }            if (rect->GetHeight() == 1 && rect->GetAlignment() & wxALIGN_CENTER_VERTICAL)            {                c_point.y += extraHeight / 2;            }            if (rect->GetHeight() == 1 && rect->GetAlignment() & wxALIGN_BOTTOM)            {                c_point.y += extraHeight;            }            item->SetDimension(c_point, c_size);        }        current = current->GetNext();    }}//---------------------------------------------------------------------------wxSize wxMultiCellSizer::CalcMin(){    if (m_children.GetCount() == 0)        return wxSize(10,10);    GetMinimums();    int m_minWidth = Sum(m_maxWidth, m_cell_count.GetWidth());    int m_minHeight = Sum(m_maxHeight, m_cell_count.GetHeight());    return wxSize( m_minWidth, m_minHeight );}//---------------------------------------------------------------------------void wxMultiCellSizer :: GetMinimums(){    // We first initial all the arrays EXCEPT for the m_minsizes array.    memset(m_maxHeight, 0, sizeof(int) * m_cell_count.GetHeight());    memset(m_maxWidth, 0, sizeof(int) * m_cell_count.GetWidth());    memset(m_rowStretch, 0, sizeof(int) * m_cell_count.GetHeight());    memset(m_colStretch, 0, sizeof(int) * m_cell_count.GetWidth());    for (int x = 0; x < 1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth()); x++)    {        m_weights[x]->SetHeight(0);        m_weights[x]->SetWidth(0);    }    wxSizerItemList::compatibility_iterator     node = m_children.GetFirst();    while (node)    {        wxSizerItem     *item = node->GetData();        wxMultiCellItemHandle *rect;        if (item != NULL &&            (rect = (wxMultiCellItemHandle *)item->GetUserData()) != NULL)        {            int row = rect->GetRow();            int col = rect->GetColumn();            // First make sure that the control knows about the max rows and columns            int changed = false;            if (row + 1 > m_cell_count.GetHeight())            {                changed++;                m_maxHeight = (int *)realloc(m_maxHeight, (1 + row) * sizeof(int));                m_rowStretch = (int *)realloc(m_rowStretch, (1 + row) * sizeof(int));                for (int x = m_cell_count.GetHeight(); x < row + 1; x++)                {                    m_maxHeight[x - 1] = 0;                    m_rowStretch[x - 1] = 0;                }                m_cell_count.SetHeight(row + 1);            }            if (col + 1 > m_cell_count.GetWidth())            {                changed++;                m_maxWidth = (int *)realloc(m_maxWidth, (1 + col) * sizeof(int));                m_colStretch = (int *)realloc(m_colStretch, ( 1 + col) * sizeof(int));                for (int x = m_cell_count.GetWidth(); x < col + 1; x++)                {                    m_maxWidth[x - 1] = 0;                    m_colStretch[x - 1] = 0;                }                m_cell_count.SetWidth(col + 1);            }            if (changed)            {                m_weights = (wxSize **)realloc(m_weights, (1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth())) * sizeof(wxSize *));                m_minSizes = (wxSize **)realloc(m_minSizes, (1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth())) * sizeof(wxSize *));                for (int x = m_maxWeights; x < 1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth()); x++)                {                    m_weights[x - 1] = new wxSize(0,0);                    m_minSizes[x - 1] = new wxSize(0,0);                }                m_maxWeights = 1 + wxMax(m_cell_count.GetHeight(), m_cell_count.GetWidth());            }            // Sum the m_weights for each row/column, but only if they are resizable            wxSize minSize( item->CalcMin() );            wxSize c_size = rect->GetLocalSize();            if (c_size.GetHeight() != wxDefaultCoord ||                c_size.GetWidth() != wxDefaultCoord)            {                minSize.SetHeight(wxMax(minSize.GetHeight(), c_size.GetHeight()));                minSize.SetWidth(wxMax(minSize.GetWidth(), c_size.GetWidth()));            }            // For each row, calculate the max height for those fields which are not            // resizable in the vertical pane            if (!(rect->GetStyle() & wxVERTICAL_RESIZABLE || m_minSizes[row]->GetHeight() < 0))            {                m_maxHeight[row] = wxMax(m_maxHeight[row], minSize.GetHeight() / rect->GetHeight());            }            else            {                m_rowStretch[row] = 1;                if (m_minSizes[row]->GetHeight())                {                    m_maxHeight[row] = abs(m_minSizes[row]->GetHeight());                }                else                {                    m_maxHeight[row] = wxMax(m_maxHeight[row], m_defaultCellSize.GetHeight());                }                m_weights[row]->SetHeight(wxMax(m_weights[row]->GetHeight(), rect->GetWeight().GetHeight()));            }            // For each column, calculate the max width for those fields which are not            // resizable in the horizontal pane            if (!(rect->GetStyle() & wxHORIZONTAL_RESIZABLE || m_minSizes[col]->GetWidth() < 0))            {                if (m_minSizes[col]->GetWidth())                {                    m_maxWidth[col] = abs(m_minSizes[col]->GetWidth());                }                else                {                    m_maxWidth[col] = wxMax(m_maxWidth[col], minSize.GetWidth() / rect->GetWidth());                }            }            else            {                m_colStretch[col] = 1;                m_maxWidth[col] = wxMax(m_maxWidth[col], m_defaultCellSize.GetWidth());                m_weights[col]->SetWidth(wxMax(m_weights[col]->GetWidth(), rect->GetWeight().GetWidth()));            }            node = node->GetNext();        }    }} // wxMultiCellSizer :: GetMinimums//---------------------------------------------------------------------------/* *Function Name: wxMultiCellSizer :: Sum * *Parameters:    int* pointer to array of ints *               int  Number of cells to sum up * *Description:   This member function sums up all the elements of the array which *               preceed the specified cell. * *Returns:       int Sum * */int wxMultiCellSizer :: Sum(int *array, int x){    int sum = 0;    while (x--)    {        sum += array[x];    }    return sum;}//---------------------------------------------------------------------------/* *Function Name: wxMultiCellSizer :: DrawGridLines * *Parameters:    wxDC Device context * *Description:   This function draws the grid lines in the specified device context. * */void wxMultiCellSizer :: DrawGridLines(wxDC& dc){    RecalcSizes();    int maxW = Sum(m_maxWidth, m_cell_count.GetWidth());    int maxH = Sum(m_maxHeight, m_cell_count.GetHeight());    int x;    // Draw the columns    dc.SetPen(* m_pen);    for (x = 1; x < m_cell_count.GetWidth(); x++)    {        int colPos = Sum(m_maxWidth, x) ;        dc.DrawLine(colPos, 0, colPos, maxH);    }    // Draw the rows    for (x = 1; x < m_cell_count.GetHeight(); x++)    {        int rowPos = Sum(m_maxHeight, x);        dc.DrawLine(0, rowPos, maxW, rowPos);    }}//---------------------------------------------------------------------------// Define the repainting behaviour/* *Function Name: wxMultiCellSizer::OnPaint * *Parameters:    wxDC Device context * *Description:   This function calls the DrawGridLines() member if a window *               has been previously specified.  This functions MUST be called *               from an OnPaint member belonging to the window which the sizer *               is attached to. * */void wxMultiCellSizer::OnPaint(wxDC& dc ){    if (m_win)    {        DrawGridLines(dc);    }}//---------------------------------------------------------------------------//---------------------------------------------------------------------------#define CELL_LOC(row, col) ((row) * m_maxCols + col)//---------------------------------------------------------------------------// wxCell//---------------------------------------------------------------------------/* *Function Name: wxCell : wxLayoutConstraints * *Description:   This class is used by wxMultiCellCanvas for internal storage * */class wxCell : public wxLayoutConstraints{public:    wxCell(wxWindow *win)    {        m_window = win;    };    wxWindow    *m_window;};//---------------------------------------------------------------------------// wxMultiCellCanvas//---------------------------------------------------------------------------wxMultiCellCanvas :: wxMultiCellCanvas(wxWindow *par, int numRows, int numCols)   : wxFlexGridSizer(numRows, numCols, 0, 0){    m_cells = (wxCell **)calloc(numRows * numCols, sizeof(wxCell *));    m_parent = par;    m_maxRows = numRows;    m_maxCols = numCols;    m_minCellSize = wxSize(5, 5);}//---------------------------------------------------------------------------void wxMultiCellCanvas :: Add(wxWindow *win, unsigned int row, unsigned int col){  // thanks to unsigned data row and col are always >= 0    wxASSERT_MSG( /* row >= 0 && */ row < m_maxRows,                 wxString::Format(_T("Row %d out of bounds (0..%d)"), row, m_maxRows) );    wxASSERT_MSG( /* col >= 0 && */ col < m_maxCols,                 wxString::Format(_T("Column %d out of bounds (0..%d)"), col, m_maxCols) );    wxASSERT_MSG(m_cells[CELL_LOC(row, col)] == NULL, wxT("Cell already occupied"));    wxCell *newCell = new wxCell(win);    m_cells[CELL_LOC(row,col)] = newCell;}//---------------------------------------------------------------------------void wxMultiCellCanvas :: CalculateConstraints(){    unsigned int    row, col;    for (row = 0; row < m_maxRows; row++)    {        for (col = 0; col < m_maxCols; col++)        {            if (!m_cells[CELL_LOC(row, col)])            {                // Create an empty static text field as a placeholder                m_cells[CELL_LOC(row, col)] = new wxCell(new wxStaticText(m_parent, wxID_ANY, wxEmptyString));            }            wxFlexGridSizer::Add(m_cells[CELL_LOC(row, col)]->m_window);        }    }}/*** End of File ***/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -