/// <summary> /// 新しいインスタンスを構築する。 /// </summary> public IconViewControl() { selectedIndex = -1; iconSet = new IconSet(); iconSet.PropertyChanged += OnIconSetPropertyChanged; InitializeComponent(); }
/// <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="filePath">ファイルパス</param> private void SetNewIconImage(string filePath) { IconSet iconSet = iconViewControl.IconSet; using (Image image = ReadImage(filePath)) { iconSet.Image = (Image)(image.Clone()); // イメージがセットできたら最大数(=コンボボックス)を更新 int maxIconCount = iconSet.IconCount; comboBoxNumber.Items.Clear(); for (int i = 0; i < maxIconCount; i++) { string item = i.ToString(); comboBoxNumber.Items.Add(item); } // デフォルトを選択 if (comboBoxNumber.Items.Count > 0) { comboBoxNumber.SelectedIndex = 0; iconSetViewControl.SelectedIndex = 0; } // 有効・無効状態を更新する。 comboBoxNumber.Enabled = (comboBoxNumber.Items.Count > 0); } }
/// <summary> /// アイコン選択状態が変わった場合などに、コントロールの有効・無効を設定する。 /// </summary> private void UpdateControlEnables() { IconSet iconSet = iconSetViewControl.IconSet; // TODO: 有効・無効設定が必要なものをここに書く。 menuItemSave.Enabled = iconSet.IconCount > 0; menuItemSaveAs.Enabled = iconSet.IconCount > 0; buttonIconSave.Enabled = iconSetViewControl.SelectedIndex >= 0; buttonIconChange.Enabled = iconSetViewControl.SelectedIndex >= 0; }
/// <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> public IconSetViewControl() { iconSet = new IconSet(); iconSet.PropertyChanged += OnIconSetPropertyChanged; InitializeComponent(); }