No need to do Owner Draw, you can just use <-- this will not work if the window has a pattern background, we need to subclass the static control and use the transparent background mode while drawing the text:SetWindowText()
and handle the WM_CTLCOLORSTATIC message, see the code in this SO Answer
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ MSG msg;
WNDCLASS w;
hInst = hInstance;
memset(&w,0,sizeof(WNDCLASS));
w.style = CS_HREDRAW | CS_VREDRAW;
w.lpfnWndProc = WndProc;
w.hInstance = hInst;
w.hbrBackground = CreateHatchBrush(HS_DIAGCROSS, RGB(255, 0, 0));
w.lpszClassName = L"My Class";
w.hCursor = LoadCursor(NULL, IDC_ARROW);
RegisterClass(&w);
HWND hWndWindow = CreateWindow(L"My Class", L"My title", WS_OVERLAPPEDWINDOW, 300, 200, 800, 600, NULL, NULL, hInst, NULL);
ShowWindow(hWndWindow, nCmdShow);
UpdateWindow(hWndWindow);
while(GetMessage(&msg, NULL, 0, 0))
{ TranslateMessage(&msg);
DispatchMessage(&msg);
}
DeleteObject(w.hbrBackground);
return msg.wParam;
}
WNDPROC StaticWndProc = NULL;
TCHAR szText[] = _T("TestString");
LRESULT CALLBACK MyStaticWndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{ if (Message == WM_PAINT)
{ RECT rc;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rc);
SetBkMode(hdc, TRANSPARENT);
DrawText(hdc, szText, _tcslen(szText), &rc, DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
}
//v2 StaticWndProc(hwnd, Message, wparam, lparam);
return CallWindowProc(StaticWndProc, hwnd, Message, wparam, lparam); //v2
}
HWND hWndStatic; //v2
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{ switch (Message)
{ case WM_CREATE:
{ LRESULT lRes = DefWindowProc(hwnd, Message, wparam, lparam);
hWndStatic = CreateWindowEx(0, L"Static", NULL, WS_CHILD| WS_VISIBLE |SS_LEFT, 10, 130, 200, 40, hwnd, NULL, hInst, NULL); //v2 deleted HWND
StaticWndProc = (WNDPROC) SetWindowLong(hWndStatic, GWL_WNDPROC, (LPARAM)MyStaticWndProc);
return lRes;
}
case WM_DESTROY:
SetWindowLong(hWndStatic, GWL_WNDPROC, (LPARAM)StaticWndProc); //v2
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, Message, wparam, lparam);
}
return 0;
}