質問編集履歴

5

pictureboxをひとつに変更した最新コードへ更新

2019/06/06 07:39

投稿

dendenmushi
dendenmushi

スコア98

test CHANGED
File without changes
test CHANGED
@@ -22,12 +22,108 @@
22
22
 
23
23
 
24
24
 
25
-
25
+ ###コード
26
+
26
-
27
+ わかりづらくなってしまうので当初のpicturebox2つ使おうとしていたコードは削除しました。
28
+
29
+
30
+
27
- Form1.cs
31
+ ### 試したこと
32
+
33
+
34
+
35
+ paintイベントの中にgraphics含め描画のメソッドを入れていくことも行いましたが、paintの外側にあるマウスダウンイベントなどの中でメソッド呼び込みをどうしたらよいかわからず、そもそもpaintイベントの中にマウスイベントじたいも入れ込まなければいけないのかいろいろなサイトや書籍(C#)を見てますが、解決できませんでした。
36
+
37
+ 参考サイト:
38
+
39
+ [PictureBoxに線が描けません。](https://teratail.com/questions/28653)
40
+
41
+ [ラバーランドでのドラッグ範囲の切り抜き](https://teratail.com/questions/14079)
42
+
43
+ [基本描画画像が消える](http://www110.kir.jp/csharp/chip0231.html)
44
+
45
+ [イメージプロパティによくある勘違い](https://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html)
46
+
47
+
48
+
49
+ pictureboxを2つ重ねて上側を透過trancerateをbackcolorを選択しても四角形描画が始まるとはじめの画像表示は消えてしまいました。
50
+
51
+ あと試していない(できなかった)のはpictureboxを2つ作り、親子の関係にして上のを透過させる方法です。
52
+
53
+ 最終的には四角形で切り抜き保存までを行いたいだけです。
54
+
55
+ かなり苦戦しております。どなたかご教授頂けないでしょうか。
56
+
57
+
58
+
59
+
60
+
61
+ ###その後試したこと
62
+
63
+ 親子関係を作りpicturebox2の方を透過で四角を描けるようにしました。
28
64
 
29
65
  ```C#
30
66
 
67
+ public Form1()
68
+
69
+ {
70
+
71
+ InitializeComponent();
72
+
73
+ //プロパティの設定変更
74
+
75
+ pictureBox1.AllowDrop = true;
76
+
77
+ //描画先とするImageオブジェクトを作成する
78
+
79
+ bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
80
+
81
+
82
+
83
+ pictureBox2.BackColor = Color.Transparent;
84
+
85
+ pictureBox2.Parent = pictureBox1;
86
+
87
+ pictureBox2.Location = new Point(0, 0);
88
+
89
+
90
+
91
+ }
92
+
93
+ ```
94
+
95
+
96
+
97
+ それでも画像の方は四角指定の際のD&Dで消えてしまいました。
98
+
99
+
100
+
101
+ ###現状(令和元年6月6日)
102
+
103
+ デザイン…picture1の上にあえてpicture2をずらして上に置いています。テストのため。
104
+
105
+ ![イメージ説明](8b4ac5cabe0e8222cd161612132d5dfd.jpeg)
106
+
107
+ ドラッグ中…はじめに置いた画像picture1がpicture2が出てきたことで上半分欠ける(子の透過ができていない)
108
+
109
+ ![イメージ説明](2f221ae301b56fd6f1b947ae2e59e3a3.png)
110
+
111
+ ドロップ後…四角形は最終的に目当てと違う場所に残ったが意図しない場所(picuture2だが座標がおかしい)
112
+
113
+ ![イメージ説明](9fdc46f8e7710fa4f224f02f315ac27f.png)
114
+
115
+
116
+
117
+
118
+
119
+ ###6月6日16時の時点での現状
120
+
121
+ ・なんとか元画像の上に四角枠を表示することができました。ありがとうございます。
122
+
123
+ ・残りの課題は、四角の表示される位置が非常にずれています。
124
+
125
+ ```C#
126
+
31
127
  using System;
32
128
 
33
129
  using System.Collections.Generic;
@@ -38,6 +134,8 @@
38
134
 
39
135
  using System.Drawing;
40
136
 
137
+ using System.Drawing.Imaging;
138
+
41
139
  using System.IO;
42
140
 
43
141
  using System.Linq;
@@ -60,25 +158,15 @@
60
158
 
61
159
  {
62
160
 
63
-
64
-
65
- private string editFilePath = "";
66
-
67
- private bool dirtyFlag = false;
68
-
69
- private bool readOnlyFlag = false;
70
-
71
-
72
-
73
- //Form2から
74
-
75
161
  Point MD = new Point();
76
162
 
77
163
  Point MU = new Point();
78
164
 
79
165
  Bitmap bmp;
80
166
 
81
- Bitmap bitmap;//20190605
167
+ Bitmap backgroundBitmap;//20190605
168
+
169
+ Bitmap offscreenBitmap;
82
170
 
83
171
  bool view = false;
84
172
 
@@ -100,355 +188,241 @@
100
188
 
101
189
  bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
102
190
 
103
-
104
-
105
- pictureBox2.BackColor = Color.Transparent;
106
-
107
- pictureBox2.Parent = pictureBox1;
108
-
109
- pictureBox2.Location = new Point(0, 0);
110
-
111
-
112
-
113
- }
191
+ }
114
-
115
- /*
192
+
116
-
117
- private void textBox1_DragDrop(object sender, DragEventArgs e)
193
+ private void pictureBox1_DragDrop(object sender, DragEventArgs e)
118
-
194
+
119
- {
195
+ {
120
-
196
+
121
- string[] dlagFilePathArray = (string[])e.Data.GetData(DataFormats.FileDrop, false);
197
+ string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
122
-
123
-
124
-
125
- //複数のファイルがドラックされた場合、パスが配列として取得されるが、
198
+
126
-
127
- //今回のアプリケーションは TextBox が 1 つしかないため、先頭の
128
-
129
- //ファイルのみを扱う
130
-
131
- string filePath = dlagFilePathArray[0];
199
+ for (int i = 0; i < files.Length; i++)
132
-
133
-
134
-
135
- //ファイルがテキスト形式でオープン可能なものかどうか確認
136
-
137
- if (CheckFileType(filePath))
138
200
 
139
201
  {
140
202
 
141
- //ファイルの内容を TextBox にロード
142
-
143
- textBox1.Text = File.ReadAllText(filePath, Encoding.Default);
144
-
145
-
146
-
147
- //フォームのタイトル部分にファイル名を表示
148
-
149
- this.Text = GetFileNameString(filePath, '\');
150
-
151
- editFilePath = filePath;
203
+ string fileName = files[i];
204
+
205
+
206
+
152
-
207
+ string filename = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
208
+
153
- setDirty(false);
209
+ backgroundBitmap = new Bitmap(filename);
210
+
154
-
211
+ offscreenBitmap = new Bitmap(backgroundBitmap);//tuika15
212
+
213
+
214
+
215
+
216
+
155
-
217
+ Console.WriteLine("offscreenBitmap:" + offscreenBitmap);
218
+
219
+
220
+
221
+ //表示方法をzoomにする
222
+
223
+ pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
224
+
225
+
226
+
227
+ pictureBox1.Image = offscreenBitmap;
156
228
 
157
229
  }
158
230
 
159
-
160
-
161
-
162
-
163
- }*/
164
-
165
- /*
166
-
167
- private void setDirty(bool flag)
168
-
169
- {
170
-
171
- dirtyFlag = flag;
172
-
173
- //読み取り専用でファイルがオープンされている場合、
174
-
175
- //[上書き(&S)] メニューアイテムは常に無効
176
-
177
- //menuSave.Enabled = (readOnlyFlag) ? false : flag;
178
-
179
- }
180
-
181
-
182
-
183
- //ドロップファイルがオープン可能なものであるかどうかをチェックする関数
184
-
185
- private bool CheckFileType(string filePath)
186
-
187
- {
188
-
189
- //読み込みを許可するファイルの拡張子を指定 (app.config に定義した方が本当は便利)
190
-
191
- string[] extnArray = { "txt", "cs", "vb", "htm", "html", "xml", "csv", "js", "vbs", "wsh" };
192
-
193
- foreach (string extn in extnArray)
231
+ }
232
+
233
+
234
+
235
+ private void pictureBox1_DragEnter(object sender, DragEventArgs e)
236
+
237
+ {
238
+
239
+ if (e.Data.GetDataPresent(DataFormats.FileDrop))
240
+
241
+ e.Effect = DragDropEffects.Copy;
242
+
243
+ }
244
+
245
+
246
+
247
+ private void GetRegion(Point p1, Point p2, ref Point start, ref Point end)
248
+
249
+ {
250
+
251
+ start.X = Math.Min(p1.X, p2.X);
252
+
253
+ start.Y = Math.Min(p1.Y, p2.Y);
254
+
255
+
256
+
257
+ end.X = Math.Max(p1.X, p2.X);
258
+
259
+ end.Y = Math.Max(p1.Y, p2.Y);
260
+
261
+ }
262
+
263
+
264
+
265
+ private int GetLength(int start, int end)
266
+
267
+ {
268
+
269
+ return Math.Abs(start - end);
270
+
271
+ }
272
+
273
+
274
+
275
+ private void DrawRegion(Point start, Point end)
276
+
277
+ {
278
+
279
+ Pen blackPen = new Pen(Color.Black);
280
+
281
+ Console.WriteLine(bmp);
282
+
283
+ Console.WriteLine(offscreenBitmap);
284
+
285
+
286
+
287
+ Graphics g = Graphics.FromImage(offscreenBitmap);
288
+
289
+
290
+
291
+ // 描画する線を点線に設定
292
+
293
+ blackPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
294
+
295
+
296
+
297
+ // 画面を消去
298
+
299
+ g.Clear(SystemColors.Control);
300
+
301
+
302
+
303
+ g.DrawRectangle(blackPen, start.X, start.Y, GetLength(start.X, end.X), GetLength(start.Y, end.Y));
304
+
305
+
306
+
307
+ g.Dispose();
308
+
309
+ }
310
+
311
+
312
+
313
+ private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
314
+
315
+ {
316
+
317
+ // 描画フラグON
318
+
319
+ view = true;
320
+
321
+
322
+
323
+ // Mouseを押した座標を記録
324
+
325
+ MD.X = e.X;
326
+
327
+ MD.Y = e.Y;
328
+
329
+ }
330
+
331
+
332
+
333
+ private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
334
+
335
+ {
336
+
337
+
338
+
339
+ Point p = new Point();
340
+
341
+ Point start = new Point();
342
+
343
+ Point end = new Point();
344
+
345
+
346
+
347
+ // 描画フラグcheck
348
+
349
+ if (view == false)
194
350
 
195
351
  {
196
352
 
197
- int dotLen = extn.Length;
198
-
199
- if (extn == filePath.Substring(filePath.Length - dotLen, dotLen))
200
-
201
- {
202
-
203
- return true;
353
+ return;
204
-
205
- }
206
354
 
207
355
  }
208
356
 
209
- return false;
210
-
211
- }
212
-
213
-
214
-
215
- private void textBox1_DragEnter(object sender, DragEventArgs e)
216
-
217
- {
218
-
219
- //ドラッグされたのがファイルである確認
220
-
221
- if (e.Data.GetDataPresent(DataFormats.FileDrop))
222
-
223
- //ドラッグされたデータを受け取る
224
-
225
- e.Effect = DragDropEffects.All;
226
-
227
- else
228
-
229
- //ドラッグされたデータを受け取らない
230
-
231
- e.Effect = DragDropEffects.None;
232
-
233
- }
234
-
235
-
236
-
237
- //フルパスからファイル名のみを取り出す関数
238
-
239
- private string GetFileNameString(string filePath, char separateChar)
240
-
241
- {
242
-
243
- try
244
-
245
- {
246
-
247
- string[] strArray = filePath.Split(separateChar);
248
-
249
- return strArray[strArray.Length - 1];
250
-
251
- }
252
-
253
- catch
254
-
255
- { return ""; }
256
-
257
- }
258
-
259
- */
260
-
261
- private void pictureBox1_DragDrop(object sender, DragEventArgs e)
262
-
263
- {
264
-
265
- string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
266
-
267
- for (int i = 0; i < files.Length; i++)
268
-
269
- {
270
-
271
- string fileName = files[i];
272
-
273
- //textBox1.Text += fileName + "\r\n";
274
-
275
-
276
-
277
- string filename = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
278
-
279
- //Bitmap bitmap = null;
280
-
281
- bitmap = new Bitmap(filename);
282
-
283
-
284
-
285
- //表示方法をzoomにする
286
-
287
- pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
288
-
289
-
290
-
291
- pictureBox1.Image = bitmap;
292
-
293
-
294
-
295
- }
296
-
297
- }
298
-
299
-
300
-
301
- private void pictureBox1_DragEnter(object sender, DragEventArgs e)
302
-
303
- {
304
-
305
- if (e.Data.GetDataPresent(DataFormats.FileDrop))
306
-
307
- e.Effect = DragDropEffects.Copy;
308
-
309
- }
310
-
311
-
312
-
313
-
314
-
315
- //以下はForm2から
316
-
317
- private void GetRegion(Point p1, Point p2, ref Point start, ref Point end)
318
-
319
- {
320
-
321
- start.X = Math.Min(p1.X, p2.X);
322
-
323
- start.Y = Math.Min(p1.Y, p2.Y);
324
-
325
-
326
-
327
- end.X = Math.Max(p1.X, p2.X);
328
-
329
- end.Y = Math.Max(p1.Y, p2.Y);
330
-
331
- }
332
-
333
-
334
-
335
- private int GetLength(int start, int end)
336
-
337
- {
338
-
339
- return Math.Abs(start - end);
340
-
341
- }
342
-
343
-
344
-
345
- private void DrawRegion(Point start, Point end)
346
-
347
- {
348
-
349
- Pen blackPen = new Pen(Color.Black);
350
-
351
- Console.WriteLine(bmp);
352
-
353
- Console.WriteLine(bitmap);
354
-
355
- if (bitmap != null)
356
-
357
- {
358
-
359
- Graphics g = Graphics.FromImage(bitmap);
360
-
361
-
362
-
363
- // 描画する線を点線に設定
364
-
365
- blackPen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
366
-
367
-
368
-
369
- // 画面を消去
370
-
371
- g.Clear(SystemColors.Control);
372
-
373
-
374
-
375
- // 領域を描画
376
-
377
- g.DrawRectangle(blackPen, start.X, start.Y, GetLength(start.X, end.X), GetLength(start.Y, end.Y));
378
-
379
-
380
-
381
- g.Dispose();
382
-
383
- }
384
-
385
- }
386
-
387
-
388
-
389
- private void pictureBox2_MouseDown(object sender, MouseEventArgs e)
390
-
391
- {
392
-
393
- // 描画フラグON
394
-
395
- view = true;
396
-
397
- //pictureBox2.BackColor = Color.Transparent;
398
-
399
-
400
-
401
- // Mouseを押した座標を記録
402
-
403
- MD.X = e.X;
404
-
405
- MD.Y = e.Y;
406
-
407
- }
408
-
409
-
410
-
411
- private void pictureBox2_MouseMove(object sender, MouseEventArgs e)
412
-
413
- {
414
-
415
- Point p = new Point();
357
+
358
+
359
+ // カーソルが示している場所の座標を取得
360
+
361
+ p.X = e.X;
362
+
363
+ p.Y = e.Y;
364
+
365
+
366
+
367
+ // 座標ら(X,Y)座標を計算
368
+
369
+ GetRegion(MD, p, ref start, ref end);
370
+
371
+
372
+
373
+ // 領域を描画
374
+
375
+ DrawRegion(start, end);
376
+
377
+
378
+
379
+ //backの画像表示方法指定
380
+
381
+ pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
382
+
383
+ //初めにとっておいた背景bitmapを表示
384
+
385
+ pictureBox1.BackgroundImage = backgroundBitmap;
386
+
387
+ //bitmapの透過
388
+
389
+ offscreenBitmap.MakeTransparent();
390
+
391
+
392
+
393
+ //Imageを表示
394
+
395
+ pictureBox1.Image = offscreenBitmap;
396
+
397
+ }
398
+
399
+
400
+
401
+ private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
402
+
403
+ {
404
+
405
+
416
406
 
417
407
  Point start = new Point();
418
408
 
419
409
  Point end = new Point();
420
410
 
421
- //BackColor = Color.Transparent;
411
+
422
-
423
-
424
-
425
- // 描画フラグcheck
412
+
426
-
427
- if (view == false)
413
+
428
-
429
- {
414
+
430
-
431
- return;
432
-
433
- }
434
-
435
-
436
-
437
- // カーソルが示ている場所の座標を取得
415
+ // Mouseを離座標を記録
438
-
416
+
439
- p.X = e.X;
417
+ MU.X = e.X;
440
-
418
+
441
- p.Y = e.Y;
419
+ MU.Y = e.Y;
442
420
 
443
421
 
444
422
 
445
423
  // 座標から(X,Y)座標を計算
446
424
 
447
- GetRegion(MD, p, ref start, ref end);
425
+ GetRegion(MD, MU, ref start, ref end);
448
-
449
-
450
-
451
- //System.Diagnostics.Debug.WriteLine("Move ({0},{1})", e.X, e.Y);
452
426
 
453
427
 
454
428
 
@@ -460,50 +434,6 @@
460
434
 
461
435
  //PictureBox1に表示する
462
436
 
463
- pictureBox2.Image = bitmap;
464
-
465
- }
466
-
467
-
468
-
469
- private void pictureBox2_MouseUp(object sender, MouseEventArgs e)
470
-
471
- {
472
-
473
- Point start = new Point();
474
-
475
- Point end = new Point();
476
-
477
-
478
-
479
- // Mouseを離した座標を記録
480
-
481
- MU.X = e.X;
482
-
483
- MU.Y = e.Y;
484
-
485
-
486
-
487
- //System.Diagnostics.Debug.WriteLine("MouseUp({0},{1})->({2},{3})", MD.X, MD.Y, MU.X, MU.Y);
488
-
489
-
490
-
491
- // 座標から(X,Y)座標を計算
492
-
493
- GetRegion(MD, MU, ref start, ref end);
494
-
495
-
496
-
497
- // 領域を描画
498
-
499
- DrawRegion(start, end);
500
-
501
-
502
-
503
- //PictureBox1に表示する
504
-
505
- pictureBox2.Image = bmp;
506
-
507
437
 
508
438
 
509
439
  // 描画フラグOFF
@@ -518,98 +448,4 @@
518
448
 
519
449
  ```
520
450
 
521
-
522
-
523
-
524
-
525
-
526
-
527
-
528
-
529
-
530
-
531
-
532
-
533
- ### 試したこと
534
-
535
-
536
-
537
- paintイベントの中にgraphics含め描画のメソッドを入れていくことも行いましたが、paintの外側にあるマウスダウンイベントなどの中でメソッド呼び込みをどうしたらよいかわからず、そもそもpaintイベントの中にマウスイベントじたいも入れ込まなければいけないのかいろいろなサイトや書籍(C#)を見てますが、解決できませんでした。
538
-
539
- 参考サイト:
540
-
541
- [PictureBoxに線が描けません。](https://teratail.com/questions/28653)
542
-
543
- [ラバーランドでのドラッグ範囲の切り抜き](https://teratail.com/questions/14079)
544
-
545
- [基本描画画像が消える](http://www110.kir.jp/csharp/chip0231.html)
546
-
547
- [イメージプロパティによくある勘違い](https://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html)
548
-
549
-
550
-
551
- pictureboxを2つ重ねて上側を透過trancerateをbackcolorを選択しても四角形描画が始まるとはじめの画像表示は消えてしまいました。
552
-
553
- あと試していない(できなかった)のはpictureboxを2つ作り、親子の関係にして上のを透過させる方法です。
554
-
555
- 最終的には四角形で切り抜き保存までを行いたいだけです。
556
-
557
- かなり苦戦しております。どなたかご教授頂けないでしょうか。
558
-
559
-
560
-
561
-
562
-
563
- ###その後試したこと
564
-
565
- 親子関係を作りpicturebox2の方を透過で四角を描けるようにしました。
566
-
567
- ```C#
568
-
569
- public Form1()
570
-
571
- {
572
-
573
- InitializeComponent();
574
-
575
- //プロパティの設定変更
576
-
577
- pictureBox1.AllowDrop = true;
578
-
579
- //描画先とするImageオブジェクトを作成する
580
-
581
- bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
582
-
583
-
584
-
585
- pictureBox2.BackColor = Color.Transparent;
586
-
587
- pictureBox2.Parent = pictureBox1;
588
-
589
- pictureBox2.Location = new Point(0, 0);
590
-
591
-
592
-
593
- }
594
-
595
- ```
596
-
597
-
598
-
599
- それでも画像の方は四角指定の際のD&Dで消えてしまいました。
600
-
601
-
602
-
603
- ###現状(令和元年6月6日)
604
-
605
- デザイン…picture1の上にあえてpicture2をずらして上に置いています。テストのため。
606
-
607
- ![イメージ説明](8b4ac5cabe0e8222cd161612132d5dfd.jpeg)
608
-
609
- ドラッグ中…はじめに置いた画像picture1がpicture2が出てきたことで上半分欠ける(子の透過ができていない)
610
-
611
- ![イメージ説明](2f221ae301b56fd6f1b947ae2e59e3a3.png)
451
+ ![イメージ説明](61ceb0c937c6b928bcf8a8b047a8c585.png)
612
-
613
- ドロップ後…四角形は最終的に目当てと違う場所に残ったが意図しない場所(picuture2だが座標がおかしい)
614
-
615
- ![イメージ説明](9fdc46f8e7710fa4f224f02f315ac27f.png)

4

現状報告のデザイン追記

2019/06/06 07:39

投稿

dendenmushi
dendenmushi

スコア98

test CHANGED
File without changes
test CHANGED
@@ -602,6 +602,10 @@
602
602
 
603
603
  ###現状(令和元年6月6日)
604
604
 
605
+ デザイン…picture1の上にあえてpicture2をずらして上に置いています。テストのため。
606
+
607
+ ![イメージ説明](8b4ac5cabe0e8222cd161612132d5dfd.jpeg)
608
+
605
609
  ドラッグ中…はじめに置いた画像picture1がpicture2が出てきたことで上半分欠ける(子の透過ができていない)
606
610
 
607
611
  ![イメージ説明](2f221ae301b56fd6f1b947ae2e59e3a3.png)

3

現状画像追加(元コード間違えあったのでpicture指定修正)

2019/06/05 21:38

投稿

dendenmushi
dendenmushi

スコア98

test CHANGED
File without changes
test CHANGED
@@ -100,7 +100,163 @@
100
100
 
101
101
  bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
102
102
 
103
+
104
+
105
+ pictureBox2.BackColor = Color.Transparent;
106
+
107
+ pictureBox2.Parent = pictureBox1;
108
+
109
+ pictureBox2.Location = new Point(0, 0);
110
+
111
+
112
+
103
- }
113
+ }
114
+
115
+ /*
116
+
117
+ private void textBox1_DragDrop(object sender, DragEventArgs e)
118
+
119
+ {
120
+
121
+ string[] dlagFilePathArray = (string[])e.Data.GetData(DataFormats.FileDrop, false);
122
+
123
+
124
+
125
+ //複数のファイルがドラックされた場合、パスが配列として取得されるが、
126
+
127
+ //今回のアプリケーションは TextBox が 1 つしかないため、先頭の
128
+
129
+ //ファイルのみを扱う
130
+
131
+ string filePath = dlagFilePathArray[0];
132
+
133
+
134
+
135
+ //ファイルがテキスト形式でオープン可能なものかどうか確認
136
+
137
+ if (CheckFileType(filePath))
138
+
139
+ {
140
+
141
+ //ファイルの内容を TextBox にロード
142
+
143
+ textBox1.Text = File.ReadAllText(filePath, Encoding.Default);
144
+
145
+
146
+
147
+ //フォームのタイトル部分にファイル名を表示
148
+
149
+ this.Text = GetFileNameString(filePath, '\');
150
+
151
+ editFilePath = filePath;
152
+
153
+ setDirty(false);
154
+
155
+
156
+
157
+ }
158
+
159
+
160
+
161
+
162
+
163
+ }*/
164
+
165
+ /*
166
+
167
+ private void setDirty(bool flag)
168
+
169
+ {
170
+
171
+ dirtyFlag = flag;
172
+
173
+ //読み取り専用でファイルがオープンされている場合、
174
+
175
+ //[上書き(&S)] メニューアイテムは常に無効
176
+
177
+ //menuSave.Enabled = (readOnlyFlag) ? false : flag;
178
+
179
+ }
180
+
181
+
182
+
183
+ //ドロップファイルがオープン可能なものであるかどうかをチェックする関数
184
+
185
+ private bool CheckFileType(string filePath)
186
+
187
+ {
188
+
189
+ //読み込みを許可するファイルの拡張子を指定 (app.config に定義した方が本当は便利)
190
+
191
+ string[] extnArray = { "txt", "cs", "vb", "htm", "html", "xml", "csv", "js", "vbs", "wsh" };
192
+
193
+ foreach (string extn in extnArray)
194
+
195
+ {
196
+
197
+ int dotLen = extn.Length;
198
+
199
+ if (extn == filePath.Substring(filePath.Length - dotLen, dotLen))
200
+
201
+ {
202
+
203
+ return true;
204
+
205
+ }
206
+
207
+ }
208
+
209
+ return false;
210
+
211
+ }
212
+
213
+
214
+
215
+ private void textBox1_DragEnter(object sender, DragEventArgs e)
216
+
217
+ {
218
+
219
+ //ドラッグされたのがファイルであるか確認
220
+
221
+ if (e.Data.GetDataPresent(DataFormats.FileDrop))
222
+
223
+ //ドラッグされたデータを受け取る
224
+
225
+ e.Effect = DragDropEffects.All;
226
+
227
+ else
228
+
229
+ //ドラッグされたデータを受け取らない
230
+
231
+ e.Effect = DragDropEffects.None;
232
+
233
+ }
234
+
235
+
236
+
237
+ //フルパスからファイル名のみを取り出す関数
238
+
239
+ private string GetFileNameString(string filePath, char separateChar)
240
+
241
+ {
242
+
243
+ try
244
+
245
+ {
246
+
247
+ string[] strArray = filePath.Split(separateChar);
248
+
249
+ return strArray[strArray.Length - 1];
250
+
251
+ }
252
+
253
+ catch
254
+
255
+ { return ""; }
256
+
257
+ }
258
+
259
+ */
104
260
 
105
261
  private void pictureBox1_DragDrop(object sender, DragEventArgs e)
106
262
 
@@ -238,6 +394,8 @@
238
394
 
239
395
  view = true;
240
396
 
397
+ //pictureBox2.BackColor = Color.Transparent;
398
+
241
399
 
242
400
 
243
401
  // Mouseを押した座標を記録
@@ -302,7 +460,7 @@
302
460
 
303
461
  //PictureBox1に表示する
304
462
 
305
- pictureBox1.Image = bmp;
463
+ pictureBox2.Image = bitmap;
306
464
 
307
465
  }
308
466
 
@@ -344,7 +502,7 @@
344
502
 
345
503
  //PictureBox1に表示する
346
504
 
347
- pictureBox1.Image = bmp;
505
+ pictureBox2.Image = bmp;
348
506
 
349
507
 
350
508
 
@@ -439,3 +597,15 @@
439
597
 
440
598
 
441
599
  それでも画像の方は四角指定の際のD&Dで消えてしまいました。
600
+
601
+
602
+
603
+ ###現状(令和元年6月6日)
604
+
605
+ ドラッグ中…はじめに置いた画像picture1がpicture2が出てきたことで上半分欠ける(子の透過ができていない)
606
+
607
+ ![イメージ説明](2f221ae301b56fd6f1b947ae2e59e3a3.png)
608
+
609
+ ドロップ後…四角形は最終的に目当てと違う場所に残ったが意図しない場所(picuture2だが座標がおかしい)
610
+
611
+ ![イメージ説明](9fdc46f8e7710fa4f224f02f315ac27f.png)

2

現状ソースコードの修正と追加挑戦内容の追記

2019/06/05 21:36

投稿

dendenmushi
dendenmushi

スコア98

test CHANGED
File without changes
test CHANGED
@@ -60,6 +60,8 @@
60
60
 
61
61
  {
62
62
 
63
+
64
+
63
65
  private string editFilePath = "";
64
66
 
65
67
  private bool dirtyFlag = false;
@@ -98,11 +100,7 @@
98
100
 
99
101
  bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
100
102
 
101
-
102
-
103
- }
103
+ }
104
-
105
-
106
104
 
107
105
  private void pictureBox1_DragDrop(object sender, DragEventArgs e)
108
106
 
@@ -156,6 +154,10 @@
156
154
 
157
155
 
158
156
 
157
+
158
+
159
+ //以下はForm2から
160
+
159
161
  private void GetRegion(Point p1, Point p2, ref Point start, ref Point end)
160
162
 
161
163
  {
@@ -222,19 +224,13 @@
222
224
 
223
225
  g.Dispose();
224
226
 
225
-
226
-
227
- //最後表示
228
-
229
- pictureBox1.Image = bitmap;
230
-
231
227
  }
232
228
 
233
229
  }
234
230
 
235
231
 
236
232
 
237
- private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
233
+ private void pictureBox2_MouseDown(object sender, MouseEventArgs e)
238
234
 
239
235
  {
240
236
 
@@ -254,7 +250,7 @@
254
250
 
255
251
 
256
252
 
257
- private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
253
+ private void pictureBox2_MouseMove(object sender, MouseEventArgs e)
258
254
 
259
255
  {
260
256
 
@@ -312,7 +308,7 @@
312
308
 
313
309
 
314
310
 
315
- private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
311
+ private void pictureBox2_MouseUp(object sender, MouseEventArgs e)
316
312
 
317
313
  {
318
314
 
@@ -358,22 +354,10 @@
358
354
 
359
355
  }
360
356
 
361
-
362
-
363
- private void pictureBox1_Paint(object sender, PaintEventArgs e)
364
-
365
- {
366
-
367
-
368
-
369
- }
370
-
371
357
  }
372
358
 
373
359
  }
374
360
 
375
-
376
-
377
361
  ```
378
362
 
379
363
 
@@ -413,3 +397,45 @@
413
397
  最終的には四角形で切り抜き保存までを行いたいだけです。
414
398
 
415
399
  かなり苦戦しております。どなたかご教授頂けないでしょうか。
400
+
401
+
402
+
403
+
404
+
405
+ ###その後試したこと
406
+
407
+ 親子関係を作りpicturebox2の方を透過で四角を描けるようにしました。
408
+
409
+ ```C#
410
+
411
+ public Form1()
412
+
413
+ {
414
+
415
+ InitializeComponent();
416
+
417
+ //プロパティの設定変更
418
+
419
+ pictureBox1.AllowDrop = true;
420
+
421
+ //描画先とするImageオブジェクトを作成する
422
+
423
+ bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
424
+
425
+
426
+
427
+ pictureBox2.BackColor = Color.Transparent;
428
+
429
+ pictureBox2.Parent = pictureBox1;
430
+
431
+ pictureBox2.Location = new Point(0, 0);
432
+
433
+
434
+
435
+ }
436
+
437
+ ```
438
+
439
+
440
+
441
+ それでも画像の方は四角指定の際のD&Dで消えてしまいました。

1

試そうとしてできなかったこと追記

2019/06/05 14:12

投稿

dendenmushi
dendenmushi

スコア98

test CHANGED
File without changes
test CHANGED
@@ -408,6 +408,8 @@
408
408
 
409
409
  pictureboxを2つ重ねて上側を透過trancerateをbackcolorを選択しても四角形描画が始まるとはじめの画像表示は消えてしまいました。
410
410
 
411
+ あと試していない(できなかった)のはpictureboxを2つ作り、親子の関係にして上のを透過させる方法です。
412
+
411
413
  最終的には四角形で切り抜き保存までを行いたいだけです。
412
414
 
413
415
  かなり苦戦しております。どなたかご教授頂けないでしょうか。