The LayoutCol property was created many years ago, when nobody thought about using our controls on screens with high DPI values. It just saves and restores the column widths in pixels regardless of the current monitor's DPI.
To solve the problem, we need to save the current DPI when we read the LayoutCol string and process it accordingly when we restore the column layout: column widths must be recalculated if the DPI has changed. I will think whether this can be done automatically in iGrid and if it's possible, I will implement it in the next big update of the control. Obviously, this will require a change in the LayoutCol string template, so I will need to think how to make it work for layout strings generated in previous builds of iGrid.
If you need an urgent workaround and ready to code it yourself, you need to take into account what I wrote above. And sure, you need to know the format of the LayoutCol string. You have the source code of iGrid so you can always see how a method or property is implemented. The Get accessor for LayoutCol is simple:
Public Property Get LayoutCol() As String
Dim s As String
Dim iCol As Long
For iCol = 1 To m_lColCount
s = s & iCol & LAYOUT_SEP & "Width" & LAYOUT_SEP & ColWidth(iCol) & LAYOUT_SEP _
& iCol & LAYOUT_SEP & "Order" & LAYOUT_SEP & ColPos(iCol) & LAYOUT_SEP _
& iCol & LAYOUT_SEP & "Visible" & LAYOUT_SEP & IIf(ColVisible(iCol), "1", "0") & LAYOUT_SEP
Next
LayoutCol = s
End Property
LAYOUT_SEP is the vertical line separator "|", iCol is the ordinal number of the column on the screen. As you can see, the number following the Order parameter is the value of the ColPos() property for the corresponding column.
The algorithm that processes assignments to LayoutCol is more complex, but it expects all these column parameters (Width, Order, Visible) to be present - and better in the same original order.