在哪里修改字体的大小,我改了之后只有输入符变大
#include <windows.h>
#pragma comment(lib, "msimg32.lib")
#define BUFFER(x,y) * (pBuffer + y * cxBuffer + x)
//函数声明
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);//窗口处理函数
//变量定义
HWND hwnd;
HDC hdc, hdcmen;
BITMAP bm;
HBITMAP hbm;
PAINTSTRUCT ps;
//主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
//设计窗口类
WNDCLASS wndclass = {
CS_HREDRAW | CS_VREDRAW,
WndProc,
0,
0,
hInstance,
LoadIcon(NULL, IDI_APPLICATION),
LoadCursor(NULL, IDC_ARROW),
(HBRUSH)GetStockObject(WHITE_BRUSH),
NULL,
TEXT("MYDEMO")
};
//注册窗口类
RegisterClass(&wndclass);
//创建窗口类
hwnd = CreateWindow(
TEXT("MYDEMO"),
TEXT("MyDemo"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
//显示窗口
ShowWindow(hwnd, nCmdShow);
//更新窗口
UpdateWindow(hwnd);
//消息循环
MSG Msg;
BOOL bRet;
PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE);
while (Msg.message != WM_QUIT)
{
bRet = PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE);
if (bRet)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
return Msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
/***
* cxChar : 字体宽度 cyChar : 字体高度
* cxClient : 客户区宽度 cyClient: 客户区高度
* cxBuffer : 客户区每行最多输入的字符数 cyBuffer : 客户区最多输入字符的行数。
* xCaret : 光标插入位置(每行的偏移量),yCaret:光标插入位置(列)
***/
static int cxChar, cyChar, cxClient, cyClient, cxBuffer, cyBuffer, xCaret, yCaret;
static TCHAR* pBuffer = NULL;
HDC hdc;
int x, y, i;
PAINTSTRUCT ps;
TEXTMETRIC tm;
switch (message)
{
case WM_CREATE:
hdc = GetDC(hWnd);
GetTextMetrics(hdc, &tm);
// 获取字体的平均宽度和高度
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight;
ReleaseDC(hWnd, hdc);
break;
case WM_SETFOCUS:
// 获得焦点的情况下,创建一个和字符宽度和高度相同的插入符。
CreateCaret(hWnd, NULL, cxChar, cyChar);
SetCaretPos(xCaret * cxChar, yCaret * cyChar);
ShowCaret(hWnd);
break;
case WM_KILLFOCUS:
HideCaret(hWnd);
DestroyCaret();
break;
case WM_SIZE:
// 获取客户区大小
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
// 客户区每行最大字符个数,以及客户区最多的列数
cxBuffer = max(1, cxClient / cxChar);
cyBuffer = max(1, cyClient / cyChar);
// 分配空间,并初始化
if (pBuffer != NULL)
free(pBuffer);
pBuffer = (TCHAR*)malloc(cxBuffer * cyBuffer * sizeof(TCHAR));
for (y = 0; y < cyBuffer; y++)
for (x = 0; x < cxBuffer; x++)
BUFFER(x, y) = ' ';
xCaret = 0;
yCaret = 0;
if (hWnd == GetFocus())
{
SetCaretPos(xCaret * cxChar, yCaret * cyChar);
}
InvalidateRect(hWnd, NULL, TRUE);
break;
case WM_KEYDOWN:
// 击键消息
switch (wParam)
{
case VK_PRIOR: // Page Up
yCaret = 0;
break;
case VK_NEXT: // Page Down
yCaret = cyBuffer - 1;
break;
case VK_DELETE: // delete键
// 把光标之后的字符依次提前。
for (x = xCaret; x < cxBuffer - 1; x++)
BUFFER(x, yCaret) = BUFFER(x + 1, yCaret);
BUFFER(cxBuffer - 1, yCaret) = ' ';
HideCaret(hWnd);
hdc = GetDC(hWnd);
TextOut(hdc, xCaret * cxChar, yCaret * cyChar, &BUFFER(xCaret, yCaret), cxBuffer - xCaret);
ReleaseDC(hWnd, hdc);
ShowCaret(hWnd);
break;
}
SetCaretPos(xCaret * cxChar, yCaret * cyChar);
break;
// 字符消息
case WM_CHAR:
for (i = 0; i < LOWORD(lParam); i++)
{
switch (wParam)
{
case '\b': // backspace
if (xCaret > 0)
{
xCaret--;
SendMessage(hWnd, WM_KEYDOWN, VK_DELETE, 1);
}
break;
case '\t': // tab
do
{
SendMessage(hWnd, WM_CHAR, ' ', 1);
} while (xCaret % 8 != 0);
break;
case '\n': // 换行
if (++yCaret == cyBuffer)
yCaret = 0;
break;
default:
BUFFER(xCaret, yCaret) = (TCHAR)wParam;
HideCaret(hWnd);
hdc = GetDC(hWnd);
TextOut(hdc, xCaret * cxChar, yCaret * cyChar, &BUFFER(xCaret, yCaret), 1);
ReleaseDC(hWnd, hdc);
ShowCaret(hWnd);
if (++xCaret == cxBuffer)
{
xCaret = 0;
if (++yCaret == cyBuffer)
yCaret = 0;
}
break;
}
}
SetCaretPos(xCaret * cxChar, yCaret * cyChar);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
for (y = 0; y < cyBuffer; y++)
{
TextOut(hdc, 0, y * cyChar, &BUFFER(0, y), cxBuffer);
}
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}