投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/9/8 15:34:46
シート操作自体は不要で、オートシェイプっぽい操作ができれば良いのでしょうか。
それとも、オートシェイプ入りの Excel ファイルの編集が必要な状況なのでしょうか。

前者の場合、描いたり編集したりするだけならば、InkEdit コントロールなどの選択肢があります。
シートなどに重ねて描画する目的には使えません。

後者の場合、ReoGrid 以外のソリューション、たとえば SpreadSheetGear などでも、
シェイプの座標処理が難しいと言われているので、何か技術的な制限があるのかも。
https://www.xlsoft.com/jp/products/spreadsheetgear/faq-japan.html#4-1


ReoGrid で実装するなら、GitHub からリポジトリをクローンして、
該当機能を作りこむしか無いと思います。

現状だと、たとえば超手抜き実装でこんな感じにしてみても、
操作できるのは一部のメンバーに限られます

// 手抜きでシェイプそのものをバインド。実際はラッパークラスを設けた方が良い
this.listBox1.DataSource = this.bindingSource1;
this.bindingSource1.DataSource = worksheet.FloatingObjects;

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
  // 編集画面を作りこむのが面倒なので、PropertyGrid に渡すだけの手抜き処理
    this.propertyGrid1.SelectedObject = listBox1.SelectedItem;
}

private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
  // シェイプが変更通知イベントを有していないので、手動で再描画を依頼する
    this.reoGridControl1.Invalidate();
}



・Style プロパティや Location プロパティなどの階層構造のメンバーを操作できない
 → これは Point 構造体などに EditorAttribute がないためであり、
   コードから差し替えることはできる。
   (PropertyGrid に対応させるなら、自前で中継クラスにラッピングする)

・シェイプが変更通知イベントを有していないので、シェイプ座標を書き換えても
 グリッド側が即座に変更できない(マウスやペンがホバーすれば反応する)
  → 自前で Invalidate を呼び出すか、ソースを弄って変更通知イベントを自分で追加する

・シェイプをクリックで選択したり、重なったシェイプのレイヤーを入れ替えたり、
 ドラッグで移動させるといった機能が不足している
 → rectObj.IsSelected = true; にしてやれば、ドラッグ可能な見た目のハンドルを
  シェイプに追加することができますが、それはあくまで見た目だけの話。
 → マウス操作を捉える場合、描画オブジェクトそのものだけでなく、
  グリッド側のカスタマイズも必要になってくるので、
  元ソースに手を入れる必要がありそう


> Excelのオートシェイプのようなものを利用したいと思っています。
有償で構わなければ、 SpreadsheetGear はどうでしょう。
私は使ったことが無いので確証は持てませんが、
どうやらシェイプの追加や選択もできそうにみえます。
https://github.com/SpreadsheetGear/SpreadsheetGearExplorerSamples


VB6 なら、OLE コンテナ コントロールを使う手もあるのですけれどね…。(Excel 本体が必要)

Private Sub Command1_Click()
    Dim wb As Object
    Set wb = Me.OLE1.object
    Dim shp As Object
    Set shp = wb.Worksheets("Sheet1").Shapes.AddShape(1, 20, 10, 60, 40)
    shp.Fill.Visible = False
    shp.Line.ForeColor.RGB = RGB(255, 0, 0)
End Sub