zoukankan      html  css  js  c++  java
  • 如何使用Win32API绘制树

    一、这个已经有几年时间了,刚开始学习charlie的《windows程序设计》的时候做的。
    现在看来,代码很乱,虽然后来还整理过几次,现在这方面没什么兴趣了,有兴趣的可自由下载。

    二、绘制二叉树的伪代码

    int drawBinaryTree(BinaryTree bt){
        Queue main;
        Queue slave;
    
        mian.enQueue(head node of bt);
        while (!empty(main)){
            slave.clear();
    
            for each node in main{
                drawNode(node);
                slave.enQueue(sons of node);
            }
            
            main.clear();
            copy all nodes in slave ==> main;
        }
    
        return 0;
    }

    三、一些数据结构

    ////////////////////////////////////////////////////////////////////////////////
    void init(int nElem);//初始化
    void push(int elem); //数据入栈auxBuffer
    int  StackEmpty();   //SeniorBuffer无数据则返回真值
    void copy(int *src, int *dest);//copy auxBuffer to SeniorBuffer
    void destroy();
    //绘制哈夫曼树时存储结点序号的栈,采用双缓冲结构
    typedef struct tagSTACK{
       int    * SeniorBuffer; //用于暂存结点序号
       int    sp1;        //元素个数
       int    * auxBuffer; //缓冲区
       int    sp2;        //缓冲区元素个数
       void ( *init )(int nElem);  //初始化
       void ( *push )(int elem);   //数据入栈auxBuffer
       int  ( *StackEmpty )();     //SeniorBuffer无数据则返回真值
       void ( *copy )(int *src, int *dest);//copy auxBuffer to SeniorBuffer
       void ( *destroy)();
    } STACK;

    函数指针,可以模仿C++成员函数调用语法,《面向对象软件构造》附录内也有有提到。

    四、绘制森林

    最开始的绘制效果结点多的时候容易碰撞,通过观察得出结论:绘制头节点时,手背要尽可能长,两背夹角应该尽可能大,越往下手背越短,夹角变小。
    不过过也不能一直变短变小,到一定程度可以固定下来。
    这样几百个节点也比最初效果好了。
    这段代码很琐碎,我自己都不想看。

    void PrepareForest(ForestDemension* _G_fd){
        _G_fd->MaxNodeNO = _G_fd->ForestWidth = _G_fd->ForestHeight = 0;
    }
    
    
    void EnumForestStructMember(PHuffmantreeNode ht, int NodeNO, ForestDemension* _G_fd){
        int node = NodeNO;
    
        _G_fd->rNodeNO = _G_fd->lNodeNO = 0;
        while( node && ht[node].lchild ) {_G_fd->lNodeNO++; node = ht[node].lchild;}
        node = NodeNO;
        while( node && ht[node].rchild ) {_G_fd->rNodeNO++; node = ht[node].rchild;}
    
        if (_G_fd->lNodeNO > _G_fd->MaxNodeNO) _G_fd->MaxNodeNO = _G_fd->lNodeNO;
        if (_G_fd->rNodeNO > _G_fd->MaxNodeNO) _G_fd->MaxNodeNO = _G_fd->rNodeNO;
    }
    
    
    int GetTreeOrigX( ForestDemension *_G_fd ){
        double m = 0;
    
        if ( _G_fd->lNodeNO > -1 ) m = m + EDGE;
        if ( _G_fd->lNodeNO >  0 ) m = m +  138;
        if ( _G_fd->lNodeNO >  1 ) m = m +   56;
        if ( _G_fd->lNodeNO >  2 ) m = m +   26;
        if ( _G_fd->lNodeNO >  3 ) m = m + 13.7 * (_G_fd->lNodeNO-3);
        
        return (int)(m) + _G_fd->ForestWidth ;
    }
    
    
    void SetForestWidth( ForestDemension *_G_fd ){
        double m = 0;
    
        if ( _G_fd->lNodeNO > -1 ) m = m + EDGE;
        if ( _G_fd->lNodeNO >  0 ) m = m +  138;
        if ( _G_fd->lNodeNO >  1 ) m = m +   56;
        if ( _G_fd->lNodeNO >  2 ) m = m +   26;
        if ( _G_fd->lNodeNO >  3 ) m = m + 13.7 * (_G_fd->lNodeNO-3);
        
        if ( _G_fd->rNodeNO > -1 ) m = m + EDGE;
        if ( _G_fd->rNodeNO >  0 ) m = m +  138;
        if ( _G_fd->rNodeNO >  1 ) m = m +   56;
        if ( _G_fd->rNodeNO >  2 ) m = m +   26;
        if ( _G_fd->rNodeNO >  3 ) m = m + 13.7 * (_G_fd->lNodeNO-3);
        
        _G_fd->ForestWidth += (int)m;
    }
    
    
    void SetForestHeight( ForestDemension *_G_fd ){
        double m = 0.1*TREELENGTH;
        
        if ( _G_fd->MaxNodeNO < HIERARCHY ) _G_fd->MaxNodeNO = HIERARCHY;
        if ( _G_fd->MaxNodeNO > -1 ) m = m + 18*EDGE;
        if ( _G_fd->MaxNodeNO >  0 ) m = m + 80+EDGE;
        if ( _G_fd->MaxNodeNO >  1 ) m = m + 56+EDGE;
        if ( _G_fd->MaxNodeNO >  2 ) m = m + 46+EDGE;
        if ( _G_fd->MaxNodeNO >  3 ) m = m + (51+EDGE) * (_G_fd->MaxNodeNO-3);
    
        if ( (int)m > _G_fd->ForestHeight ) _G_fd->ForestHeight = (int)m;
    }

    五,代码打包地址:

    //http://ishare.iask.sina.com.cn/f/24162408.html

  • 相关阅读:
    Atitit.500 503 404错误处理最佳实践oak
    Atitit. 解决unterminated string literal 缺失引号
    Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制
    Atitit. Dwr 抛出异常error解决方案
    Atitit.js javascript异常处理机制与java异常的转换.js exception process Voae
    Atitit.软件gui按钮and面板---通讯子系统(区)-- github 的使用....
    atitit。gui 界面皮肤以及换肤总结 java .net c++
    atitit.软件开发GUI 布局管理优缺点总结java swing wpf web html c++ qt php asp.net winform
    atitit.报表最佳实践oae 与报表引擎选型
    Atitit. 软件---多媒体区---- jmf 2.1.1 Java Media Framework 支持的格式
  • 原文地址:https://www.cnblogs.com/servo/p/3377891.html
Copyright © 2011-2022 走看看