3 Stimmen

wxGrid zeigt großen leeren Rand auf der rechten Seite

Standardmäßig zeigt wxGrid einen kleinen (10 Pixel?) leeren Rand auf der rechten Seite, nach der letzten Spalte. Der Aufruf von SetMargins() hat keine Auswirkung auf diesen Rand.

Das ist zwar ärgerlich, aber ich kann damit leben.

Wenn ich jedoch die Breite der Zeilenbeschriftung auf Null setze, wird der leere Rand viel größer. Wenn ich nur eine Spalte habe, ist der Effekt furchtbar. Es sieht so aus, als würde wxGrid Platz für die nicht vorhandene Beschriftung lassen.

myPatGrid = new wxGrid(panel,IDC_PatGrid,wxPoint(10,10),wxSize(150,300) );
myPatGrid->SetRowLabelSize(0); 
myPatGrid->CreateGrid(200,1);
myPatGrid->SetColLabelValue(0,L"Patient IDs");

Gibt es eine Möglichkeit, diesen Rand zu entfernen?

enter image description here

Beachten Sie, dass wenn ich die Größe des wxgrid-Fensters im wxGrid-Konstruktor auf schmaler setze, in der Hoffnung, den Rand auszublenden, ich jetzt eine horizontale Bildlaufleiste erhalte, die auch schrecklich ist.

myPatGrid = new wxGrid(panel,IDC_PatGrid,wxPoint(10,10),wxSize(100,300) );
myPatGrid->SetRowLabelSize(0); 
myPatGrid->CreateGrid(200,1);
myPatGrid->SetColLabelValue(0,L"Patient IDs");

Gibt mir

enter image description here

Ich habe gerade auf wxWidgets v2.8.12 aktualisiert - das Problem besteht immer noch.

1voto

Sga Punkte 3550

Ich habe keine Funktion zur automatischen Größenanpassung der Spalten an das Raster gefunden. Wenn Sie nur eine Spalte haben, setzen Sie als Abhilfe deren Breite auf

myPatGrid->SetColMinimalWidth(0, grid_width - wxSYS_VSCROLL_X - 10)

Andernfalls wird die Breite der anderen Spalten addiert und die letzte Spalte an den verbleibenden Platz angepasst (minus Breite der Bildlaufleiste, minus 10).

EDIT : Ich habe ein funktionierendes Beispiel, das dies erzeugt:

grid example

int gridSize = 150;
int minSize = gridSize - wxSYS_VSCROLL_X - 2; // scrollbar appear if higher
grid->SetRowLabelSize(0);
grid->SetColMinimalWidth(0, minSize);
grid->SetColSize(0, minSize); // needed, otherwise column will not resize
grid->ForceRefresh();
grid->SetColLabelValue(0, "COORD");

EDIT2 : Damit ist es mir gelungen, den restlichen Rand zu entfernen:

int gridSize = 150;
int minSize = gridSize - 16; // trial & error
grid->SetMargins(0 - wxSYS_VSCROLL_X, 0);

enter image description here

0voto

blech Punkte 63

Da ich gestern etwas ähnliches gelöst habe, möchte ich mit folgendem Beitrag dazu beitragen, was die Arbeit für mich erledigt. Vielleicht wird dies jemand anderem helfen:

void RecalculateGridSize(wxGrid *grid, int cols) {
  if (grid == NULL)
    return;

  grid->AutoSizeColumns();

  float cumulative = 0, param = 0;
  for (int i = 0; i < cols; ++i)
    cumulative += grid->GetColSize(i);

  //not stretching when client size lower then calculated
  if(grid->GetClientSize().x < cumulative)
    return;

  param = (float) grid->GetClientSize().x / cumulative;

  for (int i = 0; i < cols; ++i) {
    if (i != cols - 1)
      grid->SetColSize(i, int(grid->GetColSize(i)*param) - 2); //-2 for each line per column
    else
      grid->SetColSize(i, int(grid->GetColSize(i)*param)); //leaving last column full to fill properly
    }
  }

Hinweis: Dies funktioniert besonders gut in Verbindung mit dem Ereignis OnSize().

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X