Если вы запрашиваете способ заставить окно перерисовать себя, используя API более низкого уровня, чем Какао, то, насколько я знаю, это невозможно.Окно перерисовывается, когда вызывается метод drawRect: метод его содержимого.Он передает CGContextRef в окно, которое метод затем использует для перерисовки окна.CoreGraphics не несет ответственности за перерисовку окна.Какао использует CoreGraphics для перерисовки окон.
Можно получить графический контекст окна вне drawRect: и затем рисовать к нему в любое время (см., Например, здесь ), но этозвучит как то, что вы действительно хотите сделать, это перехватить результаты обычной процедуры рисования окна и сделать некоторые свои собственные вещи сверху.Возможно, вы могли бы сделать это, переключив класс представления содержимого окна и переопределив drawRect.Вспомогательная функция для обработки инъекции выглядела бы примерно так:
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))
}
Редактировать:
Ааа, вас интересует все окно.Кадр и т. Д. Также являются экземплярами NSView, но они являются частными подклассами NSView, к которым у вас нет прямого доступа.Вы можете заставить их перерисовать, вызвав display
в окне, но это, вероятно, перезапишет все, что вы сделали с окном, так как оно будет использовать существующие процедуры рисования этих классов.
Так что вы можете такжехочу рассмотреть возможность использования drawRect: метод этих представлений (вызов [[NSGraphicsContext currentContext] graphicsPort] в drawRect: даст вам CGContextRef, который вы можете использовать с API-интерфейсами Quartz).Вы можете получить представление кадров, вызвав superview
в представлении содержимого окна.
Обратите внимание, что расположение представлений кадра окна не имеет документов и может изменяться при обновлении системы.
Звучит какво всяком случае, интересный проект!