Windows编程04_图标资源,光标资源,字符串资源,加速键资源,绘图编程,GDI绘图对象,位图,文本绘制
01 图标资源
- 添加资源
注意图标的大小,一个图标文件中,可以有多个不同大小的图标。 - 加载
HICON LoadIcon(
HINSTSNCE hInstance, //handle to application instance
LPCTSTR lpIconName //name string or resource identifier
);成功返回HICON句柄 - 设置
注册窗口类
步骤1:

删除原始图案按delete键
步骤2:
wc.hIcon = LoadIcon(hIns,(char*)IDI_ICON1);

02 光标资源
- 添加光标的资源
光标的大小默认是32*32像素,每个光标有HotSpot,是当前鼠标的热点。 - 加载资源
HCURSOR LoadCursor(
HINSTANCE hInstance, //handle to application instance
LPCTSTR lpCursorName,//name or resource identifier
);hInstance - 可以为NULL,获取系统默认的Cursor - 设置资源
在注册窗口时,设置光标
使用SetCursor设置光标
步骤1:

设置热点,到下面图片双击:

资源2:
方法1:
wc.hCursor = LoadCursor(hIns,(char*)IDC_CURSOR1);
此方法不利用随时换光标
方法2:
-
HCURSOR SetCursor(
HCURSOR hCursor //handle to cursor
); -
WM_SETCURSOR 消息参数
wPARAM -当前使用的光标句柄
lPARAM -LOWORD当前区域的代码(Hit-Test code) HTCLIENT/HTCAPTION…
HIWORD -当前鼠标消息ID
#include
#include
#include"resource.h"HINSTANCE g_hIns = 0;
LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
{switch (msgID){case WM_DESTROY:PostQuitMessage(0);//可以使用GetMessage函数返回0break;case WM_SETCURSOR:{HCURSOR hCur = LoadCursor(g_hIns, (char*)IDC_CURSOR2);if (LOWORD(lParam) == HTCLIENT){SetCursor(hCur);//客户区活动,光标改变return 0;}else {//非客户区活动,保存原样}}}return DefWindowProc(hWnd, msgID, wParam, lParam);
}//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow)
{g_hIns = hIns;//注册窗口类WNDCLASS wc = { 0 };wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.hCursor = LoadCursor(hIns,(char*)IDC_CURSOR1);wc.hIcon = LoadIcon(hIns,(char*)IDI_ICON1);wc.hInstance = hIns;wc.lpfnWndProc = WndProc;wc.lpszClassName = "Main";wc.lpszMenuName = NULL;wc.style = CS_HREDRAW | CS_VREDRAW;RegisterClass(&wc);//将以上所有赋值全部写入操作系统。//在内存创建窗口HWND hWnd = CreateWindowEx(0, "Main", "window", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);//显示窗口ShowWindow(hWnd, SW_SHOW);UpdateWindow(hWnd);//消息循环MSG nMsg = { 0 };while (GetMessage(&nMsg, NULL, 0, 0)){TranslateMessage(&nMsg);DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理}return 0;
}
03 字符串资源
- 添加字符串资源
添加字符串表,在表中增加字符串 - 字符串资源的使用
int LoadString(
HINSTANCE hInstance, //handle to resource module
UINT uID, //字符串ID
LPTSTR lpBuffer, //存放字符串BUFF
int nBufferMax //字符串BUFF长度
);成功返回字符串长度,失败0
步骤1:

步骤2:
修改

步骤3:
修改代码:
char szTile[256] = { 0 };LoadString(hIns, IDS_WND, szTile, 256);HWND hWnd = CreateWindowEx(0, "Main", szTile, WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);

04 加速键资源
-
添加:资源添加加速键表,增加命令ID对应的加速键
-
使用
加载加速键表
HACCEL LoadAccelerators(
HINSTANCE hInstance, //handle to module
LPCTSTR lpTableName //accelerator table name
);返回加速键句柄翻译加速键
int TranslateAccelerator(
HWND hWnd, //处理消息的窗口句柄
HACCEL hAccTable, //加速键表句柄
LPMSG lpMsg //消息
);如果是加速键,返回非零
TranslateAccelerator原理:
步骤1:先建Menu:
修改代码
步骤2:

步骤3:
添加快捷键内容,可以不必和菜单项对应

- 在WM_COMMAND中相应消息,消息参数
wPARAM :
HIWORD为1表示加速键,为0表示菜单。
LOWORD为命令ID
lParam:为0
#include
#include
#include"resource.h"HINSTANCE g_hIns = 0;
void OnCommand(HWND hWnd, WPARAM wParam)
{switch (LOWORD(wParam)){case ID_NEW:if(HIWORD(wParam) == 0)MessageBox(hWnd, "新建菜单项被点击", "Infor", MB_OK);else if(HIWORD(wParam) == 1)MessageBox(hWnd, "CTRL+M被点击", "Infor", MB_OK);break;}
}LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
{switch (msgID){case WM_COMMAND:OnCommand(hWnd, wParam);break;case WM_DESTROY:PostQuitMessage(0);//可以使用GetMessage函数返回0break;case WM_SETCURSOR:{HCURSOR hCur = LoadCursor(g_hIns, (char*)IDC_CURSOR2);if (LOWORD(lParam) == HTCLIENT){SetCursor(hCur);//客户区活动,光标改变return 0;}else {//非客户区活动,保存原样}}}return DefWindowProc(hWnd, msgID, wParam, lParam);
}//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow)
{g_hIns = hIns;//注册窗口类WNDCLASS wc = { 0 };wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.hCursor = LoadCursor(hIns,(char*)IDC_CURSOR1);wc.hIcon = LoadIcon(hIns,(char*)IDI_ICON1);wc.hInstance = hIns;wc.lpfnWndProc = WndProc;wc.lpszClassName = "Main";wc.lpszMenuName = (char *)IDR_MENU1;wc.style = CS_HREDRAW | CS_VREDRAW;RegisterClass(&wc);//将以上所有赋值全部写入操作系统。//在内存创建窗口char szTile[256] = { 0 };LoadString(hIns, IDS_WND, szTile, 256);HWND hWnd = CreateWindowEx(0, "Main", szTile, WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);//显示窗口ShowWindow(hWnd, SW_SHOW);UpdateWindow(hWnd);HACCEL hAccel = LoadAccelerators(hIns, (char*)IDR_ACCELERATOR1);//消息循环MSG nMsg = { 0 };while (GetMessage(&nMsg, NULL, 0, 0)){if (!TranslateAccelerator(hWnd, hAccel, &nMsg)){TranslateMessage(&nMsg);DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理}}return 0;
}

05 绘图编程
1.绘图基础
-
绘图设备DC(Device Context),绘图上下文/绘图描述表
-
HDC -DC句柄,表示绘图设备
-
GDI -Windows graphics device interface(Win32提供的绘图API)
-
颜色
计算机使用红,绿,蓝,
R -0~255
G -0~255
B -0~255每一个点颜色是3个字节24位保存 0-2^24-1
16位:5,5,6
32位:8,8,8,8绘图或透明度 -
颜色的使用
COLORREF -实际DWORD
例如:COLORREF nColor = 0; -
赋值使用RGB宏
例如:nColor = RGB(0,0,255) -
获取RGB值
GetRValue/GetGValue/GetBValue
例如:BYTE nRed = GetRValue(nColor);
2.基本图像绘制
-
SetPixel 设置指定点的颜色
COLORREF SetPixel(
HDC hdc, //DC句柄
int X,//X坐标
int Y, //Y坐标
COLORREF crColor //设置的颜色
);返回点原来的颜色 -
线的使用(直线,弧度)
MoveToEx -指名窗口当前点
LineTo -从窗口当前点到指定点绘制一条直线
当前点:上一次绘制时的最后一点,初始位(0,0)点 -
封闭图像:能够用画刷填充的图像
Rectangle/Ellipse
#include
#include
void DrawPit(HDC hdc)
{SetPixel(hdc, 100, 100, RGB(255, 0, 0));for (int i =0;i<256;i++)for (int j = 0; j < 256; j++)SetPixel(hdc, i, j, RGB(i, j, 0));
}void DrawLine(HDC hdc)
{MoveToEx(hdc, 100, 100, NULL);LineTo(hdc, 300, 300);//MoveToEx(hdc, 300, 300, NULL);LineTo(hdc, 0, 300);
}void DrawRect(HDC hdc)
{Rectangle(hdc, 100, 100, 300, 300);
}void DrawEll(HDC hdc)
{Ellipse(hdc, 100, 100, 300, 300);
}
void OnPaint(HWND hWnd)
{PAINTSTRUCT ps = { 0 };HDC hdc = BeginPaint(hWnd, &ps);//DrawPit(hdc);//绘制点//DrawLine(hdc);//绘制直线//DrawRect(hdc);//绘制矩形DrawEll(hdc);//绘制矩形EndPaint(hWnd, &ps);
}LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
{switch (msgID){case WM_PAINT:OnPaint(hWnd);break;case WM_LBUTTONDOWN:InvalidateRect(hWnd, NULL, TRUE);break;case WM_DESTROY:PostQuitMessage(0);//可以使用GetMessage函数返回0break;}return DefWindowProc(hWnd, msgID, wParam, lParam);
}//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow)
{//注册窗口类WNDCLASS wc = { 0 };wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.hCursor = NULL;wc.hIcon = NULL;wc.hInstance = hIns;wc.lpfnWndProc = WndProc;wc.lpszClassName = "Main";wc.lpszMenuName = NULL;wc.style = CS_HREDRAW | CS_VREDRAW;RegisterClass(&wc);//将以上所有赋值全部写入操作系统。//在内存创建窗口HWND hWnd = CreateWindowEx(0, "Main", "window", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);//显示窗口ShowWindow(hWnd, SW_SHOW);UpdateWindow(hWnd);//消息循环MSG nMsg = { 0 };while (GetMessage(&nMsg, NULL, 0, 0)){TranslateMessage(&nMsg);DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理}return 0;
}

06 GDI绘图对象
1.画笔
-
画笔的作用
线的颜色,线型,线粗。
HPEN -画笔句柄 -
画笔的使用
1 .创建画笔
HPEN CreatePen(
int fnPenStyle, //画笔的样式
int nWidth, //画笔的粗细
COLORREF crColor //画笔的颜色
);创建成功返回句柄PS_SOILD -实心线,可以支持多个像素宽,其他线型只能是一个像素宽。
2.将画笔应用到DC中
HGDIOBJ SelectObject(
HDC hdc,//绘图设备句柄
HGDIOBJ hgdiobj //GDI绘图对象句柄。画笔句柄
);返回原来的GDI绘图对象句柄
注意保存原来DC当中画笔。
3.绘图
4.取出DC中的画笔
将原来的画笔,使用SelectObject函数,放入到设备DC中,就会将我们创建的画笔取出。
5.释放画笔
BOOL DeleteObject(
HGDIOBJ hObject //GDI绘图对象句柄,画笔句柄
);
只能删除不被DC使用的画笔,所以在释放前,必须将画笔从DC中取出。
#include
#include
void DrawPit(HDC hdc)
{SetPixel(hdc, 100, 100, RGB(255, 0, 0));for (int i =0;i<256;i++)for (int j = 0; j < 256; j++)SetPixel(hdc, i, j, RGB(i, j, 0));
}void DrawLine(HDC hdc)
{MoveToEx(hdc, 100, 100, NULL);LineTo(hdc, 300, 300);//MoveToEx(hdc, 300, 300, NULL);LineTo(hdc, 0, 300);
}void DrawRect(HDC hdc)
{Rectangle(hdc, 100, 100, 300, 300);
}void DrawEll(HDC hdc)
{Ellipse(hdc, 100, 100, 300, 300);
}
void OnPaint(HWND hWnd)
{PAINTSTRUCT ps = { 0 };HDC hdc = BeginPaint(hWnd, &ps);HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));HGDIOBJ nOldPen = SelectObject(hdc, hPen);//DrawPit(hdc);//绘制点//DrawLine(hdc);//绘制直线//DrawRect(hdc);//绘制矩形DrawEll(hdc);//绘制矩形SelectObject(hdc, nOldPen);DeleteObject(hPen);EndPaint(hWnd, &ps);
}LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
{switch (msgID){case WM_PAINT:OnPaint(hWnd);break;case WM_LBUTTONDOWN:InvalidateRect(hWnd, NULL, TRUE);break;case WM_DESTROY:PostQuitMessage(0);//可以使用GetMessage函数返回0break;}return DefWindowProc(hWnd, msgID, wParam, lParam);
}//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow)
{//注册窗口类WNDCLASS wc = { 0 };wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.hCursor = NULL;wc.hIcon = NULL;wc.hInstance = hIns;wc.lpfnWndProc = WndProc;wc.lpszClassName = "Main";wc.lpszMenuName = NULL;wc.style = CS_HREDRAW | CS_VREDRAW;RegisterClass(&wc);//将以上所有赋值全部写入操作系统。//在内存创建窗口HWND hWnd = CreateWindowEx(0, "Main", "window", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);//显示窗口ShowWindow(hWnd, SW_SHOW);UpdateWindow(hWnd);//消息循环MSG nMsg = { 0 };while (GetMessage(&nMsg, NULL, 0, 0)){TranslateMessage(&nMsg);DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理}return 0;
}

2.画刷
- 画刷相关
画刷 -封闭图形的填充的颜色,图案
HBRUSH -画刷句柄 - 画刷的使用
- 创建画刷
CreateSolidBrush -创建实心画刷
CreateHatchBrush -创建纹理画刷
2.将画刷应用到DC中
SelectObject
3.绘图
4.将画刷从DC中取出
5.删除画刷
DeleteObject
- 创建画刷
- 其他
可以使用GetStockObject函数获取系统维护的画刷,画笔当。
如果不使用画刷填充,需要使用NULL_BRUSH参数,获取不填充的画刷。
GetStockObject返回的画刷不需要DeleteObject。
#include
#include
void DrawPit(HDC hdc)
{SetPixel(hdc, 100, 100, RGB(255, 0, 0));for (int i =0;i<256;i++)for (int j = 0; j < 256; j++)SetPixel(hdc, i, j, RGB(i, j, 0));
}void DrawLine(HDC hdc)
{MoveToEx(hdc, 100, 100, NULL);LineTo(hdc, 300, 300);//MoveToEx(hdc, 300, 300, NULL);LineTo(hdc, 0, 300);
}void DrawRect(HDC hdc)
{Rectangle(hdc, 100, 100, 300, 300);
}void DrawEll(HDC hdc)
{Ellipse(hdc, 100, 100, 300, 300);
}
void OnPaint(HWND hWnd)
{PAINTSTRUCT ps = { 0 };HDC hdc = BeginPaint(hWnd, &ps);HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));HGDIOBJ nOldPen = SelectObject(hdc, hPen);//HBRUSH hBrush = CreateSolidBrush(RGB(0, 255, 0));//PS_SOLIDHBRUSH hBrush = CreateHatchBrush(HS_CROSS, RGB(0, 255, 0));//HGDIOBJ hBrush = GetStockObject(NULL_BRUSH);HGDIOBJ nOldBrush = SelectObject(hdc, hBrush);//DrawPit(hdc);//绘制点//DrawLine(hdc);//绘制直线//DrawRect(hdc);//绘制矩形DrawEll(hdc);//绘制矩形SelectObject(hdc, nOldBrush);SelectObject(hdc, nOldPen);DeleteObject(hPen);DeleteObject(hBrush);EndPaint(hWnd, &ps);
}LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
{switch (msgID){case WM_PAINT:OnPaint(hWnd);break;case WM_LBUTTONDOWN:InvalidateRect(hWnd, NULL, TRUE);break;case WM_DESTROY:PostQuitMessage(0);//可以使用GetMessage函数返回0break;}return DefWindowProc(hWnd, msgID, wParam, lParam);
}//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow)
{//注册窗口类WNDCLASS wc = { 0 };wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.hCursor = NULL;wc.hIcon = NULL;wc.hInstance = hIns;wc.lpfnWndProc = WndProc;wc.lpszClassName = "Main";wc.lpszMenuName = NULL;wc.style = CS_HREDRAW | CS_VREDRAW;RegisterClass(&wc);//将以上所有赋值全部写入操作系统。//在内存创建窗口HWND hWnd = CreateWindowEx(0, "Main", "window", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);//显示窗口ShowWindow(hWnd, SW_SHOW);UpdateWindow(hWnd);//消息循环MSG nMsg = { 0 };while (GetMessage(&nMsg, NULL, 0, 0)){TranslateMessage(&nMsg);DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理}return 0;
}

07 位图
-
位图相关
光栅图形 -记录图像中每一点的颜色等信息。
矢量图型 -记录图像算法,绘图指令等。
HBITMAP -位图句柄 -
位图的使用
1.在资源中添加位图资源
2.从资源中加载位图LoadBitmap
3.创建一个与当前DC相匹配的DC(内存DC)
HDC CreateCompatibleDC(
HDC hdc //当前DC句柄,可以为NULL(使用屏幕DC)
);返回创建好的DC句柄
4.将位图放入匹配的DC中 SelectObject
5.成像(1:1)
BOOL BitBlt(
HDC hdcDest, //目的DC
int nXDest, //目的左上X坐标
int nYDest, //目的左上Y坐标
int nWidth, //目的宽度
int nHeigth, //目的高度
HDC hdcSrc, //源DC
int nXSrc, //源左上X坐标
int nYSrc, //源左上Y坐标
DWORD dwRop //成像方法 SRCCOPY
);
6.取出位图
SelectObject
7.释放位图
DeleteObject
8.释放匹配的DC
DeleteDC -
缩放成像
BOOL BitBlt(
HDC hdcDest, //目的DC
int nXDest, //目的左上X坐标
int nYDest, //目的左上Y坐标
int nWidth, //目的宽度
int nHeigth, //目的高度
HDC hdcSrc, //源DC
int nXSrc, //源左上X坐标
int nYSrc, //源左上Y坐标
int nWidthSrc, //源DC宽
int nHeightSrc, //源DC高
DWORD dwRop //成像方法 SRCCOPY
);
步骤1:

#include
#include
#include"resource.h"HINSTANCE g_hIns = 0;void DrawPit(HDC hdc)
{SetPixel(hdc, 100, 100, RGB(255, 0, 0));for (int i =0;i<256;i++)for (int j = 0; j < 256; j++)SetPixel(hdc, i, j, RGB(i, j, 0));
}void DrawLine(HDC hdc)
{MoveToEx(hdc, 100, 100, NULL);LineTo(hdc, 300, 300);//MoveToEx(hdc, 300, 300, NULL);LineTo(hdc, 0, 300);
}void DrawRect(HDC hdc)
{Rectangle(hdc, 100, 100, 300, 300);
}void DrawEll(HDC hdc)
{Ellipse(hdc, 100, 100, 300, 300);
}
void DrawBmp(HDC hdc)
{//添加位图资源(不需要代码)HBITMAP hBmp = LoadBitmap(g_hIns, (char*)IDB_BITMAP1);HDC hMemdc = CreateCompatibleDC(hdc);//创建一个内存DC,并构建一个虚拟区域,并且内存DC在虚拟区域中绘图HGDIOBJ nOldBmp = SelectObject(hMemdc, hBmp);//将位图数据送给内存DC,内存DC在虚拟区域中将位图绘制出来BitBlt(hdc, 100, 100, 48, 48, hMemdc, 0, 0, SRCCOPY);//将虚拟区域中绘制好的图像成像到窗口中StretchBlt(hdc, 200, 200, 24, 24, hMemdc, 0, 0, 48, 48, SRCCOPY);//缩放成像SelectObject(hMemdc, nOldBmp);DeleteObject(hBmp);DeleteDC(hMemdc);
}
void OnPaint(HWND hWnd)
{PAINTSTRUCT ps = { 0 };HDC hdc = BeginPaint(hWnd, &ps);HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));HGDIOBJ nOldPen = SelectObject(hdc, hPen);//HBRUSH hBrush = CreateSolidBrush(RGB(0, 255, 0));//PS_SOLIDHBRUSH hBrush = CreateHatchBrush(HS_CROSS, RGB(0, 255, 0));//HGDIOBJ hBrush = GetStockObject(NULL_BRUSH);HGDIOBJ nOldBrush = SelectObject(hdc, hBrush);//DrawPit(hdc);//绘制点//DrawLine(hdc);//绘制直线//DrawRect(hdc);//绘制矩形//DrawEll(hdc);//绘制矩形DrawBmp(hdc);SelectObject(hdc, nOldBrush);SelectObject(hdc, nOldPen);DeleteObject(hPen);DeleteObject(hBrush);EndPaint(hWnd, &ps);
}LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
{switch (msgID){case WM_PAINT:OnPaint(hWnd);break;case WM_LBUTTONDOWN:InvalidateRect(hWnd, NULL, TRUE);break;case WM_DESTROY:PostQuitMessage(0);//可以使用GetMessage函数返回0break;}return DefWindowProc(hWnd, msgID, wParam, lParam);
}//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow)
{g_hIns = hIns;//注册窗口类WNDCLASS wc = { 0 };wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.hCursor = NULL;wc.hIcon = NULL;wc.hInstance = hIns;wc.lpfnWndProc = WndProc;wc.lpszClassName = "Main";wc.lpszMenuName = NULL;wc.style = CS_HREDRAW | CS_VREDRAW;RegisterClass(&wc);//将以上所有赋值全部写入操作系统。//在内存创建窗口HWND hWnd = CreateWindowEx(0, "Main", "window", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);//显示窗口ShowWindow(hWnd, SW_SHOW);UpdateWindow(hWnd);//消息循环MSG nMsg = { 0 };while (GetMessage(&nMsg, NULL, 0, 0)){TranslateMessage(&nMsg);DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理}return 0;
}

08 文本绘制
1.绘制字符串
- 文字的绘制
TextOut -将文字绘制在指定坐标位置。
int DrawText(
HDC hDC, //DC句柄
LPCTSTR lpString, //字符串
int nCount, //字符数量
LPRECT lpRect, //绘制文字的矩形框
UINT uFormat //绘制的方式
); - 文字颜色和背景
文字颜色:SetTextColor
文字背景色:SetBkColor
文字背景模式:SetBkMode(OPAQUE/TRANSPARENT)
2.字体
- 字体相关
Window常用的字体为TrueType格式的字体文件
字体名-标识字体类型
HFONT -字体句柄 - 字体的使用
1.创建字体
HFONT CreateFont(
int nHeight, //字体高度
int nWidth, //字体宽度
int nEscapement, //字符串倾斜角度
int nOrientation, //字符串旋转角度
int fnWeight, //字体的粗细
DWORD fdwItalic, //倾斜
DWORD fdwUnderline, //字符下划线
DWORD fdwStrikeOut, //删除线
DWORD fdwCharSet, //字符集
DWORD fdwOutputPrecision, //输出精度
DWORD fdwClipPrecision, //剪切精度
DWORD fdwQuality, //输出质量
DWORD fdwPitchAndFamily, //匹配字体
LPCTSTR lpszFace //字体名称
);
2.应用字体到DC
SelectObject
3.绘制文字
DrawText/TextOut
4.取出字体
SelectObject
5.删除字体
DeleteObject
#include
#includeHINSTANCE g_hIns = 0;
void OnPaint(HWND hWnd)
{PAINTSTRUCT ps = { 0 };HDC hdc = BeginPaint(hWnd, &ps);SetTextColor(hdc, RGB(255, 0, 0));SetBkColor(hdc, RGB(0, 255, 0));//只适用于OPAQUE模式SetBkMode(hdc, TRANSPARENT);HFONT hFont = CreateFont(30, 0, 45, 0, 900, 1, 1, 1, GB2312_CHARSET, 0, 0, 0, 0, "黑体");HGDIOBJ nOldFont = SelectObject(hdc, hFont);char szText[] = "hello txt";TextOut(hdc, 100, 100, szText, strlen(szText));RECT rc;rc.left = 100;rc.top = 150;rc.right = 200;rc.bottom = 200;//Rectangle(hdc, 100, 150, 200, 200);DrawText(hdc, szText, strlen(szText), &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP);//DT_VCENTER/DT_BOTTOM只适用于DT_SINGLELINE和DT_WORDBREAK冲突SelectObject(hdc, nOldFont);DeleteObject(hFont);EndPaint(hWnd, &ps);
}LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam)
{switch (msgID){case WM_PAINT:OnPaint(hWnd);break;case WM_LBUTTONDOWN:InvalidateRect(hWnd, NULL, TRUE);break;case WM_DESTROY:PostQuitMessage(0);//可以使用GetMessage函数返回0break;}return DefWindowProc(hWnd, msgID, wParam, lParam);
}//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow)
{g_hIns = hIns;//注册窗口类WNDCLASS wc = { 0 };wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.hCursor = NULL;wc.hIcon = NULL;wc.hInstance = hIns;wc.lpfnWndProc = WndProc;wc.lpszClassName = "Main";wc.lpszMenuName = NULL;wc.style = CS_HREDRAW | CS_VREDRAW;RegisterClass(&wc);//将以上所有赋值全部写入操作系统。//在内存创建窗口HWND hWnd = CreateWindowEx(0, "Main", "window", WS_OVERLAPPEDWINDOW, 100, 100, 500, 500, NULL, NULL, hIns, NULL);//显示窗口ShowWindow(hWnd, SW_SHOW);UpdateWindow(hWnd);//消息循环MSG nMsg = { 0 };while (GetMessage(&nMsg, NULL, 0, 0)){TranslateMessage(&nMsg);DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理}return 0;
}

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
