Пример #1
0
        /// <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);
            }
        }
Пример #2
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);
            }
        }
Пример #3
0
        /// <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);
            }
        }