Перемещение текстовой строки по углам временного окна
Нужно чтоб текстовая строка перемещалась по углам временного окна по часовой стрелке по таймеру. Вроде сделал, но когда увеличиваю размер шрифта тест вылазит за окно.
// --- Оконная функция временное окно
LRESULT CALLBACK PopupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
RECT rect;
GetWindowRect(hWnd, &rect);
HDC hDC;
TEXTMETRIC tm;
CHOOSEFONT cf;
HFONT oldhfont, hfont, hfontPrev;
static LOGFONT lf;
static int A = 0;
int cx, cy;
static int width, height;
static int x2 = rect.left;
static int y2 = rect.top;
static int x_offset, y_offset;
char szBuffer[256];
int len = 0;
static double time_1 = 500;
hDC = GetDC(hWnd);
GetTextMetrics(hDC, &tm);
switch (uMsg)
{
case WM_CREATE:
cx = GetSystemMetrics(SM_CXSCREEN);
cy = GetSystemMetrics(SM_CYSCREEN);
//создаём экземпляр LOGFONT
lf.lfCharSet = DEFAULT_CHARSET; //значение по умолчанию
lf.lfPitchAndFamily = DEFAULT_PITCH; //значения по умолчанию
strcpy_s(lf.lfFaceName, "Times New Roman"); //копируем в строку название шрифта
lf.lfHeight = 12; //высота
lf.lfWidth = 9; //ширина
lf.lfWeight = 40; //толщина
lf.lfEscapement = 0; //шрифт без поворота
x_offset = 0;
y_offset = 0;
break;
case WM_SIZE:
width = LOWORD(lParam);
height = HIWORD(lParam);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
hDC = GetDC(hWnd);
LoadString(hInst, IDC_HELLO, szBuffer, 6);
len = strlen(szBuffer);
hDC = BeginPaint(hWnd, &ps);
hfont = CreateFontIndirect(&lf);
SelectObject(hDC, hfont);
TextOut(hDC, x2, y2, szBuffer, len);
EndPaint(hWnd, &ps);
DeleteObject(hfont);
}
break;
case WM_TIMER:
GetTextMetrics(hDC, &tm);
x_offset = 6 * tm.tmMaxCharWidth;
y_offset = 6 * tm.tmHeight;
if (x2 == rect.right - x_offset && y2 == rect.bottom - y_offset)
{ x2 = rect.left;}
else if (x2 == rect.left && y2 == rect.bottom - y_offset)
{ y2 = rect.top;}
else if (x2 == rect.left && y2 == rect.top)
{ x2 = rect.right - x_offset;}
else if (x2 == rect.right - x_offset && y2 == rect.top)
{ y2 = rect.bottom - y_offset;}
InvalidateRect(hWnd, NULL, true);
break;
case WM_COMMAND:
{
UINT idItem = LOWORD(wParam);
switch (idItem)
{
case ID_ITEM1_2:
lf.lfHeight *= 2;
lf.lfWidth *= 2;
InvalidateRect(hWnd, NULL, true);
break;
case ID_ITEM2_2:
lf.lfHeight /= 2;
lf.lfWidth /= 2;
InvalidateRect(hWnd, NULL, true);
break;
case ID_ITEM3_2:
lf.lfHeight = 12;
lf.lfWidth = 9;
x2 = rect.left;
y2 = rect.top;
InvalidateRect(hWnd, NULL, true);
break;
case ID_ITEM4_2:
time_1 = time_1 / 2;
KillTimer(hWnd, TIMER_HALFSEC);
SetTimer(hWnd, TIMER_HALFSEC, time_1, NULL);
InvalidateRect(hWnd, NULL, true);
break;
case ID_ITEM5_2:
time_1 = time_1 * 2;
KillTimer(hWnd, TIMER_HALFSEC);
SetTimer(hWnd, TIMER_HALFSEC, time_1, NULL);
InvalidateRect(hWnd, NULL, true);
break;
case ID_ITEM6_2:
DestroyWindow(hWnd);
break;
case ID_MENU_POP:
HDC hdc;
hdc = GetDC(hWnd);
static DWORD rgbCurrent;
DWORD rgbPrev;
ZeroMemory(&cf, sizeof(CHOOSEFONT));
cf.lStructSize = sizeof(CHOOSEFONT);
cf.hwndOwner = hWnd;
cf.lpLogFont = &lf;
cf.rgbColors = rgbCurrent;
cf.Flags = CF_SCREENFONTS | CF_EFFECTS;
if (ChooseFont(&cf) == TRUE)
{
hfont = CreateFontIndirect(cf.lpLogFont);
hfontPrev = (HFONT)SelectObject(hdc, hfont);
rgbCurrent = cf.rgbColors;
rgbPrev = SetTextColor(hdc, rgbCurrent);
SelectObject(hDC, hfont);
DeleteObject(hfont);
}
InvalidateRect(hWnd, NULL, true);
break;
}
}
break;
case WM_DESTROY:
KillTimer(hWnd, TIMER_HALFSEC);
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
'''