Я хочу нарисовать текст в плагине NPAPI CGContextRef, но я не знаю, чтобы он работал. я получаю CGContext реф следующим образом:Как нарисовать текст в плагине NPAPI CGContextRef?
int16_t NPP_HandleEvent(NPP instance, void* event)
{
int16_t iRet = 0;
PluginObject *obj = (PluginObject *)instance->pdata;
NPCocoaEvent *cocoaEvent = (NPCocoaEvent *)event;
switch(cocoaEvent->type)
{
case NPCocoaEventDrawRect:
obj->m_NPContext = CGContextRetain(cocoaEvent->data.draw.context);
DrawSealOnContext(obj->m_NPContext, obj->m_pstSealAPInfo);
iRet = 1;
break;
default:
iRet = 0;
break;
}
return iRet;
}
В функции DrawSealOnContext, я хочу, чтобы нарисовать эллипс и текст в окне. следующая функция:
int DrawSealOnContext(CGContextRef contextRef, PSEAL_APPEARANCE_INFO pstSealAPInfo)
{
// draw ellipses
CGRect rect = {2, 25, 146, 100};
CGContextSetLineWidth(contextRef, 4.0);
CGContextSetStrokeColorWithColor(contextRef, [NSColor blueColor].CGColor);
CGContextBeginPath(contextRef);
CGContextAddEllipseInRect(contextRef, rect);
CGContextDrawPath(contextRef, kCGPathStroke);
// draw text
CGContextSetFillColorWithColor(contextRef, [NSColor blueColor].CGColor);
NSMutableParagraphStyle * paragraphStyle = [[[NSParagraphStyle defaultParagraphStyle] mutableCopy] autorelease];
[paragraphStyle setAlignment:NSCenterTextAlignment];
NSDictionary * attributes = [NSDictionary dictionaryWithObject:paragraphStyle
forKey:NSParagraphStyleAttributeName];
NSString * mystr = @“hello\n and";
NSRect strFrame = { { 0, 0 }, { 150, 150 } };
[mystr drawInRect:strFrame withAttributes:attributes];
}
Я могу получить эллипс на экране, но текст не отображается?
Я также попробовать это:
// draw text
CGContextShowText(contextRef, "hello", 5);
Это не работает.
Что не так с моей программой, действительно оцените ваши ответы .
Хотя это не проблема с вашим кодом, обратите внимание, что вы должны * не * хранить контекст, так как вы находитесь в первом блоке кода. В комбинации моделей CG + Cocoa контекст, который вы даете, гарантируется только во время вызова HandleEvent, и он может меняться от вызова к вызову. Если вы попытаетесь использовать контекст, который вы сохранили в любое время после возвращения функции, поведение не определено. – smorgan
то как я могу нарисовать эллипс и текст в этом CGContext? поместить весь код в функцию: int16_t NPP_HandleEvent (экземпляр NPP, void * event)? – John
Я пробовал использовать текстовый код для ввода текста: int16_t NPP_HandleEvent (экземпляр NPP, событие void *), он тоже не работает. Может быть, что-то еще не так, или я не могу нарисовать текст непосредственно на CGContext таким образом? Я попытался использовать другую функцию: CGContextShowTextAtPoint (contextRef, 8, 72, «привет», 6), он работает. Но проблема в том, что эта функция не может привлечь китайских иероглифов, она не соответствует моим требованиям. – John