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 -画刷句柄
  • 画刷的使用
    1. 创建画刷
      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;
}

在这里插入图片描述


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部