2012-07-03 6 views
3

그림 상자가 하나 있는데, 이름은 studPic입니다. 내가 얻고 자하는 것은 "shuffle"버튼을 클릭하면 자원에서 임의의 이미지를 얻는 것입니다.단추 클릭시 리소스의 임의의 그림을 임의로 클릭하십시오.

private void button2_Click(object sender, EventArgs e) 
     { 
...  
     } 

연구 후에 나는 C#을

http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvcs/thread/38d36fa4-1f5f-43e9-80f6-3c9a4edc7705/

난 초보자 ..이 결과를 달성하기 위해 쉬운 방법이 있나요 다음 발견했습니다? 예를 들어, 그림 이름을 추가하지 않고? 오류 메시지가 오류 1 '의 Properties.Resources'을 받고

UPDATE

List<string> pictureNames = new List<string>(); 
pictureNames.Add("1"); 
pictureNames.Add("2"); 
pictureNames.Add("3"); 
int randomPictureIndex = new Random().Next(0, pictureNames.Count); 
string randomPictureName = pictureNames[randomPictureIndex]; 
pictureNames.Remove(randomPictureName); 
Image img = Properties.Resources.randomPictureName; //erroor 
studPic.Image = img; 

은에 대한 정의를 포함하지 않는 'randomPictureName'

+0

자원은 무엇입니까? –

+0

@ChrisGessler 응용 프로그램의 자원 – heron

+0

@ChrisGessler가 업데이트되었습니다. 제발 봐 – heron

답변

3

나는이에 대한 시스템 리소스를 사용하지 않을 것입니다. 연결이 끊어진 소프트웨어의 파일 시스템만큼이나 유지 보수가 쉽지 않습니다.

이미지를 앱 폴더에 넣으세요. 이렇게하면 쉽게 업데이트/변경이 가능합니다. 할부 :

C:\Ninjas - app 
c:\Ninjas\images - images 

이러한 이미지를 보유하는 배열을 만듭니다.

string[] files = System.IO.Directory.GetFiles("c:\ninjas\images"); 

사진을 찍을 수 있도록 일부 필터를 GetFiles에 넣어야합니다.

이제 배열에서 임의의 위치를 ​​잡으십시오 (이미 임의의 숫자를 수행하는 방법을 알고있는 것으로 나타났습니다).

우리는 배열을 가지고 현실을 셔플하자 당신은 순차적으로 통과 할 수 있습니다 (방법보다 빠른 무작위에 따기 CPU가 당신을 사랑합니다.)

private string[] files; 
    private int currentIndex = 0; 

    private void initializeImages() 
    { 
     //Grab directories in your images directory 
     string appRoot = System.IO.Path.GetDirectoryName(Application.ExecutablePath); 
     files = System.IO.Directory.GetFiles(appRoot + @"\images"); 
     Random rnd = new Random(); 
     files = files.OrderBy(x => rnd.Next()).ToArray(); 
    } 


    private void setImage() 
    { 
     pictureBox1.ImageLocation = files[currentIndex]; 
    } 

    private void previousImage() 
    { 
     currentIndex = currentIndex > 0 ? currentIndex - 1 : 0; 
     setImage(); 
    } 

    private void nextImage() 
    { 
     currentIndex = currentIndex < files.Length - 1 ? currentIndex + 1 : files.Length - 1; 
     setImage(); 
    } 

몇 가지 :

  • 파일 경로를 하드 코딩하지 마십시오. 이 파일을 app.config 파일에 넣고 참조하십시오.
  • 매번 파일 배열을 실행할 필요가 없도록 전역 파일 배열을 넣을 수 있습니다.

당신이 사용자가이를 취소 할 때까지 나는 다음과 같은 것을 권 해드립니다 실행 슬라이드 쇼로 이것을 가지고 싶다면 :

  • 를 사용하여 이미지의 수를 증가시키는 방법을 호출하는 타이머 객체, 그림이 바뀝니다.
  • GUI에서 thread.sleep을 사용하지 마십시오. GUI를 일시 중지하므로 좋은 점이 아닙니다.

당신이 이전/다음 버튼을 추가 할 경우, 다음 이미지 일부 설정은

1

을 설정하는 코드를 호출 감소 글로벌 인덱스를 증가시킬 수있다 (예를 들어 currentIndex을)/있어야합니다 당신의 부분에 관여하지만, 반대자는 대부분 옳다. 이는 프로덕션 응용 프로그램을위한 매우 효과적인 솔루션은 아닙니다.즉, 나는 이것이 당신이 수많은 사람들에게 배포하는 것이라는 것을 의심합니다. 그래서 이것을 학문적 연습으로 부를 것입니다. 단순히 응용 프로그램에 리소스를 추가하고 "ImageResource"(모든 이름이 할 것입니다.)라는 이름을 지정하고 이미지를 추가하면 다음 코드를 사용할 수 있습니다 (해당 UI 요소가 있다고 가정).

먼저 리소스에서 비트 맵을 추출하는 함수를 만듭니다. 마지막으로

private void RandomizePicture() 
{ 
    Bitmap[] images = GetResourceImages(); 
    if (images == null || images.Length == 0) 
    { 
     //Nothing to do here... 
     return; 
    } 

    int maxValue = images.Length; 
    Random r = new Random(); 
    int idx = r.Next(maxValue); 
    this.uxStupidPic.Image = images[idx]; 
} 

버튼 클릭에 그 함수를 호출 :

private void btnRandmoize_Click(object sender, EventArgs e) 
{ 
    this.RandomizePicture(); 
} 

그리고 짜잔

private Bitmap[] GetResourceImages() 
{ 
    PropertyInfo[] props = typeof(ImageResource).GetProperties(BindingFlags.NonPublic | BindingFlags.Static); 
    var images = props.Where(prop => prop.PropertyType == typeof(Bitmap)).Select(prop => prop.GetValue(null, null) as Bitmap).ToArray(); 

    return images; 
} 

둘째, 우리는 사용 가능한 이미지를 기반으로 이미지를 무작위로하는 함수를 만들 , 자원 파일에서 무작위 이미지. 해피 코딩!

EDIT : 임의 리소스 파일 대신 응용 프로그램 리소스를 사용하고 있다고 말한 것으로 나타났습니다. "ImageResource"를 GetResourceImages의 "Properties.Resources"로 바꾸기 만하면 비즈니스를 시작할 수 있습니다.

0

나는 Ryan Ternier의 대답이 매우 간단하고 우아하고, 나는 그와 비슷한 해결책을 게시 할 예정이었다. 라인이하지 않는 이유

난 그냥 작동 안/이유에 대해 언급 할 :

이미지 IMG = Properties.Resources.randomPictureName을;

  1. 속성 리소스가 실제 이름 자체가 아니라 "randomPictureName"이라는 리소스를 찾고 있기 때문입니까?
  2. Properties.Resources 개체의 작동 방식은 런타임에 코드 컴파일 후 솔루션 속성의 모든 리소스를 찾습니다. 당신이 리소스에 존재하지 않는 정적 변수를 전달하려고 시도하기 때문에 원하는 방식으로 작동하지 않을 것입니다. 따라서 try/catch 문을 사용하여 메서드를 래핑해야합니다.

http://msdn.microsoft.com/en-us/library/7k989cfy(v=vs.80).aspx

관련 문제