2011-03-20 5 views
0

저는 스피너와 슬라이더에 설정된 축척으로 이미지를 그리는 빈 영역을 포함하는 폼이 있습니다. 이미지 경로는 양식이로드되고 변경되지 않을 때 만들어집니다. 현재 내가 이미지를 표시하려면이 같은 것을 사용하고 있습니다 :C++ 형식의 이미지 로딩이 더 빠릅니다.

void drawImages(void) 
    { 
     //... 

     clearImages(); 
     for each(String ^image in images) 
     { 
      box = gcnew PictureBox; 
      box->Name = "pictureBox" + i.ToString(); //Used when deleting. 
      // setting properties snipped 
      box->Image = Image::FromFile(image); 
      Controls->Add(box); 
     } 
    } 

을 그리고 여기에 청산 코드는 회 전자의 '값 변경'이벤트와 형태의 '크기 조정'이벤트에 유선의 :

void clearImages(void) 
    { 
     for(int i=0; i<images->Count; ++i) 
      Controls->RemoveByKey("pictureBox" + i.ToString()); 
    } 

문제는 사진을 다시로드하고 깜박일 때까지 오래 걸릴 수 있다는 것입니다. 저것을 고치는 방법 있는가? 내가 만들고 싶은 한 가지 개선점은 사용자가 회 전자에서 마우스를 들어 올릴 때마다 이미지를 다시 그리는 것입니다. 이미지가 변경 될 때마다 다시 그리지는 않습니다. 즉 슬라이더의 값에 따라 이미지의 다양한 매개 변수를 조정했다 당신이 시도 할 수 있습니다 몇 가지가 일단

+0

컨트롤을 제거하고 추가하기 때문에 깜박입니다. 이미지를 다시로드하기 때문에 시간이 오래 걸립니다. 이것은 폼의 크기를 조정할 때 수행하려는 작업이 아닙니다. 그림 상자의 크기를 조정하고 필요에 따라 다시 작성하지 마십시오. 회 전자가 무엇인지 전혀 모르겠습니다. –

+0

이미지의 크기를 설정하기위한 것입니다. 크기를 늘리면 이미지가 커지고 다른 레이아웃으로 다시 그려집니다. –

+0

예, 컨트롤의 크기를 조정하고 다시 작성하지 마십시오. Anchor 속성으로하기 쉽습니다. 전에 대신 OnPaint를 사용하여 언급 했습니까? –

답변

0

그래서 나는 응용 프로그램을 썼습니다.

먼저 이미지를 캐싱하십시오. 매번 메모리에서 검색하는 것보다 디스크에서로드하는 것이 훨씬 느립니다. 필요할 때만 디스크에서로드하십시오.

둘째, 추가하는 대신 그냥 필요에 따라 제어 (들)의 크기를 조정/이미지를 표시하고 이미지를 변경하기 위해 기존의 컨트롤을 사용하여 컨트롤을 제거하지 마십시오.

셋째, 디스플레이 논리를 이중 버퍼링하십시오. 어쨌든 한 번에 화면을 블리 팅하기 때문에이 경우 많은 도움이되지는 않지만 한번 시도해 볼 가치가 있습니다.

넷째, 대신 스피너의 값 변경 이벤트의 타이머를 사용할 수 있습니다. 사용자가 슬라이더를 끌면 타이머가 시작되고 타이머 틱 이벤트에서 논리를 수행합니다. 사용자가 슬라이더를 놓을 때 타이머를 멈 춥니 다. 이렇게하면 최대 업데이트 속도를 제어 할 수 있습니다.

은 결국 나는 GDI +가 조금 너무 느린 때문에 직접 내 이미지 조작을 수행하기 위해 이미지 데이터를 제대로했다. 다시 말하지만 픽셀 데이터를 실제로 변경하지 않으므로 비트 블록 전송 (blt)이 충분히 빠릅니다.

그 중 일부가 도움이되기를 바랍니다.

+0

컨트롤 만 유지하면 응용 프로그램이 처리해야하는 것보다 훨씬 큰 이미지로도 트릭을 만들 수 있습니다. –

+0

그래, 이러한 컨트롤을 생성, 추가 및 제거하는 것은 이와 같은 경우 비용이 많이 든다. 또한, 그들은 위의 기술 중 일부 (즉, 1과 3과 5)를 사용하므로 무료로 얻을 수 있습니다. –

관련 문제