문제

나는 약 30 개의 이미지의 imagelist와 3 개의 이미지가 특정 상태에있을 때 30 위에 오버레이 할 수 있기를 원합니다. C ++ TreeItem은 TVIS_Overlaymask와 함께이를 수행 할 수 있다는 것을 알고 있습니다.

SetItemState(hItem,INDEXTOOVERLAYMASK(nOverlayIndex), TVIS_OVERLAYMASK);

.NET에서 유사한 결과를 얻는 메커니즘이 있습니까?

도움이 되었습니까?

해결책

오버레이를 자동으로 수행하는 방법을 모르지만 소유자가 그린 트리 노드 로이 작업을 수행 할 수 있습니다.

다른 팁

나는이 질문이 여전히 견해를 얻고 있다는 것을 본다. 그래서 나는 David가 제안한 것의 구현을 게시 할 것이다.

internal class MyTree : TreeView
{
    internal MyTree() :
        base()
    {
        // let the tree know that we're going to be doing some owner drawing
        this.DrawMode = TreeViewDrawMode.OwnerDrawText;
        this.DrawNode += new DrawTreeNodeEventHandler(MyTree_DrawNode);
    }

    void MyTree_DrawNode(object sender, DrawTreeNodeEventArgs e)
    {
        // Do your own logic to determine what overlay image you want to use
        Image overlayImage = GetOverlayImage();

        // you have to move the X value left a bit, 
        // otherwise it will draw over your node text
        // I'm also adjusting to move the overlay down a bit
        e.Graphics.DrawImage(overlayImage,
            e.Node.Bounds.X - 15, e.Node.Bounds.Y + 4);

        // We're done! Draw the rest of the node normally
        e.DefaultDraw = true
    }
}

주문 오버레이로 이미지를 생성하지 않으므로 다음과 같은 소중한 CPU 사이클을 낭비 할 필요가 없습니다.http://madprops.org/blog/highlighting-treenodes-with-an-overlay-image/ :

private void InitializeLinkedTreeImages() 
{ 
    foreach (string key in treeImages.Images.Keys) 
    { 
        Bitmap bmp = new Bitmap(treeImages.Images[key]); 
        Graphics g = Graphics.FromImage(bmp); 
        g.DrawImageUnscaled(Properties.Resources.Linked16, 0, 0); 
        treeImages.Images.Add(key + "Linked", bmp); 
    } 
} 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top