Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

DrawText изменение текста

45K
18 июня 2009 года
Make_It_Happen
21 / / 18.06.2009
Здраствуйте! Сделал кнопку с флагом BS_OWNERDRAW. Закрашиваю кнопку, далее вывожу текст. Кнопка то закрасилась, но проблема в том что когда вывожу текст через DrawText, некоторая область на которой находится текст закрашивается серым цветом...
Прошу помочь с возникшими вопросами:
1) Как этого избежать?
2) как изменить цвет текста?
3) Как изменить размер и шрифт текстта?

MFC не использую. Вон на всякий случай некоторый код:

 
Код:
RECT rc;
GetClientRect(hWndButton,&rc);
FillRect(GetDC(hWndButton),&rc,CreateSolidBrush(RGB(28,245,16)));
DrawText(GetDC(hWndButton),"Exit",-1,&rc,DT_CENTER | DT_NOCLIP | DT_SINGLELINE);
ReleaseDC(hWndButton,GetDC(hWndButton));
9.3K
19 июня 2009 года
iridum
175 / / 26.08.2007
Попробуй так применительно к кнопке только
Код:
// Obtain the window's client rectangle
GetClientRect(hwnd, &r);

// THE FIX: by setting the background mode
// to transparent, the region is the text itself
// SetBkMode(hdc, TRANSPARENT);

// Bracket begin a path
BeginPath(hdc);

// Send some text out into the world
TCHAR text[ ] = "Defenestration can be hazardous";
TextOut(hdc,r.left,r.top,text, ARRAYSIZE(text));

// Bracket end a path
EndPath(hdc);

// Derive a region from that path
SelectClipPath(hdc, RGN_AND);

// This generates the same result as SelectClipPath()
// SelectClipRgn(hdc, PathToRegion(hdc));

// Fill the region with grayness
FillRect(hdc, &r, GetStockObject(GRAY_BRUSH));


Это с msdn
http://msdn.microsoft.com/en-us/library/dd145133(VS.85).aspx

На странице есть ссылки на ответы по всем заданным вопросам, например касательно шрифта
http://msdn.microsoft.com/en-us/library/dd183499(VS.85).aspx
3.7K
19 июня 2009 года
0nni
326 / / 24.06.2008
А зачем птчи для такой задачи нужны?
 
Код:
RECT rc;
GetClientRect(hWndButton,&rc);
FillRect(GetDC(hWndButton),&rc,CreateSolidBrush(RGB(28,245,16)));
int TransparentMode = SetBkMode(GetDC(hWndButton), TRANSPARENT);
DrawText(GetDC(hWndButton),"Exit",-1,&rc,DT_CENTER | DT_NOCLIP | DT_SINGLELINE);
SetBkMode(GetDC(hWndButton), TransparentMode);
ReleaseDC(hWndButton,GetDC(hWndButton));

Я вот так всю жизнь делаю.
А через патчи можно залить текст текстурой например.
да, и GetDC(hWndButton) лучше сохранить в переменную ;)
45K
19 июня 2009 года
Make_It_Happen
21 / / 18.06.2009
Цитата: 0nni
А зачем птчи для такой задачи нужны?
 
Код:
RECT rc;
GetClientRect(hWndButton,&rc);
FillRect(GetDC(hWndButton),&rc,CreateSolidBrush(RGB(28,245,16)));
int TransparentMode = SetBkMode(GetDC(hWndButton), TRANSPARENT);
DrawText(GetDC(hWndButton),"Exit",-1,&rc,DT_CENTER | DT_NOCLIP | DT_SINGLELINE);
SetBkMode(GetDC(hWndButton), TransparentMode);
ReleaseDC(hWndButton,GetDC(hWndButton));

Я вот так всю жизнь делаю.
А через патчи можно залить текст текстурой например.
да, и GetDC(hWndButton) лучше сохранить в переменную ;)



Спасибо большое, теперь все окей... Я так пробовал сам делать но неполучалось, тут написал... Фраза "да, и GetDC(hWndButton) лучше сохранить в переменную " меня спасла = )

45K
19 июня 2009 года
Make_It_Happen
21 / / 18.06.2009
И еще небольшой вопрос... BN_CLICKED это когда кликнули, а когда навели какое сообщение никак немогу найти?
3.7K
19 июня 2009 года
0nni
326 / / 24.06.2008
когда навели что мышь? WM_MOUSEMOVE к которому прикручивается флаг и таймер.
или фокус? WM_SETFOCUS.
45K
19 июня 2009 года
Make_It_Happen
21 / / 18.06.2009
Да мышь... А можно подробней про это если несложно...
3.7K
19 июня 2009 года
0nni
326 / / 24.06.2008
Если обойтись без субклассига, создаешь таймер SetTimer и находишь окно под мышью функцией WindowFromPoint() сравниваешь с предыдущим вызовом если они разные, то мышь перешла с окна на окно.
45K
19 июня 2009 года
Make_It_Happen
21 / / 18.06.2009
С помощью таймера постоянно чтоли сравнивать? тоесть я создаю таймер и в WM_TIMER произвожу сравнение?

У меня была идея по координаттам проверять) но помоему это хренова
3.7K
19 июня 2009 года
0nni
326 / / 24.06.2008
да, интервал 50-100 будет вполне прилично.
45K
19 июня 2009 года
Make_It_Happen
21 / / 18.06.2009
Спасибо... щас попробую...
45K
19 июня 2009 года
Make_It_Happen
21 / / 18.06.2009
Вроде работает но кажется я гдето перемудрил) а Kill его на выходе тогда?

Код:
bool InButton;

LONG_PTR CALLBACK Timer(HWND hWnd,UINT uMsg, UINT idTimer, DWORD dwTime)
{
    switch(uMsg)
    {
    case WM_TIMER:
        POINT    point;
        HWND hTWnd;
        GetCursorPos(&point);
        hTWnd = WindowFromPoint(point);

        if(hTWnd != hWndButton)
            InButton=false;

        if (!InButton)
        {
            if(hTWnd == hWndButton)
            {
                InButton=true;
                FILE *stream;
                fopen_s(&stream, "VSLog.log", "at");
                fseek(stream,0L,SEEK_END);
                fprintf(stream,"Have MouseMoveToButton \n");
                fclose(stream);
            }
        }

        break;
    }
    return FALSE;
}

void OnMouseLeave(HWND hWnd, int x, int y, UINT uMsg)
{
    SetTimer(g_hWnd,1,100,(TIMERPROC)Timer);
}
3.7K
20 июня 2009 года
0nni
326 / / 24.06.2008
Создавай таймер в WM_CREATE и уничтожай с WM_DESTROY окна.
14
22 июня 2009 года
Phodopus
3.3K / / 19.06.2008
Ну и еще вас может заинтересует ф-ия _TrackMouseEvent()
3.7K
22 июня 2009 года
0nni
326 / / 24.06.2008
Windows не перестает меня удивлять. Догадывался ведь что есть способ красивее.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог