由之前彩色隨機矩形線條獲得啓發,今日學習文字輸出時,使用隨機色定義字體顏色,獲得彩色變換文字輸出。
//隨機字體顏色
SetTextColor(g_hdc, RGB(rand() % 256, rand() % 256, rand() % 256));
由於WM_PAINT消息目前僅在窗口大小發生改變時觸發,故獲得炫彩效果需拖動窗口邊框。
在定位字體位置時,觀察到TextOut()函數輸出位置定位在字符串左上角。同時發現通過MoveWindow()函數設置窗口位置、大小時,設置的大小爲窗口區大小,並非之前以爲的客戶區大小。之後會檢索窗口區大小的設置問題。
爲求基本框架熟記,以及提高代碼書寫水平,每次新建項目書寫基本框架均使用手打方式,不採用複製之前框架的做法。
源代碼:
/*
學習使用GDI文字輸出
2017/08/19
*/
//頭文件
#include <Windows.h>
#include <time.h> //生成隨機數
//全局函數聲明
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam);
bool Game_Init(HWND hwnd);
void Game_Paint(HWND hwnd);
bool Game_Cleanup(HWND hwnd);
//全局變量
HDC g_hdc = 0;
//入口函數
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//創建窗口類
WNDCLASSEX wndClass = { 0 };
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.cbSize = sizeof(WNDCLASSEX);
wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wndClass.hCursor = LoadCursor(nullptr, IDC_ARROW);
wndClass.hIcon = LoadIcon(nullptr, IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = WndProc;
wndClass.lpszClassName = L"GDI_Text";
wndClass.lpszMenuName = nullptr;
wndClass.style = CS_HREDRAW | CS_VREDRAW;
//註冊窗口類
if ( !RegisterClassEx(&wndClass) )
{
MessageBox(nullptr, L"窗口類創建失敗!", L"", MB_OK);
return -1;
}
//創建窗口
HWND hwnd = CreateWindow(L"GDI_Text", L"文字輸出演示", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, nullptr, nullptr, hInstance,
nullptr);
//顯示刷新窗口
ShowWindow(hwnd, nCmdShow);
MoveWindow(hwnd, 0, 0, 800, 600, true);
UpdateWindow(hwnd);
Game_Init(hwnd);
//消息循環
MSG msg = { 0 };
while (msg.message!=WM_QUIT)
{
if (PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
//註銷窗口類
UnregisterClass(L"GDI_Text", hInstance);
return 0;
}
//全局函數定義
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
PAINTSTRUCT paintstruct;
switch (message)
{
//如果窗口刷新,調用Game_Paint重繪畫面
case WM_PAINT:
g_hdc = BeginPaint(hwnd, &paintstruct);
Game_Paint(hwnd);
EndPaint(hwnd, &paintstruct);
ValidateRect(hwnd, nullptr);
break;
case WM_CLOSE:
if (IDYES == MessageBox(hwnd, L"是否退出程序?", L" ", MB_YESNO))
DestroyWindow(hwnd);
break;
case WM_DESTROY:
Game_Cleanup(hwnd);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
}
bool Game_Init(HWND hwnd)
{
//設置隨機數種子
srand((unsigned)time(nullptr));
Game_Paint(hwnd);
return true;
}
void Game_Paint(HWND hwnd)
{
g_hdc = GetDC(hwnd);
wchar_t text1[] = L"我就試試";
//設置字體
HFONT hFont = CreateFont(80, 0, 0, 0, 0, 0, 0, 0, GB2312_CHARSET, 0, 0, 0, 0,
L"幼圓");
SelectObject(g_hdc, hFont);
//設置字體透明背景
SetBkMode(g_hdc, TRANSPARENT);
//隨機字體顏色
SetTextColor(g_hdc, RGB(rand() % 256, rand() % 256, rand() % 256));
TextOut(g_hdc, 0, 50, text1, wcslen(text1));
ReleaseDC(hwnd, g_hdc);
}
bool Game_Cleanup(HWND hwnd)
{
return true;
}