2015-08-16 2 views
0

Я хочу нарисовать текст в плагине 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); 

Это не работает.

Что не так с моей программой, действительно оцените ваши ответы .

+0

Хотя это не проблема с вашим кодом, обратите внимание, что вы должны * не * хранить контекст, так как вы находитесь в первом блоке кода. В комбинации моделей CG + Cocoa контекст, который вы даете, гарантируется только во время вызова HandleEvent, и он может меняться от вызова к вызову. Если вы попытаетесь использовать контекст, который вы сохранили в любое время после возвращения функции, поведение не определено. – smorgan

+0

то как я могу нарисовать эллипс и текст в этом CGContext? поместить весь код в функцию: int16_t NPP_HandleEvent (экземпляр NPP, void * event)? – John

+0

Я пробовал использовать текстовый код для ввода текста: int16_t NPP_HandleEvent (экземпляр NPP, событие void *), он тоже не работает. Может быть, что-то еще не так, или я не могу нарисовать текст непосредственно на CGContext таким образом? Я попытался использовать другую функцию: CGContextShowTextAtPoint (contextRef, 8, 72, «привет», 6), он работает. Но проблема в том, что эта функция не может привлечь китайских иероглифов, она не соответствует моим требованиям. – John

ответ

0

меня решить эту проблему, с помощью этой статьи: http://www.cocoabuilder.com/archive/cocoa/240527-setting-cgcontextref-to-the-current-context.html Проблемы в том, что, функции теста

[mystr drawInRect:strFrame withAttributes:attributes]; 

ничьего в текущем контексте, но мой текущий не контекст «CGContextRef contextRef «Я уменьшился. Итак, прежде чем я использовал метод drawInRect, мне нужно установить contextRef мой текущий контекст. Как установить CGContextRef в текущий контекст, пожалуйста, обратитесь к прикрепленному веб-сайту. Надеюсь, что этот ответ может решить вашу проблему!

Смежные вопросы