当前位置: 首页 > news >正文

手机怎么做淘客网站外贸 网站 源码

手机怎么做淘客网站,外贸 网站 源码,怎么做网站文字优化,如何做静态网站承接前文#xff1a; win32窗口编程windows 开发基础win32-注册窗口类、创建窗口win32-显示窗口、消息循环、消息队列win32-鼠标消息、键盘消息、计时器消息、菜单资源 本文目录 图标资源光标资源WM_SETCURSOR 消息 字符串资源加速键资源WM_PAINT 消息绘图绘图编程绘图基础基… 承接前文 win32窗口编程windows 开发基础win32-注册窗口类、创建窗口win32-显示窗口、消息循环、消息队列win32-鼠标消息、键盘消息、计时器消息、菜单资源 本文目录 图标资源光标资源WM_SETCURSOR 消息 字符串资源加速键资源WM_PAINT 消息绘图绘图编程绘图基础基本图形绘制GDI 绘图对象画笔画刷位图文本绘制字体 图标资源 以.ico为后缀的图片icon 图标资源。一个图标文件中可以有多个不同分辨率大小的图标以适应不同场景下的使用。 想要使用图标资源第一步添加图标资源第二步加载图标资源第三步设置窗口类。 HICON LoadIcon(HINSTANCE hInstance, //handle to application instanceLPCTSTR lpIconName //name string or resource identifier ); //成功返回HICON句柄添加图标资源 添加图标资源后可以自己绘制图标从图中可以看到有不同大小的图标256x256像素、48x48像素等有支持彩色的图标也有黑白图标。 代码中添加资源头文件并将图标赋值给窗口类的成员变量。 #include resource.h //把资源头文件包含进来 ... ... wc.hIcon LoadIcon(hIns, (char*)IDI_ICON1);编译运行改变窗口图标 在Visual Studio中编辑图标并不怎么方便在这里可以将提前制作好的图标放在项目目录中修改.rc 文件中对于图标资源的描述修改为自己提前制作好的图标然后在Visual Studio中重新加载被修改的 .rc 文件再次编译运行。 光标资源 光标资源就是鼠标光标这个光标在不同情况下是不同的有的时候是箭头光标有的时候是一个小手有的时候是一闪一闪的竖杠等等在游戏中光标的形状也各不相同。一个光标就是一个图片也是需要自己提前绘制然后用代码进行应用。 光标资源使用步骤 第一步添加光标资源光标的默认大小是32x32像素每个光标有一个HotSpot热点也就是点击时生效的点因为一个光标图片有很多像素但是生效的一个点只有一个点这个点的位置可以自己设置例如箭头光标的热点就在箭头的尖上。第二步加载资源HCURSOR LoadCursor(HINSTANCE hInstance, //handle to application instanceLPCTSTR lpCursorName //name or resource identifier ); // hInstance 可以为 NULL, 获取系统默认的Cursor第三步设置光标 注册窗口类时设置。或 使用 SetCursor() 设置光标。 添加光标资源 绘制光标资源 使用图中的 Set Hot Spot Tool 来设置光标热点。 设置光标 #include resource.h ... ... //wc.hCursor LoadCursor(NULL, IDC_ARROW); //默认光标 wc.hCursor LoadCursor(hIns, (char*)IDC_CURSOR1);无论是 LoadCursor() 函数还是 LoadIcon() 函数他们的作用都是通过窗口实例句柄和资源的ID来在内存中找到这个资源。窗口实例句柄 hInstance 的作用就是在内存中找到一块保存窗口各种信息的内存这些资源被编译后会编译到 .exe 里面当程序运行的时候程序就会被加载到内存其中就包括了各种资源。 自己创建的光标只在客户区起作用在标题栏就会自动变成默认光标。 使用 SetCursor() 函数可以在程序运行的过程中修改光标 HCURSOR SetCursor(HCURSOR hCursor // handle to cursor );SetCursor()函数必须放在 WM_SETCURSOR 消息下进行调用。 WM_SETCURSOR 消息 只有光标有移动的情况这个消息就会不断地出现。专职用法改光标。 附带参数 wParam 当前使用的光标句柄。lParam LOWORD 当前区域的代码Hit-Test codeHTCLIENT 客户区/ HTCAPTION标题栏、边框。HIWORD 没太大用处。 再绘制一个光标 IDC_CURSOR2在程序运行时进行切换 //添加全局变量 hInstance HINSTANCE g_hInstance 0;//WinMain()函数中给hInstance赋值 g_hInstance hIns;//消息处理函数中添加代码 case WM_SETCURSOR: {HCURSOR hCursor LoadCursor(g_hInstance, (char*)IDC_CURSOR2);SetCursor(hCursor); } break; //运行后鼠标移动时光标闪烁变化这是因为该消息产生后立马修改了光标但是return DefWindowProc()又将光标修改回去 //SetCursor()后面加上 return 0;即可解决光标随着鼠标的移动不断闪烁修改的问题。//修改如下 //在客户区光标时 IDC_CURSOR2在标题栏 IDC_CURSOR1在其他地方顶层菜单栏、图标等位置处为默认光标 case WM_SETCURSOR: {HCURSOR hCursor1 LoadCursor(g_hInstance, (char*)IDC_CURSOR1);HCURSOR hCursor2 LoadCursor(g_hInstance, (char*)IDC_CURSOR2);if (LOWORD(lParam) HTCLIENT) {SetCursor(hCursor2);return 0;}else if (LOWORD(lParam) HTCAPTION) {SetCursor(hCursor1);return 0;} } break;字符串资源 字符串资源存在的目的就是方便代码中各种字符串的修改例如语言的切换中英文切换等。 具体来说字符串资源的作用包括 中心化管理文本将应用程序中使用的所有文本信息集中管理方便统一修改和维护。 多语言支持通过为不同语言单独创建字符串资源文件可以实现应用程序的多语言支持使应用能够在不同语言环境下运行并显示相应的文本。 提高可维护性由于文本信息集中管理修改或更新某个文本只需在字符串资源中进行修改而不需要在代码中逐个替换提高了代码的可维护性。 便于国际化和本地化通过使用字符串资源可以轻松地将应用程序本地化为不同的语言和区域设置满足不同用户群体的需求。 节省内存空间采用字符串资源可以在编译时对字符串进行优化并且可以节省内存空间。 添加字符串资源添加字符串表在表中增加字符串。加载字符串资源int LoadString(HINSTANCE hInstance, // handle to resource moduleUINT uID, //字符串IDLPTSTR lpBuffer, //存放字符串BUFFint nBufferMax //字符串BUFF长度 ); //成功返回字符串长度失败返回0添加字符串资源 添加字符串资源 使用字符串资源 char wTitle[20] { 0 }; LoadString(hIns, STR_Chinese_WinTitle, wTitle, 20);HWND hWnd CreateWindowEx(0, pClassName, wTitle,WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_OVERLAPPEDWINDOW,200, 200, 640, 480, //窗口位置200200大小长宽640480。nullptr, nullptr, hIns, nullptr );在程序中尽量多使用字符串资源string table这样可以方便文本管理如果需要大面积的修改文本也会方便很多。 加速键资源 加速键就当快捷键理解。例如记事本的快捷键 添加资源资源添加加速键表增加命令ID对应的加速键。 使用 //加载加速键表 HACCEL LoadAccelerators(HINSTANCE hInstance, //handle to moduleLPCTSTR lpTableName // accelerator table name ); //返回加速键表句柄//翻译加速键 int TranslateAccelerator(HWND hWnd, //处理消息的窗口句柄HACCEL hAccTable, //加速键表句柄LPMSG lpMsg //消息 ); //如果是加速键返回非零。该函数内部首先判断是不是加速键。添加加速键资源 Accelerator加速 编辑加速键当加速键的ID和菜单中某一项ID相同时就实现了加速键和某一个菜单项绑定。加速键和菜单项没有什么对应关系当它们的ID相同时就可以说是绑定当然加速键的ID也可以单独设置不一定非要和菜单项的ID相同。关于菜单资源参见上一篇文章菜单资源点击跳转。 在这里 ID_40001 、ID_40002 、ID_40003 分别对应着菜单项的ID 新建 、打开 、退出。ID_other 不对应任何菜单项。 当菜单项被点击时或者加速键被按下时都可以产生 WM_COMMAND 消息。 在 WM_COMMAND 消息中 wParam HIWORD 为 1 表示消息产生自加速键为 0 表示消息产生自菜单项。LOWORD 为命令 ID。 lParam 0. TranslateAccelerator()函数的内部执行过程 //伪代码 TranslateAccelerator(hWnd, hAccel, nMsg){if(nMsg.message ! WM_KEYDOWN)return 0; //不是按键被按下那就绝对不是加速键消息直接返回0根据nMsg.wParam(键码值)获知哪些按键被按下假如Ctrl N拿着Ctrl N到 hAccel 加速键表中匹配具体加速键if(没找到)return 0;if(找到){SendMessage(hWnd, WM_COMMAND, HIWORD(1)|||LOWORD(ID_40001), ... ); //产生COMMAND消息return 1;} }加速键的使用 //加速键要放在消息循环中使用。//使用前首先加载加速键表HACCEL hAccel LoadAccelerators(hIns, (char*)IDR_ACCELERATOR1);//TranslateAccelerator()函数应该放在TranslateMessage()函数之前调用因为TranslateMessage()会区分大小写。消息循环加上翻译加速键函数的调用后完整代码如下while (1) //先进入死循环循环体中进行判断是否退出循环{if (PeekMessage(nMsg, NULL, 0, 0, PM_NOREMOVE)) //PeekMessage侦察兵侦察是否有消息如果有消息{if ((gResult GetMessage(nMsg, NULL, 0, 0)) 0) //gResult值大于零意味着GetMessage没有抓到 WM_QUIT返回值为0 也没有出错出错返回值为-1{if (!TranslateAccelerator(hWnd, hAccel, nMsg)) //返回值为0不是加速键则翻译、派发消息。是加速键消息则产生一个 WM_COMMAND 消息然后进入下次消息循环{TranslateMessage(nMsg);DispatchMessage(nMsg);}}else //如果抓到 WM_QUIT 或者 出错 退出while循环{break;}}else //如果PeekMessage()没有侦察到消息空闲处理{//WriteConsole(g_dos_output, No Message, strlen(No Message), NULL, NULL);}}if (gResult -1) //GetMessage()出错返回值 -1{//错误处理或直接退出程序 return -1;}else //抓到 WM_QUIT 消息退出程序返回 PostQuitMessage()的参数值{return nMsg.wParam; //此时 wParam 是 PostQuitMessage()的参数值}根据 WM_COMMAND 消息的 HIWORD(wParam) 可以区分出消息来自 加速键 被按下 还是 菜单项 被点击 //消息处理函数中对于 WM_COMMAND 消息的处理 case WM_COMMAND:OnCommand(hWnd, wParam); break;//OnCommand()函数的具体内容如下 void OnCommand(HWND hWnd, WPARAM wParam) {switch (LOWORD(wParam)) {case ID_40001: {if (!HIWORD(wParam)) {MessageBox(hWnd, 菜单项新建被点击, Information, MB_OK);}else {MessageBox(hWnd, 新建快捷键CtrlN被按下, Information, MB_OK);}}break;case ID_40002:{if (!HIWORD(wParam)) {MessageBox(hWnd, 菜单项打开被点击, Information, MB_OK);}else {MessageBox(hWnd, 打开快捷键CtrlO被按下, Information, MB_OK);}}break;case ID_40003:{if (!HIWORD(wParam)) {MessageBox(hWnd, 菜单项退出被点击, Information, MB_OK);}else {MessageBox(hWnd, 退出快捷键CtrlQ被按下, Information, MB_OK);}}break;case ID_other:MessageBox(hWnd, 快捷键CtrlR被按下, Information, MB_OK);break;} }运行 WM_PAINT 消息 WM_PAINT 产生时间当窗口需要绘制的时候。窗口第一次显示窗口被拖拽、大小发生变化等等附带信息 wParam 、lParam 0。 专职用法用于绘图。 ShowWindow() 函数在调用显示窗口的时候会发出一个 WM_PAINT 消息。 GetMessage() 函数在执行过程中也会检查窗口是否需要重新绘制并发出 WM_PAINT 消息。 InvalidateRect 需要重新绘制的区域。 BOOL InvalidateRect(HWND hWnd, //窗口句柄CONST RECT* lpRect, //区域的矩形坐标参数为空的话表明整个窗口都需要重新绘制BOOL bErase //重绘前是否需要擦除 );其中 RECT 是一个封装了矩形 上下左右的结构体 typedef struct tagRECT {LONG left;LONG top;LONG right;LONG bottom; } RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;InvalidateRect 该函数一旦调用GetMessage() 也会发出 WM_PAINT 消息。 用于通知Windows系统某个窗口或者指定的矩形区域需要重绘。当调用InvalidateRect函数时系统会发送一个WM_PAINT消息给窗口提示它需要重新绘制。这在开发Windows应用程序时非常有用可以在需要更新界面时强制触发重绘操作。 一般情况下开发者会在需要更新窗口内容的时候调用InvalidateRect函数然后系统会在适当的时间批量处理所有需要重绘的区域提高绘制效率。通过使用InvalidateRect函数开发者可以实现界面的实时更新和响应用户操作提升用户体验。 绘图 绘图步骤 开始绘图HDC BeginPaint(HWND hWnd, //绘图窗口LPPAINTSTRUCT lpPaint //绘图参数的BUFF ); //返回绘图设备句柄 HDC正式绘图结束绘图BOOL EndPaint(HWND hWnd, //绘图窗口CONST PAINTSTRUCT *lpPaint //绘图参数的指针BeginPaint返回 );按下鼠标左键进行字符串绘制使用TextOut()函数在客户区绘制字符串。 绘图编程 绘图基础 GDI - Windows graphics device interface Windows图形设备接口Win32提供的绘图API 是 Windows 操作系统提供的一组函数和数据结构用于在屏幕上绘制图形、文本和图像。GDI 提供了访问和控制显示设备的功能包括绘制形状、填充颜色、显示文本、裁剪图像等。开发人员可以使用 GDI 来创建图形用户界面GUI和进行图形处理例如创建窗口、按钮、菜单等界面元素。GDI 在 Windows 中扮演着重要的角色为应用程序提供了图形处理能力帮助用户和开发者实现丰富的图形显示效果。 绘图设备 DCDevice Context 设备上下文 Device Context (设备上下文) 是Windows开发中的重要概念它指代一种用于绘制图形、文本和图像的抽象对象。 Device Context 封装了与设备相关的绘图操作允许开发者在绘制到屏幕、打印机或其他输出设备上时使用统一的接口。通过与设备上下文进行交互开发者可以绘制图形、操纵字体、绘制文本、处理图像和执行其他与绘图相关的操作。 DC可以看成 Windows 的画家想要绘图就要先找到这个画家通过 DC 句柄来找到画家。 HDC hdc BeginPaint(hWnd, pc); BeginPaint() 函数用来找到画家并将返回值赋值给 HDC。BeginPaint() 的第一个参数 hWnd 窗口句柄告诉画家在哪个窗口画画。 HDC - DC句柄表示绘图设备。 抓到 HDC 以后就可以使用各种绘图函数来进行图形绘制。 绘制图形结束后 EndPaint() 释放DC。 颜色 计算机使用 红、绿、蓝 Red、Green、BlueRGB 作为三原色计算机使用的三原色是物理中的三原色通过这三种颜色的不同程度的配比可以得到各种各样的颜色拿放大镜观察屏幕可以看到这三原色构成了显示器的各种颜色。物理中的三原色要区别于美术中的三原色美术中的三原色是指黄红蓝这三种颜料可以配出绝大多数颜色的颜料。 R值红色值0 ~ 25528 256一个字节。G0 ~ 255。B0 ~ 255。每个点的颜色是3个字节24位保存 0 ~ 224 - 1总共有 16,777,216 种颜色。在过去的计算机中使用16位来保存颜色值低5位Red第二个5位Green最高6位Blue。32位表示颜色值前面的24位用来表示红色R、绿色G和蓝色B的色彩强度而后面的8位则用来表示 alpha 通道。Alpha 通道通常用来表示颜色的透明度数值范围从 0 到 2550 表示完全透明255 表示完全不透明。通过调整alpha通道的数值可以控制颜色的透明度使得它可以适应各种混合和叠加效果。这种32位的颜色表示方式常用于计算机图形和游戏开发中。 颜色的使用 使用 COLORREF 类型来声明一个颜色值。 typedef DWORD COLORREF; //本质是 DWORD。typedef unsigned long DWORD; // DWORD 本质就是 unsigned longunsigned long 类型占 4 个字节正好 32 位正好可以用来存储颜色值 声明一个颜色值 COLORREF nColor 0; 赋值使用 RGB宏nColor RGB(0,0,255); //蓝色 获取RGB值GetRValue/GetGValue/GetBValue。BYTE nRed GetRValue(nColor); 除了使用这几个函数也自己自己通过 除法取余运算 来获得各个字节的值。 画点 //SetPixel 设置指定点的颜色 COLORREF SetPixel(HDC hdc, // DC 句柄int X, // X 坐标int Y, // Y 坐标COLORREF crColor //设置颜色 ); //返回点原来的颜色在消息处理函数的 switch 语句中添加对 WM_PAINT 消息的处理在像素 100100 的位置处绘制了一个非常小的黑点。 使用 for 循环绘制渐变色 使用 for 循环绘制点点成线线成面R和G的值在绘制的过程中不断变化形成渐变色方块第一个方块中Blue的分量为255第二个方块中 Blue的分量为128 使用 for 循环一个一个点地去绘制并不是一种高效的绘制方法。 基本图形绘制 线的使用直线、弧线 MoveToEx 指定窗口当前点窗口当前点默认在(0,0)处窗口客户区左上角。LineTo 从窗口当前点到指定点绘制一条直线。 MoveToEx(hdc, 0, 260, NULL); //起点 LineTo(hdc,256, 390); //终点直线LineTo 绘制完直线后会将窗口当前点设置到256390。封闭图形能够用画刷填充的图形RectangleEllipse。 Rectangle(hdc, 100, 100, 300, 300); //绘制直角矩形 坐标左上-右下Ellipse(hdc, 250, 100, 300,200); //坐标左上-右下矩形中的内切圆或椭圆更多的图形的绘制函数可以在网上查找不赘述。 GDI 绘图对象 画笔 画笔的作用线的颜色、线型、粗细。 HPEN 画笔句柄。 画笔的使用 创建画笔 HPEN CreatePen(int fnPenStyle, //画笔样式PS_SOLID实心线可以支持多个像素宽其他线型只能是一个像素宽。int nWidth, //画笔粗细COLORREF crColor //画笔颜色); //创建成功返回句柄将画笔应用到DC中HGDIOBJ SelectObject(HDC hdc, //绘图设备句柄HGDIOBJ hgdiobj //GDI绘图对象句柄画笔句柄 ); //返回原来的GDI绘图对象句柄注意保存原来DC当中的画笔绘图完成后取出DC画笔使用SelectObject()函数。释放画笔BOOL DeleteObject(HGDIOBJ hObject //GDI绘图对象句柄画笔句柄 ); //只能删除不被DC使用的画笔所以在释放前必须将画笔从DC中取出代码如图所示 画笔样式也可以是虚线 PS_DASH 非实线画笔像素宽度必须为 1 像素。 HPEN red_pen CreatePen(PS_DASH, 1, RGB(255, 0, 0)); 画刷 画刷的作用给封闭图形填充颜色或图案封闭图形有 Rectangle 、Ellipse。 HBRUSH 画刷句柄保存画刷。 画刷的使用步骤跟画笔的使用步骤基本一样 创建画刷 CreateSolidBrush 创建实心画刷。CreateHatchBrush 创建纹理画刷。 将画刷应用到 DC 中SelectObject()。绘图将画刷从 DC 中取出。删除画刷DeleteObject()。 void OnPaint(HWND hWnd) {PAINTSTRUCT ps { 0 };HDC hdc BeginPaint(hWnd, ps); // 获得 DC 句柄HPEN red_pen CreatePen(PS_DASH, 1, RGB(255, 0, 0)); //1个像素宽虚线的红色画笔HGDIOBJ old_pen SelectObject(hdc, red_pen);HBRUSH blue_brush CreateSolidBrush(RGB(0, 0, 255));HGDIOBJ old_brush SelectObject(hdc, blue_brush); //将DC原来的画刷置换出来DC默认画刷是白色的。MoveToEx(hdc, 0, 260, NULL);LineTo(hdc,256, 390);LineTo(hdc, 1, 1);LineTo(hdc, 23, 199);Rectangle(hdc, 100, 100, 300, 300);HBRUSH green_brush CreateHatchBrush(HS_CROSS, RGB(0, 255, 0));SelectObject(hdc, green_brush);Ellipse(hdc, 250, 100, 300, 200);SelectObject(hdc, old_brush);DeleteObject(blue_brush);DeleteObject(green_brush);SelectObject(hdc, old_pen); //置换出红色画笔DeleteObject(red_pen);EndPaint(hWnd, ps); //结束绘画 }为了让绘制的封闭图形看上去与背景相契合可以使用透明画刷。透明画刷已经存在于操作系统中想要使用透明画刷只需要向操作系统借用即可。 使用 GetStockObject() 函数获取由操作系统维护的画笔、画刷、字体等等。向操作系统借用的画笔、画刷等使用完后不需要 DeleteObject() 。 向操作系统借用透明画刷 HBRUSH transparent_brush GetStockObject(NULL_BRUSH); HGDIOBJ old_brush SelectObject(hdc, transparent_brush);位图 光栅图形记录图像中每一点的颜色等信息光栅图形是由像素图像的最小单元组成的图形它们在网格状的二维数组中描述。在光栅图形中每个像素都有自己的颜色值图像的清晰度和细节取决于像素的密度和分辨率。常见的光栅图形格式包括 JPEG、PNG、BMP 等。复杂的图像和真实世界的场景但在缩放和变换时可能会失真。矢量图形记录图像算法绘图指令等矢量图形使用数学公式描述图形它由线条、曲线和填充区域等基本几何形状组成。与光栅图形不同矢量图形以对象的形式存储因此可以在任意比例下缩放而不失真。常见的矢量图形格式包括 SVG、EPS、AI 等。矢量形适合用于图标、标志、表和大型设计元素能够保持清晰度并支持无损缩放。 位图句柄HBITMAP位图句柄能在内存中找到一块内存里面保存着位图图像每个点的颜色值等信息。 位图的使用 在资源中添加位图资源。 从资源中加载位图 LoadBitmap() 。 创建一个与当前 DC 相匹配的 DC 内存 DC。 HDC CeateCompatibleDC(HDC hdc //当前 DC 句柄可以为 NULL 使用 屏幕 DC); //返回创建好的的 DC 句柄/*这里的 内存 DC 是一个在内存中的 DC可以理解为一个虚拟的 DC*/使用 SelectObject 将位图的数据放入虚拟的内存DC中。 成像1:1比例将内存 DC 中的图像显示在窗口上。 BOOL BitBlt(HDC hdcDest, //目的DCint nXDest, //目的DC左上角坐标int nYDest, //目的右上角坐标int nWidth, //目的宽度int nHeight, //目的高度这四个参数确定成像位置和成像区域HDC hdcStr, //源DCint nXSrc, //源左上角坐标int nYSrc, //源右上角坐标从虚拟DC的什么位置开始成像DWORD dwRop //成像方法 SRCCOPY);缩放成像 BOOL StretchBlt(HDC hdcDest, //handle to destination DCint nXOriginDest, //x-coord of destination upper-left cornerint nYOriginDest, //y-coord of destination upper-right cornerint nwidthDest, //width of destination rectangleint nHeightDest, //height of destination rectangleHDC hdcSrc, //handle to source DCint nXOriginSrc, //x-coord of source upper-left cornerint nYOriginSrc, //y-coord of source upper-right cornerint nWidthSrc, //源DC宽int nHeightSrc, //源DC高DWORD dwRop //raster operation code );使用 SelectObject 函数取出位图。 释放位图 DeleteObject。 释放匹配的 DCDeleteDC。 添加 bitmap 添加 bitmap 成功之后会显示 bitmap 的绘制界面也可以修改 Resource.rc 文件中对于 bitmap 资源的描述修改为从外部导入的 bitmap 文件。 1:1 成像代码 PAINTSTRUCT ps { 0 }; HDC hdc BeginPaint(hWnd, ps); // 获得 DC 句柄//添加位图资源 HBITMAP hBmp1 LoadBitmap(g_hInstance, (char*)IDB_BITMAP1); HDC hMemdc CreateCompatibleDC(hdc); //创建一个DC构建一个虚拟区域并且内存DC在虚拟区域中绘图HGDIOBJ oldbmp SelectObject(hMemdc, hBmp1); BitBlt(hdc, 10, 10, 1536, 1024, hMemdc, 0, 0, SRCCOPY);SelectObject(hMemdc, oldbmp); DeleteObject(hBmp1); DeleteDC(hMemdc);EndPaint(hWnd, ps); //结束绘画在窗口中 1:1 显示位图该图高1536像素宽1024像素所以 1:1 显示无法看到全部图像。 缩放成像 StretchBlt(hdc, 5, 5, //窗口位置512, 768, //窗口区域hMemdc, 0, 0, //从图像的的哪里开始绘制1024, 1536, //显示图像的宽高SRCCOPY);运行 从上图的运行结果可以看到图片缩小后显示出现了很多的纹理。出现这种情况可能是因为在使用StretchBlt函数时将图像进行缩放时导致了图像质量下降。StretchBlt函数可以对图像进行拉伸和压缩但它是基于像素级的操作因此在缩放时可能会导致图像的锯齿状边缘和失真。 想要在窗口中显示缩小的BMP图像并保持较好的质量可以考虑使用双线性插值进行图像缩放。双线性插值是一种图像处理算法它可以在进行图像缩放时减少锯齿状边缘和纹理。 使用 GDI 库来实现双线性插值 首先配置项目属性在 Solution Explorer 栏下右键项目名项目属性 properties——Linker 链接器——Input——Additional Dependencies 附加属性后面添加一个值 gdiplus.lib; 注意每个值之间用英文版分号 ; 隔开。 或者在代码第一行添加如下代码 #pragma comment(lib,Gdiplus.lib) //这将使编译器在编译时自动链接所需的 Gdiplus 库放在代码第一行#include gdiplus.h //包含所需要的头文件using namespace Gdiplus; //使用命名空间 ... ...void OnPaint(HWND hWnd) {//添加位图资源HBITMAP hBmp1 LoadBitmap(g_hInstance, (char*)(IDB_BITMAP1));HBITMAP hBmp2 LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP2));HBITMAP hBmp3 LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP4));if ((hBmp1 NULL) (hBmp2 NULL) (hBmp3 NULL)){MessageBox(hWnd, Failed to load bitmap resource, Error, MB_OK | MB_ICONERROR);exit(-1);}Bitmap bitmap1(hBmp1, NULL);Bitmap bitmap2(hBmp2, NULL);Bitmap bitmap3(hBmp3, NULL);// 缩小图片并保证质量HDC hdc GetDC(hWnd);Graphics graphics(hdc);graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);graphics.DrawImage(bitmap1, 0, 0, 512, 768); // 以左上角为起点缩放到 512x768 大小graphics.DrawImage(bitmap2, 512, 0, 512, 768);graphics.DrawImage(bitmap3, 1024, 0, 512, 768);// 释放资源DeleteObject(hBmp1);DeleteObject(hBmp2);DeleteObject(hBmp3);ReleaseDC(hWnd, hdc); }//消息处理 LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam) {switch (msgID){case WM_PAINT:OnPaint(hWnd);break;... ... }... ... //WinMain函数添加下面代码 int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns, LPSTR lpCmdLine, int nCmdShow) {//在程序开始时初始化GDI库GdiplusStartupInput gdiplusStartupInput; //定义了一个名为gdiplusStartupInput的变量其类型是GdiplusStartupInput。GdiplusStartupInput是一个结构体用于指定GDI库的初始化参数。通常情况下你可以保持其默认值。ULONG_PTR gdiplusToken; //定义了一个名为gdiplusToken的变量其类型是ULONG_PTR。在初始化GDI库时GdiplusStartup函数将为其分配一个令牌并将此令牌存储在gdiplusToken中。这个令牌是用来标识GDI库的实例化过程。GdiplusStartup(gdiplusToken, gdiplusStartupInput, NULL); //调用了GdiplusStartup函数来初始化GDI库。它接受三个参数分别是一个指向令牌的指针gdiplusToken一个指向GdiplusStartupInput结构的指针gdiplusStartupInput以及一个GdiplusStartupOutput结构的指针通常为NULL... ...while(1) {... ... //消息循环}//消息循环后面添加GdiplusShutdown(gdiplusToken); //调用了GdiplusShutdown函数来清理并关闭GDI库。它接受一个参数即在初始化时获得的令牌gdiplusToken。该函数用于释放GDI库所使用的资源确保在程序结束时正确清理。... ...return ... }运行消除图片缩小时产生的纹理。 修改图片绘制的透明度为 0.5 : // 设置透明度 ColorMatrix colorMatrix { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, // 设置透明度范围从0.0完全透明到1.0完全不透明 0.0f, 0.0f, 0.0f, 0.0f, 1.0f };ImageAttributes imageAttr; imageAttr.SetColorMatrix(colorMatrix, ColorMatrixFlagsDefault, ColorAdjustTypeBitmap);// 绘制图像 graphics.DrawImage(bitmap1, RectF(0, 0, 512, 768), 0, 0, bitmap1.GetWidth(), bitmap1.GetHeight(), UnitPixel, imageAttr); graphics.DrawImage(bitmap2, RectF(512, 0, 512, 768), 0, 0, bitmap2.GetWidth(), bitmap2.GetHeight(), UnitPixel, imageAttr); graphics.DrawImage(bitmap3, RectF(1024, 0, 512, 768), 0, 0, bitmap3.GetWidth(), bitmap3.GetHeight(), UnitPixel, imageAttr);运行 ColorMatrix colorMatrix { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f };这段代码创建了一个 ColorMatrix 对象其中第四行第四列的值被设置为 0.5即设置了图像的透明度为 50%。 ColorMatrix 是一个 5x5 的矩阵用于在 GDI 中进行颜色转换。当我们将一个图像绘制到目标上时可以使用 ColorMatrix 对图像进行颜色调整。它的基本原理是将每个像素的颜色值与 ColorMatrix 进行矩阵乘法运算得到新的颜色值。 在这个 ColorMatrix 中每行代表着输出颜色的一个分量红、绿、蓝、透明度和偏移量而每列代表输入颜色的一个分量。在这个矩阵中第四行第四列的值表示了输出的 alpha透明度通道因此将其设置为 0.5 就使得输出的透明度减半从而实现了图像的半透明效果。 通过调整 ColorMatrix 中的各个元素我们可以实现对图像的不同颜色分量的调整包括亮度、对比度、饱和度以及透明度等。这种颜色转换的方式提供了一种非常灵活的方法可以在绘制图像时对其进行各种颜色效果的处理。 文本绘制 在前文中提到了一个文本的绘制函数 TextOut 将文字绘制在指定坐标位置这个函数对于文本的绘制功能比较基础。下面介绍 DrawText() 函数 int DrawText(HDC hdc, //DC句柄LPCTSTR lpString, //字符串int nCount, //字符数量LPRECT lpRect, //绘制文字的矩形框UINT uFormat //绘制的方式 );RECT rc; //矩形结构体 rc.left 100; //矩形距离窗口左边距离 rc.top 150; //矩形距离窗口顶端的距离 rc.right 200; rc.bottom 200; Rectangle(hdc, 100, 150, 200, 200); //绘制矩形以查看字符串绘制的位置 DrawText(hdc, 你好 hello hello Long LONG LONG, strlen(你好 hello hello Long LONG LONG), rc, DT_LEFT | DT_TOP | DT_WORDBREAK | DT_NOCLIP);DT_LEFT 水平靠左开始绘制字符串。DT_TOP 垂直靠上绘制字符串。DT_WORDBREAK 单行超出矩形右侧的文本另起一行绘制。DT_NOCLIP 文本太长超出矩形范围时不剪切字符串完整显示所有文本。DT_CENTER 水平居中。DT_VCENTER 垂直居中。只能单行居中与WORDBREAK冲突DT_SINGLELINE 单行绘制。 … … 文字颜色和背景 文字颜色SetTextColor。 SetTextColor(hdc, RGB(0, 0, 255)); //蓝色字体DrawText(hdc, 你好\n hello hello\n Long\n LONG LONG Long\n LONG, strlen(你好\n hello hello\n Long\n LONG LONG Long\n LONG), rc, DT_CENTER | DT_VCENTER | DT_NOCLIP);文字背景SetBkColor。默认背景色白色 SetBkColor(hdc, RGB(0, 128, 200)); //浅蓝色背景文字背景模式SetBkMode OPAQUE 默认的不透明模式 / TRANSPARENT 透明模式。 SetBkMode(hdc, TRANSPARENT);字体 Windows 常用字体为 TrueType 格式的字体文件。 字体名标识字体类型。 HFONT 字体句柄。 在 Windows 系统盘 C:/Windows/Fonts 目录下有着各种各样的字体这些字体文件都是 TrueType 格式的也就是每个字体文件中保存着每个字的真实点阵字型位图字体每个字的真实外观即使双击打开也不能查看到每个字只是一个预览而已。 字体的使用 创建字体想要创建一个字体那么该电脑中就要有该字体的字体文件。 HFONT CreateFont(int nHeight, //字体高度int nWidth, //字体宽度字体高度给出后宽度填0即可自动匹配合适的宽度int nEscapement, //字符串倾斜角度字符串与水平方向的夹角以0.1度为单位。字体站得竖直但是字符串中所有的字符不在一水平线上int nOrientation, //字符旋转角度以x轴为轴心向里或向外旋转角度。int fnWeight, //字体的粗细DWORD fdwItalic, //斜体1或0。DWORD fdwUnderline, //字符下划线DWORD fdwStrikeOut, //删除线DWORD fdwCharSet, //字符集DWORD fdwOutputPrecision, //输出精度没什么用DWORD fdwClipPrecision, //剪切精度没什么用DWORD fdwQuality, //输出质量没什么用DWORD fdwPitchAndFamily, //匹配字体没什么用LPCTSTR lpszFace //字体名称);应用到字体 DCSelectObject。绘制文本DrawText / TextOut。取出字体SelectObject。删除字体DeleteObject。 SetTextColor(hdc, RGB(0, 128, 200)); //字体颜色浅蓝色 SetBkColor(hdc, RGB(0, 128, 200)); //字体背景色 SetBkMode(hdc, TRANSPARENT); //设置字体背景为透明色此时背景色会被覆盖HFONT hFont CreateFont(30, 0, 45, 0, 900, 1, 1, 1, GB2312_CHARSET, 0, 0, 0, 0, 楷体); //创建字体 HGDIOBJ oldFont SelectObject(hdc, hFont);HGDIOBJ hBrush GetStockObject(NULL_BRUSH); //创建透明画刷 HGDIOBJ oldBrush SelectObject(hdc, hBrush);RECT rc; rc.left 100; rc.top 150; rc.right 200; rc.bottom 200; Rectangle(hdc, 100, 150, 200, 200); //绘制矩形背景为透明色 DrawText(hdc, 你好\n hello hello\n Long\n LONG LONG Long\n LONG, strlen(你好\n hello hello\n Long\n LONG LONG Long\n LONG), rc, DT_CENTER | DT_VCENTER | DT_NOCLIP);// 释放资源 SelectObject(hdc, oldFont); DeleteObject(hFont); SelectObject(hdc, oldBrush); DeleteObject(hBrush);字体绘制如下 本期文章到此结束觉得博主文章有用的朋友可以给个一键三连鼓励一下你们的关注与支持是我持续更新下去的动力感谢。
http://www.hkea.cn/news/14319577/

相关文章:

  • 做企业网站需要准备什么材料卖货小程序
  • 权威网站发布平台手机域名免费注册
  • 站长工具是干嘛的网站信息建设总结
  • 网站建设成都哪家公司好网站的留言怎么做
  • 莘县聊城做网站wordpress 前台不显示内容
  • 网站建设与管理实训课程移动互联网开发人才网
  • 制作网站的模板下载深圳光明新区网站建设
  • 做美食网站有哪些长沙建网站速成班
  • 武城网站建设wordpress获取qq头像评论
  • 网站开发需要redis网站的规划和建设方案
  • 免费h5模板网站网站开发好什么进行界面的优化
  • iis网站目录权限网站做不做双解析
  • 建材网站建设公司电子商务毕业设计 网站建设
  • 网站建设保障方案十大软件下载软件大全
  • 一家企业如何做网站推广网络科技有限公司英文
  • 成都的汽车网站建设微信小程序注册是免费的吗
  • 天津模板建站定制网站wordpress模板选择器
  • 网站建设成本预测表网站设计教科书
  • 网站开发项目总结php旅游网站论文
  • 怎样建立一个简单的网站响应式网站尺寸
  • 如何快速搭建网站wordpress网站速度检测
  • 东昌府聊城做网站费用成都系统开发
  • 高端科研网站设计宁波建设集团股份有限公司
  • 网站的建设教程网站 二次开发怎么做
  • 学做卤菜网站wordpress主题动漫
  • 视听节目 网站建设深圳正规制作网站
  • 网站设计 模板2017酷站推荐网站
  • 建设银行官方网站下载北京网站建设方案策划
  • 购物网站模板带后台模板建站难吗
  • 左侧导航栏网站家具公司网站建设