Вывод текста в контекст усройства
От: -AdyOS-  
Дата: 18.11.05 07:25
Оценка:
Господа, всем привет!
Столкнулся с такой проблемкой. Ситуация следующая, приложение полностью написано на чистом АПИ, необходимо при выводе на экран строки менять для пары слов шрифт...Делаю так:



//в обработчике сообщений
....
    case WM_PAINT:
            {
                hdc = BeginPaint(hWnd, &ps);
                RECT rt;
                view.WriteFormattedText(hdc, rt);
                EndPaint(hWnd, &ps);
                ReleaseDC(hWnd, hdc);
            }
            break;
.....
///далее в функции view.WriteFormattedText(hdc, rt)
    while((nLine < m_stView.m_nMaxLinesOnPage/* + m_stView.m_nCurrTopLine*/) 
        && (nLine + m_stView.m_nCurrTopLine < m_stView.m_nTotalLines))
    {
        strLine = m_vecLines[m_stView.m_nCurrTopLine + nLine];
    //  TextOut(hDC, 0, nLineHeight * nLine, strLine.c_str(), strLine.length());
        nRet = PrintText(strLine, hDC, nLineHeight * nLine, nRet, bFlag);
        nLine++;
    }

//ну и функция PrintText(strLine, hDC, nLineHeight * nLine, nRet, bFlag)
int CMyView::PrintText(string strLine, HDC hDC, int nLine, int nLastCount, BOOL& bFlag)
{
    int     nBreaks = 0;//nLastCount;
    int     nPos = 0;
    BOOL    bSmall = bFlag;

    string tmp, str;
    char * chToken;

    char chDel[] = " ";

    if(strLine.empty())
        return 0;

    chToken = strtok((char *)strLine.c_str(), chDel);
    if(strcmp(chToken, strLine.c_str()))
    {
        while(NULL != chToken)  
        {
            nBreaks++;
            str += chToken;
            str += ' ';
            
            if(nBreaks == 2)
            {
                
                HFONT hFont = SelectFont(hDC, m_stFont.m_hBigFont);
                
                if(hFont == m_stFont.m_hBigFont )
                    SelectFont(hDC, m_stFont.m_hSmallFont);
                
                TextOut(hDC, 0, nLine, str.c_str(), str.length());
                
                
                nBreaks = 0;
                str = "";
            }
            chToken = strtok(NULL, chDel);
        }
    }
    else// (nBreaks >= 0 &&  nBreaks < 2)
    {
        HFONT hFont = SelectFont(hDC, m_stFont.m_hBigFont);
        
        if(hFont == m_stFont.m_hBigFont )
            SelectFont(hDC, m_stFont.m_hSmallFont);
        TextOut(hDC, 0, nLine, strLine.c_str(), strLine.length());
    }

    return 0; // - all is OK
}


Ситуации возникают разные — то вообще текст не выводиться мелким фонтом, то выводиться вся строка. Такое ощущение возникает, что шрифт не успевает меняться. Вот собственно и вся трабла. Жду ваших предложений, господа
Re: Вывод текста в контекст усройства
От: Pavel Dvorkin Россия  
Дата: 18.11.05 07:43
Оценка:
Здравствуйте, -AdyOS-, Вы писали:

AOS> HFONT hFont = SelectFont(hDC, m_stFont.m_hBigFont);


AOS> if(hFont == m_stFont.m_hBigFont )

AOS> SelectFont(hDC, m_stFont.m_hSmallFont);


Как я понимаю, тебя интересует, какой шрифт сейчас в контексте ? Убери эту странную проверку и используй GetCurrentObject.

HFONT hCurFont = GetCurrentObject(hDC, OBJ_FONT);
if(hFont == m_stFont.m_hBigFont )
SelectFont(hDC, m_stFont.m_hSmallFont);
With best regards
Pavel Dvorkin
Re[2]: Вывод текста в контекст усройства
От: -AdyOS-  
Дата: 18.11.05 07:58
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:


PD>Как я понимаю, тебя интересует, какой шрифт сейчас в контексте ?

И да и нет. В данный момент проблема все равно в другом — для пары фраз фонт не меняется почему-то. В TextOut должна выводится как раз пара слов, но не выходит

PD> Убери эту странную проверку и используй GetCurrentObject.


PD> HFONT hCurFont = GetCurrentObject(hDC, OBJ_FONT);

PD> if(hFont == m_stFont.m_hBigFont )
PD> SelectFont(hDC, m_stFont.m_hSmallFont);
Re[3]: Вывод текста в контекст усройства
От: Pavel Dvorkin Россия  
Дата: 18.11.05 09:33
Оценка:
Здравствуйте, -AdyOS-, Вы писали:

AOS>Здравствуйте, Pavel Dvorkin, Вы писали:



PD>>Как я понимаю, тебя интересует, какой шрифт сейчас в контексте ?

AOS>И да и нет. В данный момент проблема все равно в другом — для пары фраз фонт не меняется почему-то. В TextOut должна выводится как раз пара слов, но не выходит

У тебя логика невнятная. Ты выбираешь новый шрифт для того. чтобы проверить, какой текущий, потом выбираешь другой, если надо. Измени на то, что я посоветовал и проверь, что будет.
With best regards
Pavel Dvorkin
Re[4]: Вывод текста в контекст усройства
От: -AdyOS-  
Дата: 18.11.05 09:42
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:


PD>У тебя логика невнятная. Ты выбираешь новый шрифт для того. чтобы проверить, какой текущий, потом выбираешь другой, если надо. Измени на то, что я посоветовал и проверь, что будет.


Сделал я так — ситуация осталась таже.
Re: Вывод текста в контекст усройства
От: Timeo  
Дата: 18.11.05 09:48
Оценка:
Здравствуйте, -AdyOS-, Вы писали:

AOS>Господа, всем привет!

AOS>Столкнулся с такой проблемкой. Ситуация следующая, приложение полностью написано на чистом АПИ, необходимо при выводе на экран строки менять для пары слов шрифт...Делаю так:

AOS>
AOS> ...
AOS>

AOS>Ситуации возникают разные — то вообще текст не выводиться мелким фонтом, то выводиться вся строка. Такое ощущение возникает, что шрифт не успевает меняться. Вот собственно и вся трабла. Жду ваших предложений, господа

Вообще трудно до конца разобраться без работающего примера.
Вот, пока, глянь на такой примерчик, это чем-нибудь похоже на то, что ты пытаешься сделать?:

void myWriteFormattedText ( HDC inHDc, RECT * rc )
{
    static char * s_Line [] = 
    {
        "Mary had a little lamb",
        "Its fleece was white as snow",
        "And everywhere Mary went",
        "The lamb was sure to go",
        0
    };
    for(int nLine=0;s_Line[nLine];nLine++)
    {    
        myPrintText(inHDc,rc,s_Line[nLine],nLine*64,nLine,nLine*2);
    }
}

int myPrintText ( HDC inHDc, RECT * inRc, char * inLine, int inY, int inStartSmall, int inNumSmall )
{
    HFONT _oldFont;
    RECT rc;

    _oldFont = (HFONT)SelectObject(inHDc,theBigFont);
    SetRect(&rc,inRc->left,inRc->top+inY,inRc->left,inRc->bottom);
    DrawTextEx(inHDc,inLine,inStartSmall,&rc,DT_LEFT|DT_TOP|DT_NOPREFIX|DT_SINGLELINE|DT_CALCRECT,0);
    DrawTextEx(inHDc,inLine,inStartSmall,&rc,DT_LEFT|DT_TOP|DT_NOPREFIX|DT_SINGLELINE,0);

    SelectObject(inHDc,theSmallFont);
    SetRect(&rc,rc.right,inRc->top+inY,rc.right,inRc->bottom);
    DrawTextEx(inHDc,inLine+inStartSmall,inNumSmall,&rc,DT_LEFT|DT_TOP|DT_NOPREFIX|DT_SINGLELINE|DT_CALCRECT,0);
    DrawTextEx(inHDc,inLine+inStartSmall,inNumSmall,&rc,DT_LEFT|DT_TOP|DT_NOPREFIX|DT_SINGLELINE,0);

    SelectObject(inHDc,theBigFont);
    SetRect(&rc,rc.right,inRc->top+inY,rc.right,inRc->bottom);
    DrawTextEx(inHDc,inLine+inStartSmall+inNumSmall,strlen(inLine+inStartSmall+inNumSmall),&rc,DT_LEFT|DT_TOP|DT_NOPREFIX|DT_SINGLELINE|DT_NOCLIP,0);

    SelectObject(inHDc,_oldFont);

    return 0;
}
Re: Вывод текста в контекст усройства
От: Аноним  
Дата: 18.11.05 10:03
Оценка: +1
case WM_PAINT:
{
...
EndPaint(hWnd, &ps);
ReleaseDC(hWnd, hdc); <--это зачем?
}
Здравствуйте, -AdyOS-, Вы писали:

AOS>Господа, всем привет!

AOS>Столкнулся с такой проблемкой. Ситуация следующая, приложение полностью написано на чистом АПИ, необходимо при выводе на экран строки менять для пары слов шрифт...Делаю так:

AOS>


AOS>//в обработчике сообщений
AOS>....
AOS>    case WM_PAINT:
AOS>            {
AOS>                hdc = BeginPaint(hWnd, &ps);
AOS>                RECT rt;
AOS>                view.WriteFormattedText(hdc, rt);
AOS>                EndPaint(hWnd, &ps);
AOS>                ReleaseDC(hWnd, hdc);
AOS>            }
AOS>            break;
AOS>.....
AOS>///далее в функции view.WriteFormattedText(hdc, rt)
AOS>    while((nLine < m_stView.m_nMaxLinesOnPage/* + m_stView.m_nCurrTopLine*/) 
AOS>        && (nLine + m_stView.m_nCurrTopLine < m_stView.m_nTotalLines))
AOS>    {
AOS>        strLine = m_vecLines[m_stView.m_nCurrTopLine + nLine];
AOS>    //  TextOut(hDC, 0, nLineHeight * nLine, strLine.c_str(), strLine.length());
AOS>        nRet = PrintText(strLine, hDC, nLineHeight * nLine, nRet, bFlag);
AOS>        nLine++;
AOS>    }

AOS>//ну и функция PrintText(strLine, hDC, nLineHeight * nLine, nRet, bFlag)
AOS>int CMyView::PrintText(string strLine, HDC hDC, int nLine, int nLastCount, BOOL& bFlag)
AOS>{
AOS>    int     nBreaks = 0;//nLastCount;
AOS>    int     nPos = 0;
AOS>    BOOL    bSmall = bFlag;

AOS>    string tmp, str;
AOS>    char * chToken;

AOS>    char chDel[] = " ";

AOS>    if(strLine.empty())
AOS>        return 0;

AOS>    chToken = strtok((char *)strLine.c_str(), chDel);
AOS>    if(strcmp(chToken, strLine.c_str()))
AOS>    {
AOS>        while(NULL != chToken)  
AOS>        {
AOS>            nBreaks++;
AOS>            str += chToken;
AOS>            str += ' ';
            
AOS>            if(nBreaks == 2)
AOS>            {
                
AOS>                HFONT hFont = SelectFont(hDC, m_stFont.m_hBigFont);
                
AOS>                if(hFont == m_stFont.m_hBigFont )
AOS>                    SelectFont(hDC, m_stFont.m_hSmallFont);
                
AOS>                TextOut(hDC, 0, nLine, str.c_str(), str.length());
                
                
AOS>                nBreaks = 0;
AOS>                str = "";
AOS>            }
AOS>            chToken = strtok(NULL, chDel);
AOS>        }
AOS>    }
AOS>    else// (nBreaks >= 0 &&  nBreaks < 2)
AOS>    {
AOS>        HFONT hFont = SelectFont(hDC, m_stFont.m_hBigFont);
        
AOS>        if(hFont == m_stFont.m_hBigFont )
AOS>            SelectFont(hDC, m_stFont.m_hSmallFont);
AOS>        TextOut(hDC, 0, nLine, strLine.c_str(), strLine.length());
AOS>    }

AOS>    return 0; // - all is OK
AOS>}

AOS>


AOS>Ситуации возникают разные — то вообще текст не выводиться мелким фонтом, то выводиться вся строка. Такое ощущение возникает, что шрифт не успевает меняться. Вот собственно и вся трабла. Жду ваших предложений, господа
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.