因這學期選修了.net,而這門課每個實驗跟綜合性實驗沒什麼不一樣,都得作成一個應用程序。昨晚寫完了這個實驗的報告就順便貼上來了。html
首先上幾個截圖:ide
程序運行主窗口:函數
雙擊縮略圖以後建立圖片查看器:ui
1. 順時針、逆時針:this
實際大小(容許使用鼠標拖拽):
屏幕截圖:
選定區域指針
雙擊區域彈出保存窗口:orm
縮略圖核心代碼:
- private void ThreadProcSafe(object arg)
- {
- this.CreateMyListView((string[])arg);
- }
- private void CreateMyListView(string[] arg)
- {
- if (listView1 == null)
- return;
- if (this.listView1.InvokeRequired)
- {
- this.Invoke(new CreateMyListViewCallback(this.CreateMyListView), new object[] { arg });
- }
- else
- {
- string[] path = arg;
- listView1.View = View.LargeIcon;
- listView1.Items.Clear();
- ImageList p_w_picpathListLarge = new ImageList();
- listView1.LargeImageList = p_w_picpathListLarge;
- p_w_picpathListLarge.ImageSize = new System.Drawing.Size(120, 112);
- this.Cursor = Cursors.WaitCursor;
- for (int i = 0; i < path.Length; i++)
- {
- try
- {
- p_w_picpathListLarge.Images.Add(System.Drawing.Image.FromFile(path[i]));
- this.listView1.Items.Add(path[i], i);
- }
- catch { }
- }
- this.Cursor = Cursors.AppStarting;
- }
- }
拖拽功能實現核心代碼:
- private void moveRepaint(myPoint po)
- {
- Graphics g = this.pictureBox1.CreateGraphics();
- int width = this.pictureBox1.Width;
- int height = this.pictureBox1.Height;
- Rectangle destPara = new Rectangle(pic.getActual().Width, pic.getActual().Height, width, height);
- // Create rectangle for source p_w_picpath.
- Rectangle srcRect = new Rectangle(po.x, po.y, width, height);
- GraphicsUnit units = GraphicsUnit.Pixel;
- g.DrawImage(this.pictureBox1 .Image, destPara, srcRect, units);
- }
- private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
- {
- if (e.Button == MouseButtons.Left&&!flag)
- {
- mouseDown = true;
- mousePoint.x = e.X;
- mousePoint.y = e.Y;
- }
- }
- private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
- {
- if (mouseDown)
- {
- sft.x = mousePoint.x - e.X;
- sft.y = mousePoint.y - e.Y;
- this.moveRepaint(pic.getChange(sft));
- }
- }
- private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
- {
- if (!flag)
- {
- mouseDown = false;
- sft.x = mousePoint.x - e.X;
- sft.y = mousePoint.y - e.Y;
- pic.setLocalPoin(pic.getChange(sft));
- }
- }
幻燈片功能實現核心代碼:
- public partial class PowerPoint : Form
- {
- private Bitmap myBitmap;
- int index = 0;
- string[] files;
- public PowerPoint(string[] files)
- {
- this.files = files;
- InitializeComponent();
- this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
- this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
- this.TopMost = true ;
- this.timer1.Enabled = true;
- }
- private void timer2_Tick(object sender, EventArgs e)
- {
- ThreadStart threadStart = new ThreadStart(showPicture);
- Thread thread = new Thread(threadStart);
- thread.Start();
- }
- public void showPicture()
- {
- if (this.index < files.Length)
- {
- myBitmap = new Bitmap(files[this.index]);
- if (this.pictureBox1.Image != null) this.pictureBox1.Image.Dispose();
- this.pictureBox1.Image = myBitmap;
- this.index++;
- }
- else
- this.index=0;
- }
- private void Form_Click(object sender, EventArgs e)
- {
- this.Close();
- }
- }
屏幕截圖實現核心代碼:
- void catcher_DoubleClick(object sender, EventArgs e)
- {
- this.catcher.TransparencyKey = this.BackColor;
- Bitmap bmpCatched = new Bitmap(this.catcher.Width, this.catcher.Height);
- Graphics g = Graphics.FromImage(bmpCatched);
- Point locat = new Point(this.catcher.Location.X);
- g.CopyFromScreen(this.catcher.Location, new Point(0, 0), this.catcher.ClientRectangle.Size, CopyPixelOperation.SourceCopy);
- //Clipboard.SetImage(bmpCatched);
- this.saveFileDialog1 = new SaveFileDialog();
- saveFileDialog1.Filter = "Image File(*.jpg;)|*.jpg;|Image File(*.bmp;)|*.bmp;";
- saveFileDialog1.ShowDialog();
- //If the file name is not an empty string open it for saving.
- if (saveFileDialog1.FileName != "")
- {
- System.IO.FileStream fs =
- (System.IO.FileStream)saveFileDialog1.OpenFile();
- switch (saveFileDialog1.FilterIndex)
- {
- case 1:
- bmpCatched.Save(fs,
- System.Drawing.Imaging.ImageFormat.Jpeg);
- break;
- case 2:
- bmpCatched.Save(fs,
- System.Drawing.Imaging.ImageFormat.Bmp);
- break;
- }
- fs.Close();
- }
- this.catcher.Close();
- g.Dispose();
- this.catcher.Dispose();
- this.Close();
- }
部分功能實現思路:
1. 圖片查看窗口中「實際大小」的功能經過使用Graphics.DrawImage(Image, destRectangle, srcRectangle, GraphicsUnit)的這個重載方法實現,destRectangle是肯定畫布的大小,裏面能夠自定義畫布起始的座標,長度和寬度;srcRectangle定義的是須要繪製的原圖片的哪個部分,裏面有起始的座標和圖片的長度和寬度。
2. 在按下「實際大小」按鈕以後,若是圖片實際的分辨率比屏幕的分辨率大,則能夠對圖片進行拖拽,圖片默認顯示從(0,0)座標開始到pictureBox的長和寬大小的部分。當進入能夠拖拽的的pictureBox的區域,鼠標的指針會變成一個hand的形狀,離開後恢復。
3. 幻燈片的功能經過新建一個沒有邊界,不顯示狀態欄圖標的窗口完成,整個效果如同全屏顯示圖片。新建的窗口包含一個timer,裏面設定Interval爲1500,每過1500毫秒顯示下一張圖片,圖片是循環顯示的,經過鼠標點擊結束幻燈片的播放。
4. 屏幕截圖功能實現思路:
a) 首先新建一個沒有邊界,不顯示狀態欄圖標的窗口formback。
b) 把formback的邊界設置爲系統窗口的邊界
c) 把formback的背景圖片設置爲系統當前狀態。獲取系統當前狀態的方式:經過使用Graphics.CopyFromScreen函數實現,起始位置(0,0),長度和寬度爲屏幕的大小。
d) 當鼠標左鍵按下時新建另外一個窗口,一個沒有邊界沒有狀態欄圖標的窗口formcatcher。經過鼠標的移動,不斷改變窗口的大小,當鼠標左鍵鬆開,formcatcher最終生成。鼠標滑過的地方有一層乳白色的半透明窗口,雙擊formcatcher,把窗體透明區域的顏色設置成爲徹底透明。
e) 再次使用Graphics.CopyFromScreen函數,截取由formcatcher選中的區域。彈出保存文件的窗口,填寫文件名,保存文件。
遺憾的是還剩下一些Bug沒有解決,那就是在圖片查看窗口中,當圖片通過旋轉操做以後若是再使用「實際大小」的拖拽功能,圖片能夠被拖出圖片窗口外面,緣由很簡單,由於重畫的時候大小依然按照旋轉前的圖片的大小。
最後,須要說明的是這個程序中主窗口的系統文件樹是在原始版是在下面這個地址找到的,後面我進行了一些改動:
http://www.cnblogs.com/peterzb/archive/2009/06/08/1499131.html
裏面對treeView進行了很詳盡的講解。
還有,屏幕截圖功能的實現是在下面地址中的qq截屏軟件的基礎上進行改進的:
http://www.cnblogs.com/zhouyinhui/archive/2006/06/27/437017.html
很是感謝上面的兩位
由於實驗尚未提交評分,因此程序的源碼就先不上,先上一個程序的運行版,源代碼後面會補上
今天修復了上面所說的bug,從新上傳運行的程序
最後,上傳上源碼,由於後面沒有時間作,不少bug沒有調,但願多多包涵