1 #include <Windows.h>
2 #include <tchar.h>
3 #include <math.h>
4 #define PI 3.1415926
5 BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow);
6 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
7 HFONT CreateMyFont(TCHAR * fontName, int height, int lean);
8 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
9 {
10 MSG msg;
11 if (!InitWindowClass(hInstance, nCmdShow))
12 {
13 MessageBox(NULL, L"创建窗口失败!", _T("创建窗口"), NULL);
14 return 1;
15 }
16 while (GetMessage(&msg, NULL, 0, 0))
17 {
18 TranslateMessage(&msg);
19 DispatchMessage(&msg);
20 }
21 return(int)msg.wParam;
22 }
23 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
24 {
25 HDC hDC;
26 PAINTSTRUCT ps;
27 HFONT font;
28 HPEN hPen;
29 LPWSTR title = L"登高 唐·杜甫", poem[8] = { L"风急天高猿啸哀", L"渚清沙白鸟飞回", L"无边落木萧萧下", L"不尽长江滚滚来", L"万里悲秋常作客", L"百年多病独登台", L"艰难苦恨繁霜鬓", L"潦倒新停浊酒杯" };
30 int r, r0, i, j = -1, fontSize, fontSize0, color;
31 RECT clientDimension;
32 POINT begin, end, org;
33 double sita;
34 switch (message)
35 {
36 case WM_SIZE:
37 InvalidateRect(hWnd, NULL, true);
38 break;
39 case WM_PAINT:
40 hDC = BeginPaint(hWnd, &ps);
41 hPen = CreatePen(PS_DASH, 1, RGB(127, 127, 127));
42 SelectObject(hDC, hPen);
43 GetClientRect(hWnd, &clientDimension);
44 if ((clientDimension.right - clientDimension.left) < 400 || (clientDimension.bottom - clientDimension.top) < 300)
45 {
46 MessageBox(hWnd, L"屏幕尺寸大小,无法绘图!", L"错误信息", 0);
47 break;
48 }
49 r = (clientDimension.bottom - clientDimension.top) * 8 / 10;
50 org.x = (clientDimension.right - clientDimension.left) / 2;
51 org.y = (clientDimension.bottom - clientDimension.top) * 9 / 10;
52 Arc(hDC, org.x - r, org.y - r, org.x + r, org.y + r, org.x + (int)(r*sin(PI / 3)), org.y - (int)(r*cos(PI / 3)), org.x - (int)(r*sin(2 * PI / 3)), org.y + (int)(r*cos(2 * PI / 3)));
53 for (sita = PI / 6; sita <= PI * 5 / 6; sita += PI * 2 / 27)
54 {
55 begin.x = org.x - (int)(r*cos(sita));
56 begin.y = org.y - (int)(r*sin(sita));
57 MoveToEx(hDC, begin.x, begin.y, NULL);
58 end.x = org.x;
59 end.y = org.y;
60 LineTo(hDC, end.x, end.y);
61 }
62 r0 = r * 2 / 5;
63 Arc(hDC, org.x - r0, org.y - r0, org.x + r0, org.y + r0, org.x + (int)(r0*sin(PI / 3)), org.y - (int)(r0*cos(PI / 3)), org.x - (int)(r0*sin(2 * PI / 3)), org.y + (int)(r0*cos(2 * PI / 3)));
64 sita = PI / 6 + PI * 4 / 15 / 5;
65 fontSize0 = fontSize = (r - r0) / 7;
66 r0 = r - 20;
67 for (i = 0; i < 7; i++)
68 {
69 LPCWSTR outInfo = &title[i];
70 fontSize -= 3;
71 font = CreateMyFont(L"楷体_GB2312", fontSize - 5, -(sita + PI / 15) * 1800 / PI);
72 SelectObject(hDC, font);
73 begin.x = org.x + (int)(r0*cos(sita));
74 begin.y = org.y - (int)(r0*sin(sita));
75 TextOut(hDC, begin.x, begin.y, outInfo, 1);
76 r0 -= fontSize;
77 DeleteObject(font);
78 }
79 for (sita = PI / 6 + PI * 4 / 27 - PI / 40; sita < PI * 5 / 6; sita += PI * 2 / 27)
80 {
81 fontSize = fontSize0;
82 r0 = r - 20;
83 j++;
84 color = 0;
85 for (i = 0; i < 7; i++)
86 {
87 color += 255 / 7;
88 SetTextColor(hDC, RGB(255 - color, 0, color));
89 LPCWSTR outInfo = &poem[j][i];
90 fontSize -= 3;
91 font = CreateMyFont(L"华文行楷", fontSize, (int)(((sita - PI / 2) * 1800 / PI)) % 3600);
92 SelectObject(hDC, font);
93 begin.x = org.x + (int)(r0*cos(sita));
94 begin.y = org.y - (int)(r0*sin(sita));
95 TextOut(hDC, begin.x, begin.y, outInfo, 1);
96 r0 -= fontSize;
97 DeleteObject(font);
98 Sleep(10);
99 }
100 }
101 EndPaint(hWnd, &ps);
102 break;
103 case WM_DESTROY:
104 PostQuitMessage(0);
105 break;
106 default:
107 return DefWindowProc(hWnd, message, wParam, lParam);
108 break;
109 }
110 return 0;
111 }
112 HFONT CreateMyFont(TCHAR * fontName, int height, int lean)
113 {
114 return CreateFont(
115 height,
116 0,
117 lean,
118 0,
119 FW_HEAVY,
120 0,
121 0,
122 0,
123 GB2312_CHARSET,
124 OUT_DEFAULT_PRECIS,
125 CLIP_DEFAULT_PRECIS,
126 DEFAULT_QUALITY,
127 DEFAULT_PITCH | FF_DONTCARE,
128 fontName
129 );
130 }
131 BOOLEAN InitWindowClass(HINSTANCE hInstance, int nCmdShow)
132 {
133 WNDCLASSEX wcex;
134 HWND hWnd;
135 TCHAR szWindowClass[] = L"窗口示例";
136 TCHAR szTitle[] = L"字体及位置示例";
137 wcex.cbSize = sizeof(WNDCLASSEX);
138 wcex.style = 0;
139 wcex.lpfnWndProc = WndProc;
140 wcex.cbClsExtra = 0;
141 wcex.cbWndExtra = 0;
142 wcex.hInstance = hInstance;
143 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
144 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
145 wcex.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
146 wcex.lpszMenuName = NULL;
147 wcex.lpszClassName = szWindowClass;
148 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
149 if (!RegisterClassEx(&wcex))
150 return FALSE;
151 hWnd = CreateWindow(
152 szWindowClass,
153 szTitle,
154 WS_OVERLAPPEDWINDOW,
155 CW_USEDEFAULT, CW_USEDEFAULT,
156 CW_USEDEFAULT, CW_USEDEFAULT,
157 NULL,
158 NULL,
159 hInstance,
160 NULL
161 );
162 if (!hWnd)
163 return FALSE;
164 ShowWindow(hWnd, nCmdShow);
165 UpdateWindow(hWnd);
166 return TRUE;
167 }