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));
DrawText изменение текста
Прошу помочь с возникшими вопросами:
1) Как этого избежать?
2) как изменить цвет текста?
3) Как изменить размер и шрифт текстта?
MFC не использую. Вон на всякий случай некоторый код:
Код:
Код:
// 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));
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
Код:
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));
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) лучше сохранить в переменную ;)
Цитата: 0nni
А зачем птчи для такой задачи нужны?
Я вот так всю жизнь делаю.
А через патчи можно залить текст текстурой например.
да, и GetDC(hWndButton) лучше сохранить в переменную ;)
Код:
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));
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) лучше сохранить в переменную " меня спасла = )
И еще небольшой вопрос... BN_CLICKED это когда кликнули, а когда навели какое сообщение никак немогу найти?
или фокус? WM_SETFOCUS.
Да мышь... А можно подробней про это если несложно...
Если обойтись без субклассига, создаешь таймер SetTimer и находишь окно под мышью функцией WindowFromPoint() сравниваешь с предыдущим вызовом если они разные, то мышь перешла с окна на окно.
У меня была идея по координаттам проверять) но помоему это хренова
да, интервал 50-100 будет вполне прилично.
Спасибо... щас попробую...
Код:
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);
}
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);
}
Создавай таймер в WM_CREATE и уничтожай с WM_DESTROY окна.
Ну и еще вас может заинтересует ф-ия _TrackMouseEvent()
Windows не перестает меня удивлять. Догадывался ведь что есть способ красивее.