2011-06-16 1 views
2

J'essaie de trouver le moyen de convertir un point donné du système de coordonnées de base de la fenêtre en système de coordonnées d'écran. Je veux dire quelque chose comme - (NSPoint)convertBaseToScreen:(NSPoint)point.Conversion d'un point donné du système de coordonnées de base de la fenêtre au système de coordonnées de l'écran

Mais je le veux à partir de quartz/carbone.

J'ai CGContextRef et ses limites avec moi. Mais les limites sont par rapport à Window auquel appartient CGContextRef. Par exemple, si window est à l'emplacement (100, 100, 50, 50) par rapport à l'écran, contextRef for window serait (0,0, 50, 50). c'est-à-dire que je suis à l'emplacement (0,0) mais effectivement à l'écran je suis à (100,100). I

Toutes les suggestions sont appréciées.

Merci.

+0

Peut-on faire quelque chose avec le gestionnaire de fenêtres et les API d'accessibilité? – MacGeek

Répondre

0

la fenêtre maintient sa position dans l'espace de l'écran global et le typographe sait comment mettre au bon endroit dans l'espace de l'écran l'image de cette fenêtre. Le contexte lui-même, cependant, n'a pas de lieu.

Quartz Compositor sait où la fenêtre est positionnée sur l'écran, mais Quartz 2D ne sait rien de plus que la taille de la zone qu'il est censé dessiner. Il n'a aucune idée où Quartz Compositor va mettre le dessin une fois que c'est fait.

De même, lors de l'assemblage du contenu d'une fenêtre, les cadres fournissent le système de visualisation. Le système de vue permet au système d'exploitation de créer des contextes pour dessiner des parties individuelles d'une fenêtre et gère le placement des résultats du dessin dans ces vues, généralement en manipulant la transformation du contexte ou en créant des contextes temporaires hors écran. Le contexte lui-même, cependant, ne sait pas où le graphique final va être rendu.

-1

Je ne sais pas si vous pouvez utiliser directement CGContextRef, vous avez besoin de fenêtre ou de voir la référence ou quelque chose comme faire la conversion. Le code que j'utilise fait la souris convert opposé les coordonnées de (écran) global pour voir local et il va quelque chose comme ceci:

Point mouseLoc; // point you want to convert to global coordinates 
HIPoint where; // final coordinates 
PixMapHandle portPixMap; 
// portpixmap is needed to get correct offset otherwise y coord off at least by menu bar height 
portPixMap = portPixMap = GetPortPixMap(GetWindowPort(GetControlOwner(view))); 
QDGlobalToLocalPoint(GetWindowPort(GetControlOwner(view), &mouseLoc); 
where.x = mouseLoc.h - (**portPixMap).bounds.left; 
where.y = mouseLoc.v - (**portPixMap).bounds.top; 
HIViewConvertPoint(&where, NULL, view); 

donc je suppose que le contraire est nécessaire pour vous (n'avez pas testé si elle a effectivement fonctionne):

void convert_point_to_screen(HIView view, HIPoint *point) 
{ 
    Point point; // used for QD calls 
    PixMapHandle portPixMap = GetPortPixMap(GetWindowPort(GetControlOwner(view))); 

    HIViewConvertPoint(&where, view, NULL); // view local to window local coordtinates 

    point.h = where->x + (**portPixMap).bounds.left; 
    point.w = where->y + (**portPixMap).bounds.top; 

    QDLocalToGlobalPoint(GetWindowPort(GetControlOwner(view), &point); 

    // convert Point to HIPoint 
    where->x = point.h; 
    where->y = point.v; 
} 
Questions connexes