Si está pidiendo una forma de forzar una ventana para volver a dibujarse usando una API de nivel inferior a la de Cocoa, entonces, que yo sepa, no es posible. Una ventana se redibuja cuando se llama al método drawRect: de su vista de contenido. Pasa un CGContextRef a la ventana, que luego el método utiliza para volver a dibujar la ventana. CoreGraphics no es responsable de volver a dibujar una ventana. Cocoa usa CoreGraphics para redibujar ventanas.
Es posible obtener graphicscontext de una ventana exterior de drawRect: (. Véase, por ejemplo, here) y luego dibujar a que siempre que lo desee, pero suena como lo que realmente desea hacer es interceptar los resultados de la rutina de dibujo ordinaria de la ventana y haz algunas de tus cosas en la parte superior. Probablemente puedas hacer esto cambiando la clase de la vista de contenido de la ventana y reemplazando drawRect.Una función auxiliar para manejar la inyección sería algo como esto:
typedef void (^InjectedBlock)(CGContextRef, CGRect);
void InjectIntoView(NSView* view, InjectedBlock aBlock)
{
Class viewClass = [view class];
InjectedBlock injectedBlock = [aBlock copy];
void(^drawRect)(id, SEL, NSRect) = ^(id self, SEL _cmd, NSRect rect)
{
struct objc_super superId = { self, viewClass };
objc_msgSendSuper(superId, @selector(drawRect:), rect);
injectedBlock([[NSGraphicsContext currentContext] graphicsPort], CGRectFromNSRect(rect));
};
NSString* subclassName = [NSString stringWithFormat:"%s_injected", class_getName(viewClass)]
Class subclass objc_allocateClassPair(viewClass, [subclassName UTF8String], 0);
objc_registerClassPair(subclass);
Method overriddenMethod = class_getInstanceMethod([NSView class], @selector(drawRect:));
IMP imp = imp_implementationWithBlock(drawRect);
class_addMethod(subclass, @selector(drawRect:), imp, method_getTypeEncoding(overriddenMethod))
}
Editar:
Ahhh, está interesado en toda la ventana. El marco, etc. también son instancias NSView, pero son subclases privadas de NSView a las que no tiene acceso directo. Puede obligarlos a volver a dibujar llamando al display
en la ventana, pero es probable que esto sobrescriba lo que haya hecho en la ventana, ya que utilizará las rutinas de dibujo existentes de estas clases.
Así que también es posible que desee plantear el método drawRect: estas vistas (la llamada a [[NSGraphicsContext currentContext] graphicsPort] en drawRect: le dará un CGContextRef que puede usar con las API de Quartz). Puede obtener las vistas de marco llamando al superview
en la vista de contenido de la ventana.
Tenga en cuenta que la disposición de las vistas de marco de la ventana no está documentada y podría cambiar con las actualizaciones del sistema.
¡Suena como un proyecto interesante, de todos modos!
¿Hay algo así como invalidateRect en Mac que obligue a redibujar las ventanas? – MacGeek