/// <summary> /// アイコン保存ボタンがクリックされたときに通知を受け取る。 /// </summary> /// <param name="sender">送信元オブジェクト</param> /// <param name="e">イベントオブジェクト</param> private void OnButtonIconSaveClick(object sender, EventArgs e) { saveFileDialog.InitialDirectory = Settings.Default.DirectoryIcon; saveFileDialog.FileName = "icon.png"; if (saveFileDialog.ShowDialog(this) != DialogResult.OK) { return; } Settings.Default.DirectoryIcon = System.IO.Path.GetDirectoryName(saveFileDialog.FileName); try { string path = saveFileDialog.FileName; IconSet iconSet = iconSetViewControl.IconSet; Image originalImage = iconSet.Image; Rectangle region = iconSet.GetIconRegion(iconSetViewControl.SelectedIndex); using (Bitmap saveImage = new Bitmap(region.Width, region.Height, originalImage.PixelFormat)) { using (Graphics g = Graphics.FromImage(saveImage)) { g.DrawImage(originalImage, new Rectangle(0, 0, region.Width, region.Height), region, GraphicsUnit.Pixel); saveImage.Save(path); } } } catch (Exception ex) { MessageBox.Show(this, ex.Message, Resources.DialogTitleError); } }
/// <summary> /// アイコン変更ボタンがクリックされた時に通知を受け取る。 /// </summary> /// <param name="sender">送信元オブジェクト</param> /// <param name="e">イベントオブジェクト</param> private void OnButtonIconChangeClick(object sender, EventArgs e) { openFileDialog.InitialDirectory = Settings.Default.DirectoryIcon; openFileDialog.FileName = string.Empty; if (openFileDialog.ShowDialog(this) != DialogResult.OK) { return; } Settings.Default.DirectoryIcon = System.IO.Path.GetDirectoryName(openFileDialog.FileName); try { // Note: Graphicsでやろうとしたが、部分クリアの方法がうまくいかなかったため、 // ImageBufferを使用する実装に変更した。 // (FillRectで透過色設定はできなかった) IconSet iconSet = iconSetViewControl.IconSet; int selectedIndex = iconSetViewControl.SelectedIndex; string path = openFileDialog.FileName; using (Image srcImage = ReadImage(path)) { Rectangle region = iconSet.GetIconRegion(selectedIndex); // コピー先領域クリア var imageBuffer = CGenImaging.ImageBuffer.CreateFrom(iconSet.Image); for (int y = region.Top; y < region.Bottom; y++) { for (int x = region.Left; x < region.Right; x++) { imageBuffer.SetPixel(x, y, Color.Transparent); } } // アイコン描画 var srcImageBuffer = CGenImaging.ImageBuffer.CreateFrom(srcImage); int width = Math.Min(srcImageBuffer.Width, region.Width); int height = Math.Min(srcImageBuffer.Height, region.Height); int srcX = (srcImageBuffer.Width - width) / 2; int srcY = (srcImageBuffer.Height - height) / 2; int dstX = region.X + (region.Width - width) / 2; int dstY = region.Y + (region.Height - width) / 2; imageBuffer.WriteImage(srcImageBuffer, srcX, srcY, dstX, dstY, width, height); iconSet.Image = imageBuffer.GetImage(); // 再設定されたのでインデックス戻す。 iconSetViewControl.SelectedIndex = selectedIndex; } } catch (Exception ex) { MessageBox.Show(this, ex.Message, Resources.DialogTitleError); } }
/// <summary> /// 表示を更新する。 /// </summary> /// <param name="e">イベントオブジェクト</param> protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; // 表示対象がある場合、もりもり描画。 if ((iconSet.Image != null) && (selectedIndex >= 0) && (selectedIndex < iconSet.IconCount)) { // 表示元画像部分の座標を計算 Rectangle srcRect = iconSet.GetIconRegion(selectedIndex); // 表示先範囲の座標を計算 Rectangle dstRect = CalcIconDisplayRectangel(); // 描画 g.DrawImage(iconSet.Image, dstRect, srcRect, GraphicsUnit.Pixel); } }