Cerúleo Master


Registrado: 04 Ago 2003Mensajes: 332Ubicación: Santander, España
|
Publicado: Dom 27 Ago, 2006 12:38 pm Asunto: Problemas con CreateFontIndirect |
|
|
Hola a todos.
Tengo un función para el dibujado de unos "símbolos de pórtico" en la que hago uso de la creación de una fuente inclinada. Lo que hago es crear una fuente con el ángulo de inclinación elegido, así como el tamaño escogido. Para que después de la función siga utilizando la fuente predeterminada en el canvas, lo que hago es guardar el handle de la misma y luego recargarlo. Sin embargo, la función falla cuando [PP->nEcPl>1]. En este caso no se restaura la letra, ésta aparece horizontal, pero con un tamaño muy pequeño. Y cuando [PP->nEcPl=1] sí funciona. Os pongo el código completo de la función con la esperanza de que me podáis echar una mano, aunque sea al cuello.
| Código: | //-----------------------------------------------------------------------------------
//********** DIBUJA EL SÍMBOLO DEL PÓRTICO ***********
//-----------------------------------------------------------------------------------
void OJPOCad::DibSimPortico(const OModelo *Md,int p){
ShowMessage("Dibujando símbolo de pórtico...");
int i,j,k,Lon,Alt;
double Tam=0.5,m,Alfa,dx,dy,di;
OPlanoPT *PP;
Punto2d Pm;
Punto3d U,V,T,vP[4];
HFONT hFontIni=SelectObject(Canvas->Handle,Canvas->Font->Handle);
PP=Md->LisPlanosPr->ValorObj(vPlAc[p]+1);
Canvas->Pen->Color=Colores[clSimPort];
//*********** Barro los planos del pórtico ***********
for(i=0;i<PP->nEcPl;i++){
if(PP->EcPl[i]->B==0.0){ //* Recta vertical
U.x=0.0;
U.y=1.0;
}
else{ //* Recta oblicua u horizontal
U.x=1.0;
U.y=-PP->EcPl[i]->A/PP->EcPl[i]->B*U.x;
m=Modulo(U);
U.x/=m;
U.y/=m;
}
U.z=0;
U*=Tam;
V.x=V.y=0.0;
V.z=Tam;
//***** Dibujo un cuadrado en los extremos 1 y 2 *****
···
//***** Dibujo el texto entre los extremos 1 y 2 *****
U=PP->E1[i];
V=PP->E2[i];
U=PVista->Proyecta(U);
U.x=Xins+floor(Esc*(U.x-Xmin));
U.y=Yins-floor(Esc*(U.y-Ymin));
V=PVista->Proyecta(V);
V.x=Xins+floor(Esc*(V.x-Xmin));
V.y=Yins-floor(Esc*(V.y-Ymin));
Pm.x=(U.x+V.x)/2;
Pm.y=(U.y+V.y)/2;
dx=V.x-U.x;
dy=V.y-U.y;
di=sqrt(dx*dx+dy*dy);
Alfa=ArcoTan(dx,dy)*57.29577951;
if(dx<0.0&&dy>=0.0)
Alfa+=180;
else if(dx<0.0&&dy<=0.0)
Alfa-=180;
CreaFuenteInclinada(12,Alfa-90);
Lon=Canvas->TextWidth(AnsiString(PP->Nombre));
Alt=Canvas->TextHeight(AnsiString(PP->Nombre));
Pm.x=int(Pm.x-Lon*dx/di/2.0-(Alt+2)*sin(0.01745329252*(Alfa-90)));
Pm.y=int(Pm.y-Lon*dy/di/2.0-(Alt+2)*cos(0.01745329252*(Alfa-90)));
Canvas->Brush->Style=bsClear;
Canvas->Font->Handle=CreateFontIndirect(&LFont);
Canvas->Font->Color=Colores[clSimPort];
Canvas->TextOut(Pm.x,Pm.y,AnsiString(PP->Nombre));
DeleteObject(&LFont);
}
Canvas->Font->Handle=SelectObject(Canvas->Handle,hFontIni);
}
//-----------------------------------------------------------------------------------
//******** DIBUJA LOS SÍMBOLOS DE LOS PÓRTICO ********
//-----------------------------------------------------------------------------------
void OJPOCad::DibSimPorticos(const OModelo *Md){
if(VarEstado->PrefeVer->VerPlanos!=vpInactivo) //* Plano destacado o activo
if(Md->BNudPlan==eNEPlaPortico&&Md->BElePlan==eNEPlaPortico)
for(int i=0;i<nPlAc;i++)
DibSimPortico(Md,i);
} | Un saludo a todos. _________________ Nunca digas "Es imposible" sin intentarlo antes. |
|