//string imgurl에서 다운받아와 이미지를 얻어낸다. //그리고 flyingbox의 x 위치, y 위치가 생성 위치에 영향을 준다. public static void addDatas(ILwin.ShowScreen showscreen, WebItem thisitem, string imgurl, int box_posX, int box_posY) { //download image from url via internet thisitem.xPos = box_posX; thisitem.yPos = box_posY; //image(BitmapImage)를 URL로부터 얻어온다. thisitem.img = HTMLhandler.downloadImageFromURL(imgurl); thisitem.imgBr = new ImageBrush(thisitem.img); //********freezable 문제가 발생. 이미지 리소스에 freeze를 시행해 주자! thisitem.img.Freeze(); thisitem.imgBr.Freeze(); //이제 이미지를 연결하고 화면에 나타나도록 하여라 showscreen.getMWinReference().Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { thisitem.imgrec.Width = thisitem.img.Width; thisitem.imgrec.Height = thisitem.img.Height; //이미지의 가로나 세로가 100보다 큰 게 있다면 그 부분은 100으로 줄인다. if (thisitem.imgrec.Width > 100) thisitem.imgrec.Width = 100; if (thisitem.imgrec.Height > 100) thisitem.imgrec.Height = 100; thisitem.imgrec.Margin = new Thickness(thisitem.xPos, thisitem.yPos, thisitem.imgrec.Margin.Right, thisitem.imgrec.Margin.Bottom); thisitem.imgrec.Fill = thisitem.imgBr; thisitem.imgrec.Visibility = Visibility.Visible; //이제 표시한다. })); //************************************// System.Drawing.Bitmap abit; using(MemoryStream outStream = new MemoryStream()) { BitmapEncoder enc = new BmpBitmapEncoder(); enc.Frames.Add(BitmapFrame.Create(thisitem.img)); enc.Save(outStream); System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(outStream); abit = new System.Drawing.Bitmap(bitmap); } abit.Save("temimg.png"); }
//webImage를 생성한다. 단, 더 생성 가능한지만 확인하고, 가능하다면 스레드를 돌린다. public void generateWebImage(string query, int num) { if(MWin.getDatasReference().webItems.Count + num > Constants.MAX_WEB_ITEMS ) { MWin.getTextboxReference().printMSG(MWin.responseMsgs, "최대 Web Item 개수를 넘는다. 안돼"); return; } if(doingWebitem == true) { MWin.getTextboxReference().printMSG(MWin.responseMsgs, "지금은 Web Item을 떨어뜨리는 중이다.."); return; } //떨어뜨리는 도중에는 doingwebitem을 true로 하여 중복되지 않게 하자. doingWebitem = true; //이미지들을 생성하기 전, 현존하는 webitems의 수를 가져온다. int startCount = MWin.getDatasReference().webItems.Count; MWin.getTextboxReference().printMSG(MWin.responseMsgs, "startCount : " + startCount); //num 개수만큼 webitem을 추가한 뒤, startCount와 num을 이용해 그것들을 참조해나갈 것이다. for (int i = 0; i < num; i++) { WebItem wb = new WebItem(this, rnd.Next(350, 371)); MWin.getDatasReference().webItems.Add(wb); MWin.getTextboxReference().printMSG(MWin.responseMsgs, "added " + i + " webitem"); } //만일 3개의 이미지를 요청했고, startCount가 2라면, 현재 2개의 item이 존재하며, webimagelist (2) (3) (4)를 만드는 것이다. Thread thr = new Thread(() => generateWebImageThread(MWin.getDatasReference(), flyingbox, query, startCount, num, this)); thr.Start(); }
//이제 그 이미지를 화면에 표시하고, 아래로 추락시키는 스레드를 연결시킨다. public static void fallingItem(ILwin.ShowScreen showscreen, WebItem thisitem, bool isFinal) { int item_y = 0; while (true) { //현재 webitem의 margin top 값을 가져온다 showscreen.getMWinReference().Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { item_y = (int)thisitem.imgrec.Margin.Top; })); Thread.Sleep(50); if (item_y > thisitem.FallYpos) { break; } else { showscreen.getMWinReference().Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate { thisitem.imgrec.Margin = new Thickness(thisitem.imgrec.Margin.Left, thisitem.imgrec.Margin.Top + 8, thisitem.imgrec.Margin.Right, thisitem.imgrec.Margin.Bottom); })); } } //마지막 webitem이라면 다 떨어질때까지 더 webitem을 호출하지 못하도록 블록을 시킨 걸 해제한다. if (isFinal == true) { showscreen.doingWebitem = false; //박스 이미지를 일반 이미지로 바꾼다. flyingBox.changeImg(showscreen.getFlyingboxReference(), showscreen.getMWinReference(), false); } }