• VC中custom symbol的方法(For MO)制作带箭头的线


    关于如何用vc开放MO扩展符号库见“VC中custom symbol的方法(For MO)”一文。

    关键代码如下:
    public:
            CPen  g_hPen;
    // ICustomLine
            STDMETHOD(SetupDC)(LONG hDC, DOUBLE dpi, IDispatch * pBaseSym)
            {
                    CDC* pcdc = CDC::FromHandle((HDC)hDC);

            //CPen* g_hPen = CreatePen(pBaseSym->Style, pBaseSym->Size, pBaseSym->Color);

                    DISPID dispid;
                    DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
                    VARIANT FAR *PvarColor, *PvarSize;
                    CHAR *szMember = "Color";
                   
                    pBaseSym->GetIDsOfNames(IID_NULL, (OLECHAR FAR **) &szMember, 1,
                                                                    LOCALE_USER_DEFAULT, &dispid);

                    pBaseSym->Invoke(dispid,IID_NULL,LOCALE_USER_DEFAULT,
                                                     DISPATCH_PROPERTYGET,&dispparamsNoArgs,
                                                     PvarColor, NULL, NULL);
                   
                    szMember = "Size";
                   
                    pBaseSym->GetIDsOfNames(IID_NULL, (OLECHAR FAR **) &szMember, 1,
                                                                    LOCALE_USER_DEFAULT, &dispid);

                    pBaseSym->Invoke(dispid,IID_NULL,LOCALE_USER_DEFAULT,
                                                     DISPATCH_PROPERTYGET,&dispparamsNoArgs,
                                                     PvarSize, NULL, NULL);


                    g_hPen.CreatePen(PS_SOLID, PvarSize->decVal.wReserved, PvarColor->decVal.Lo64);
            m_oldPen =pcdc->SelectObject(&g_hPen);
                   
    //*/    m_oldPen =(CPen*)pcdc->SelectStockObject(BLACK_PEN);
                   
                    return S_OK;
            }
            STDMETHOD(ResetDC)(LONG hDC)
            {
                    CDC* pcdc = CDC::FromHandle((HDC)hDC);
                    CPen* temp = pcdc->SelectObject(m_oldPen);
                    temp->DeleteObject();
                    return S_OK;           
            }
            STDMETHOD(Draw)(LONG hDC, LONG * points, LONG * partCounts, LONG numParts)
            {

                    POINT * P=(POINT *)points;
                    POINT MiddlePoint,ToPoint1,ToPoint2;
                    DOUBLE slope,TempSlope;
                    MiddlePoint.x=P->x;
                    MiddlePoint.y=P->y;
                    P++;
                    if (P->x!=MiddlePoint.x){
                            slope=(DOUBLE)(P->y-MiddlePoint.y)/(P->x-MiddlePoint.x);
                            slope=atan(slope);
                    }
                    else{
                            if(MiddlePoint.y>P->y)
                                    slope=3.1415926/2.0;
                            else
                                    slope=3.1415926*3.0/2.0;
                    }
                    MiddlePoint.x=(MiddlePoint.x+P->x)/2;
                    MiddlePoint.y=(MiddlePoint.y+P->y)/2;
                   
                    //求箭头的一个终点
                    TempSlope=slope-inclination;
                    INT dx=(INT)(cos(TempSlope)*ArrowLEN);
                    INT dy=(INT)(sin(TempSlope)*ArrowLEN);
                    if(MiddlePoint.x<P->x){
                            ToPoint1.x=MiddlePoint.x-dx;
                            ToPoint1.y=MiddlePoint.y-dy;
                    }

                    else{
                            ToPoint1.x=MiddlePoint.x+dx;
                            ToPoint1.y=MiddlePoint.y+dy;
                    }

                    //求箭头的另外一个终点
                    TempSlope=slope+inclination;
                    dx=(INT)(cos(TempSlope)*ArrowLEN);
                    dy=(INT)(sin(TempSlope)*ArrowLEN);
                    if(MiddlePoint.x<P->x){
                            ToPoint2.x=MiddlePoint.x-dx;
                            ToPoint2.y=MiddlePoint.y-dy;
                    }

                    else{
                            ToPoint2.x=MiddlePoint.x+dx;
                            ToPoint2.y=MiddlePoint.y+dy;
                    }

                    CDC* pcdc=::CDC::FromHandle((HDC)hDC);
                    pcdc->MoveTo(ToPoint1);
                    pcdc->LineTo(MiddlePoint);
                    pcdc->LineTo(ToPoint2);
                    pcdc->PolyPolyline((POINT *)points,(DWORD *)partCounts,(int)numParts);

                    return S_OK;
            }

  • 相关阅读:
    scala学习之特质(trait)
    Android 使用finalBitmap实现缓存读取
    Android ActionBar以及menu的代码设置样式
    Android获取窗体信息的Util方法
    RelativeLayout用到的一些重要的属性:
    [转] Git SSH Key 生成步骤
    正则表达式
    面向对象
    数组
    顺序结构,循环结构
  • 原文地址:https://www.cnblogs.com/bgming/p/250952.html
Copyright © 2020-2023  润新知