2501,20个窗口常用操作

news2025/1/31 4:12:57

窗口是屏幕上的一个矩形区域.窗口分为3种:覆盖窗口,弹窗和子窗口.每个窗口都有由系统绘画的"非客户区"和应用绘画的"客户区".

MFC中,CWnd类为各种窗口提供了基类.

1,通过窗柄取得CWnd指针

可调用Cwnd::FromHandle函数,通过窗柄取得Cwnd指针.

void CDemoDlg::OnButton1()
{
    HWND hWnd = GetSafeHwnd();
    //取得当前窗口的句柄
    CWnd* pWnd = CWnd::FromHandle(hWnd);
    //通过`窗柄`取得`CWnd`指针
    CString strText = _T("");
    strText.Format("pWnd=0x%X\nthis=0x%X\n",pWnd,this);
    AfxMessageBox(strText);
}

2,取得应用主窗口的指针

CWinThread::m_pMainWnd保存主窗口指针.可首先调用AfxGetApp函数取得应用的指针,然后通过应用指针取得主窗口的指针.

void CDemoDlg::OnButton2()
{
    CDemoApp* pApp = (CDemoApp*)AfxGetApp();
    //取得应用指针
    CWnd* pMainWnd = pApp->m_pMainWnd;
    //取得主窗口指针
    CString strText = _T("");
    strText.Format("pMainWnd=0x%X\nthis=0x%X\n",pMainWnd,this);
    AfxMessageBox(strText);
}

3,取得指定点的窗口

可调用CWnd::WindowFromPoint函数,取得指定点的窗口.
a,在CDemoDlg类中重载CWnd::PreTranslateMessage函数.

BOOL CDemoDlg::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_MOUSEMOVE)
    {
        CPoint point(LOWORD(pMsg->lParam),HIWORD(pMsg->lParam));
        ::ClientToScreen(pMsg->hwnd, &point);
    //按屏幕坐标转换客户区坐标
        OnMouseMove(0,point);
    }
    return CDialog::PreTranslateMessage(pMsg);
}

b,在CDemoDlg类中添加WM_MOUSEMOVE消息处理函数.

void CDemoDlg::OnMouseMove(UINT nFlags, CPoint point)
{
    CWnd* pWnd = WindowFromPoint(point);
    //取得指定点的窗口
    if (pWnd != NULL)
    {
        TRACE("%d\n",pWnd);
        if (IsChild(pWnd))
        {
            CString strText = _T("");
            pWnd->GetWindowText(strText);
            SetWindowText(strText);
        }
    }
    CDialog::OnMouseMove(nFlags, point);
}

4,最大化和最小化窗口

可调用CWnd::SendMessage函数发送最大化或最小化窗口消息,来最大化和最小化窗口.

LRESULT SendMessage(
UINT message,
    //发送的消息,值为`WM_SYSCOMMAND`时表示`系统命令消息`.
WPARAM wParam = 0,
     //当`消息`值为`WM_SYSCMMAND`,参数`字参`值为`SC_MAXIMIZE,SC_MINIMIZE`,
LPARAM lParam = 0 );
    //`SC_RESTORE`时分别表示`最大化窗口,最小化窗口,恢复窗口`.

void CDemoDlg::OnButton3()
{
    //最大化窗口
    SendMessage(WM_SYSCOMMAND,SC_MAXIMIZE,0);
}
void CDemoDlg::OnButton4()
{
    //最小化窗口
    SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);
}
void CDemoDlg::OnButton5()
{
    //恢复窗口
    SendMessage(WM_SYSCOMMAND,SC_RESTORE,0);
}

5关闭窗口

可调用CWnd::SendMessage函数,发送WM_CLOSE消息来关闭窗口.框架调用CWnd::OnClose函数处理WM_CLOSE消息.
默认,OnClose调用函数CWnd::DestroyWindow函数来关闭窗口.

void CDemoDlg::OnButton6()
{
    //关闭窗口
    SendMessage(WM_CLOSE,0,0);
}
void CDemoDlg::OnClose()
    //添加`WM_CLOSE`消息处理函数
{
    //判断是否关闭
    if (IDYES == MessageBox(_T("是否关闭窗口?"),NULL,MB_YESNO))
    {
        CDialog::OnClose();
    }
}

6设置窗口的大小和位置

可通过两个方法设置窗口大小和位置:1.调用CWnd::SetWindowPos函数;2.调用CWnd::MoveWindow函数.

void CDemoDlg::OnButton7()
{
    //设置窗口的大小和位置
    SetWindowPos(NULL,0,0,320,200,SWP_NOZORDER);
}
void CDemoDlg::OnButton8()
{
    //设置窗口的大小和位置
    MoveWindow(0,200,200,320);
} 

7居中显示窗口

可调用CWnd::CenterWindow函数居中显示窗口.

void CDemoDlg::OnButton9()
{
    //居中显示窗口
    CenterWindow();
} 

8顶层显示窗口

可调用CWnd::SetWindowPos函数顶层显示窗口,按最顶层设置对话框窗口的层次.

void CDemoDlg::OnButton10()
{
    //设置窗口层次
    SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);
     //`SWP_NOSIZE`:表示窗口保持当前的大小,`SWP_NOMOVE`:表示窗口保持当前的位置
}

9设置窗口图标

首先调用CWinApp::LoadIcon函数加载图标资源,然后调用CWnd::SetIcon函数设置图标.

void CDemoDlg::OnButton11()
{
    //加载图标
    HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON);
    //设置图标
    SetIcon(hIcon,FALSE);
    //`假`:设置程序小图标,`真`:设置任务栏大图标
} 

10取得和设置窗口的标题

可分别调用CWnd::GetWindowTextCWnd::SetWindowText函数,取得和设置窗口标题.

void CDemoDlg::OnButton12()
{
    CString strText = _T("");
    GetWindowText(strText);
    //取得窗口标题
    SetDlgItemText(IDC_TEXT,strText);
    //设置编辑框文本
}
void CDemoDlg::OnButton13()
{
    CString strText = _T("");
    GetDlgItemText(IDC_TEXT,strText);
    //取得编辑框文本
    SetWindowText(strText);
    //设置窗口标题
}

11显示或隐藏窗口的标题栏

可调用CWnd::ModifyStyle函数显示或隐藏窗口的标题栏.

void CDemoDlg::OnButton14()
{
    //删除标题栏风格
    ModifyStyle(WS_CAPTION,0,SWP_FRAMECHANGED);
}
void CDemoDlg::OnButton15()
{
    //添加标题栏风格
    ModifyStyle(0,WS_CAPTION,SWP_FRAMECHANGED);
}

12改变窗口形状

标准窗口形状矩形的.要改变窗口的形状,首先调用CRgn类的成员函数创建相应形状的区域,然后调用CWnd::SetWindowRgn函数按窗口区域设置它.
可分别用CRgn类的CreateRectRgn,CreateEllipticRgn,CreatePolygonRgnCreateRoundRectRgn函数来创建矩形,椭圆形,多边形和圆矩形区域.

void CDemoDlg::OnButton16()
{
    CRect rect;
    GetClientRect(rect);
    //创建矩形区域
    CRgn rgn;
    rgn.CreateRectRgn(rect.left,rect.top,rect.right,rect.bottom);
    //设置窗口的区域
    SetWindowRgn((HRGN)rgn,TRUE);
}
void CDemoDlg::OnButton17()
{
    CRect rect;
    GetClientRect(rect);
    //创建椭圆形区域
    CRgn rgn;
    rgn.CreateEllipticRgn(0,0,rect.Width(),rect.Height());
    //设置窗口的区域
    SetWindowRgn((HRGN)rgn,TRUE);
}
void CDemoDlg::OnButton18()
{
    CRect rect;
    GetClientRect(rect);
    CPoint point[6];
    point[0].x = 0;
    point[0].y = rect.Height() / 2;
    point[1].x = rect.Width() / 3;
    point[1].y = 0;
    point[2].x = 2 * rect.Width() / 3;
    point[2].y = 0;
    point[3].x = rect.Width();
    point[3].y = rect.Height() / 2;
    point[4].x = 2 * rect.Width() / 3;
    point[4].y = rect.Height();
    point[5].x = rect.Width() / 3;
    point[5].y = rect.Height();
    //创建多边形区域
    CRgn rgn;
    rgn.CreatePolygonRgn(point,6,ALTERNATE);
    //设置窗口的区域
    SetWindowRgn((HRGN)rgn,TRUE);
}
void CDemoDlg::OnButton19()
{
    CRect rect;
    GetClientRect(rect);
    //创建圆矩形区域
    CRgn rgn;
    rgn.CreateRoundRectRgn(0,0,rect.Width(),rect.Height(),rect.Width() / 2,rect.Height() / 2);
    //设置窗口的区域
    SetWindowRgn((HRGN)rgn,TRUE);
}

13设置窗口的透明区域

设置窗口透明区域,首先调用CRgn::CreateRectRgn创建一个区域,然后调用CRgn::CombineRgn函数,去掉需要透明的区域,最后调用CWnd::SetWindowRgn函数按窗口区域设置它.

void CDemoDlg::OnButton20()
{
    CRect rect1;
    GetWindowRect(rect1);
    CRect rect2;
    GetClientRect(rect2);
    ClientToScreen(rect2);
    CRgn rgn1;
    rgn1.CreateRectRgn(rect1.left,rect1.top,rect1.right,rect1.bottom);
    CRgn rgn2;
    rgn2.CreateRectRgn(rect2.left,rect2.top,rect2.right,rect2.bottom);
    CRgn rgn;
    rgn.CreateRectRgn(0,0,1,1);
    rgn.CombineRgn(&rgn1,&rgn2,RGN_DIFF);
    //设置窗口区域
    SetWindowRgn((HRGN)rgn,TRUE);
}

14透明窗口

要实现透明窗口,首先调用CWnd::ModifyStyleEx函数,添加窗口的WS_EX_LAYERED(0x00080000)扩展风格,然后调用SDKSetLayeredWindowAttributes函数设置窗口的透明和透明色.

void CDemoDlg::OnButton21()
{
    //添加`WS_EX_LAYERED(0x80000)`扩展风格
    ModifyStyleEx(0,0x80000);
    //加载`User32.DLL`动态链接库
    HMODULE hModule = LoadLibrary("User32.DLL");
    if (hModule != NULL)
    {
        typedef BOOL (WINAPI *FUNC)(HWND,COLORREF,BYTE,DWORD);
    //取得`SetLayeredWindowAttributes`函数指针
        FUNC func = (FUNC)GetProcAddress(hModule,"SetLayeredWindowAttributes");
        if (func != NULL)
        {
            func(GetSafeHwnd(),0,128,2);
        }
        FreeLibrary(hModule);
    }
}

15窗口闪烁

可调用CWnd::FlashWindow函数闪烁窗口.

void CDemoDlg::OnButton22()
{
    //设置计时器
    SetTimer(1,1000,NULL);
}
void CDemoDlg::OnButton23()
{
    //关闭计时器
    KillTimer(1);
    //窗口返回原状态
    FlashWindow(FALSE);
}
void CDemoDlg::OnTimer(UINT nIDEvent)
{
    if (nIDEvent == 1)
    {
    //窗口从一个状态闪烁到另一个状态
        FlashWindow(TRUE);
    }
    CDialog::OnTimer(nIDEvent);
}

16图片窗口

要实现图片窗口,首先调用CRgn::CreateRectRgnCRgn::CombineRgn函数创建并合并多个区域,然后调用CWnd::SetWindowRgn函数按窗口区域设置它.

VC对话框如何添加WM_ERASEBKGND消息(OnEraseBkgnd函数):

void CDemoDlg::OnButton24()
{
    CRect rect;
    GetWindowRect(&rect);
    //加载位图
    CBitmap bmp;
    bmp.LoadBitmap(IDB_BITMAP);
    //将位图选入设备环境
    CDC dc;
    CDC *pDC = GetDC();
    dc.CreateCompatibleDC(pDC);
    dc.SelectObject(&bmp);
    //将位图中黑色区域变成透明区域
    CRgn rgn1;
    rgn1.CreateRectRgn(0,0,rect.Width(),rect.Height());
    for (int x = 0;x < rect.Width();x++)
    {
        for (int y = 0;y < rect.Height();y++)
        {
            COLORREF cr = dc.GetPixel(x,y);
            if (cr == RGB(0,0,0))
            {
                CRgn rgn2;
                rgn2.CreateRectRgn(x,y,x+1,y+1);
                rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR);
            }
        }
    }
    //设置窗口区域
    SetWindowRgn((HRGN)rgn1,TRUE);
    ReleaseDC(pDC);
}
    //添加`WM_ERASEBKGND`消息处理函数
BOOL CDemoDlg::OnEraseBkgnd(CDC* pDC)
{
    CRect rect;
    GetWindowRect(&rect);
    CBitmap bmp;
    bmp.LoadBitmap(IDB_BITMAP);
    CDC dc;
    dc.CreateCompatibleDC(pDC);
    dc.SelectObject(&bmp);
    pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);
    return TRUE;
}

17动画窗口

可调用SDK动画窗口函数,实现动画窗口.

BOOL CDemoDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    //...居中窗口
    CenterWindow();
    //显示动画窗口
    AnimateWindow(GetSafeHwnd(), 3000, AW_BLEND);
    return TRUE;
}

18桌面窗口

可调用CWnd::GetDesktopWindow函数,取得桌面窗口.

void CDemoDlg::OnButton25()
{
    //取得桌面窗口
    CWnd* pWnd = CWnd::GetDesktopWindow();
    //取得窗口大小
    CRect rect;
    pWnd->GetClientRect(rect);
    CString strText = _T("");
    strText.Format(_T("桌面窗口大小:%dX%d"),rect.Width(),rect.Height());
    AfxMessageBox(strText);
}

19最小化桌面所有窗口

窗口中可利用快捷键Win+M最小化所有窗口.因此,可通过向任务栏窗口发送ID0x1F5(Win+M)的WM_HOTKEY消息,来最小化桌面所有窗口.
首先调用CWnd::FindWindow函数取得窗口,然后调用CWnd::SendMessage函数向窗口发送消息.

void CDemoDlg::OnButton26()
{
    //取得任务栏窗口
    CWnd* pWnd = CWnd::FindWindow(_T("Shell_TrayWnd"),NULL);
    //发送`ID`为`0x1F5(Win+M)`的`WM_HOTKEY`消息
    pWnd->SendMessage(WM_HOTKEY,0x1F5);
}

20取任务栏窗口

可调用CWnd::FindWinow函数,取得任务栏窗口.

void CDemoDlg::OnButton27()
{
    //取得任务栏窗口
    CWnd* pWnd = CWnd::FindWindow(_T("Shell_TrayWnd"),NULL);
    //取得窗口大小
    CRect rect;
    pWnd->GetClientRect(rect);
    CString strText = _T("");
    strText.Format(_T("任务栏窗口大小:%dX%d"),rect.Width(),rect.Height());
    AfxMessageBox(strText);
}

21显示或隐藏任务栏

显示或隐藏任务栏;首先调用CWnd::FindWindow函数取得窗口,然后调用CWnd::ShowWindow函数隐藏或显示窗口.

void CDemoDlg::OnButton28()
{
    //取得任务栏窗口
    CWnd* pWnd = CWnd::FindWindow(_T("Shell_TrayWnd"),NULL);
    //隐藏窗口
    if (pWnd->IsWindowVisible())
    {
        pWnd->ShowWindow(SW_HIDE);
    }
}
void CDemoDlg::OnButton29()
{
    //取得任务栏窗口
    CWnd* pWnd = CWnd::FindWindow(_T("Shell_TrayWnd"),NULL);
    //显示窗口
    if (!pWnd->IsWindowVisible())
    {
        pWnd->ShowWindow(SW_SHOW);
    }
}

22枚举桌面所有顶层窗口

BOOL CDemoDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    //...初化列表框控件
    CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
    pList->ModifyStyle(LVS_ICON | LVS_SMALLICON | LVS_LIST,LVS_REPORT);
    pList->SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
    pList->InsertColumn(0,_T("窗口类名"),LVCFMT_LEFT,115);
    pList->InsertColumn(1,_T("窗口标题"),LVCFMT_LEFT,150);
    return TRUE;
}

枚举桌面所有顶层窗口两个方法:

a,调用CWnd::GetDesktopWindowCWnd::GetWindow函数:首先调用CWnd::GetDesktopWindow函数,取得桌面窗口,然后调用CWnd::GetWindow函数,枚举所有子窗口.

void CDemoDlg::OnButton30()
{
    CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
    pList->DeleteAllItems();
    pList->SetRedraw(FALSE);
    //取得桌面窗口
    CWnd* pDesktopWnd = CWnd::GetDesktopWindow();
    //取得第一个子窗口
    CWnd* pWnd = pDesktopWnd->GetWindow(GW_CHILD);
    while(pWnd != NULL)
    {
        int nItem = pList->GetItemCount();
    //取得窗口类名
        CString strClassName = _T("");
        ::GetClassName(pWnd->GetSafeHwnd(),strClassName.GetBuffer(256),256);
        strClassName.ReleaseBuffer();
        pList->InsertItem(nItem,strClassName);
    //取得窗口标题
        CString strWindowText = _T("");
        ::GetWindowText(pWnd->GetSafeHwnd(),strWindowText.GetBuffer(256),256);
        strWindowText.ReleaseBuffer();
        pList->SetItemText(nItem,1,strWindowText);
    //继续取得下个子窗口
        pWnd =  pWnd->GetWindow(GW_HWNDNEXT);
    }
    pList->SetRedraw(TRUE);
}

b,调用SDKEnumWindows函数.

    //添加全局函数
BOOL CALLBACK EnumWndPorc(HWND hWnd,LPARAM lParam)
{
    if (hWnd == NULL)
    {
        return FALSE;
    }
    CListCtrl* pList = (CListCtrl*)lParam;
    int nItem = pList->GetItemCount();
    //取得窗口类名
    CString strClassName = _T("");
    ::GetClassName(hWnd,strClassName.GetBuffer(256),256);
    strClassName.ReleaseBuffer();
    pList->InsertItem(nItem,strClassName);
    //取得窗口标题
    CString strWindowText = _T("");
    ::GetWindowText(hWnd,strWindowText.GetBuffer(256),256);
    strWindowText.ReleaseBuffer();
    pList->SetItemText(nItem,1,strWindowText);
    return TRUE;
}
void CDemoDlg::OnButton31()
{
    CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST);
    pList->DeleteAllItems();
    pList->SetRedraw(FALSE);
    //枚举窗口
    ::EnumWindows(EnumWndPorc,(LPARAM)pList);
    pList->SetRedraw(TRUE);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2286737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[论文总结] 深度学习在农业领域应用论文笔记14

当下&#xff0c;深度学习在农业领域的研究热度持续攀升&#xff0c;相关论文发表量呈现出迅猛增长的态势。但繁荣背后&#xff0c;质量却不尽人意。相当一部分论文内容空洞无物&#xff0c;缺乏能够落地转化的实际价值&#xff0c;“凑数” 的痕迹十分明显。在农业信息化领域的…

WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理

WPF基础 | 深入 WPF 事件机制&#xff1a;路由事件与自定义事件处理 一、前言二、WPF 事件基础概念2.1 事件的定义与本质2.2 常见的 WPF 事件类型 三、路由事件3.1 路由事件的概念与原理3.2 路由事件的三个阶段3.3 路由事件的标识与注册3.4 常见的路由事件示例 四、自定义事件处…

C++封装红黑树实现mymap和myset和模拟实现详解

文章目录 map和set的封装map和set的底层 map和set的模拟实现insertiterator实现的思路operatoroperator- -operator[ ] map和set的封装 介绍map和set的底层实现 map和set的底层 一份模版实例化出key的rb_tree和pair<k,v>的rb_tree rb_tree的Key和Value不是我们之前传统意…

如何用matlab画一条蛇

文章目录 源代码运行结果代码说明结果 源代码 % 画蛇的代码 % 2025-01-28/Ver1 % 清空环境 clc; clear; close all;% 定义蛇的身体坐标 t linspace(0, 4*pi, 100); % 参数化变量 x t; % x坐标 y sin(t) 0.5 * sin(3*t); % y坐标&#xff0c;形成更复…

DVC - 数据版本和机器学习实验的命令行工具和 VS Code 扩展

文章目录 一、关于 DVC二、快速启动三、DVC的工作原理四、VS代码扩展五、安装Snapcraft&#xff08;Linux&#xff09;Chocolatey (Windows)Brew (mac OS)Anaconda (Any platform)PyPI&#xff08;Python&#xff09;Package (Platform-specific)Ubuntu / Debian (deb)Fedora /…

理解神经网络:Brain.js 背后的核心思想

温馨提示 这篇文章篇幅较长,主要是为后续内容做铺垫和说明。如果你觉得文字太多,可以: 先收藏,等后面文章遇到不懂的地方再回来查阅。直接跳读,重点关注加粗或高亮的部分。放心,这种“文字轰炸”不会常有的,哈哈~ 感谢你的耐心阅读!😊 欢迎来到 brain.js 的学习之旅!…

Maui学习笔记- SQLite简单使用案例02添加详情页

我们继续上一个案例&#xff0c;实现一个可以修改当前用户信息功能。 当用户点击某个信息时&#xff0c;跳转到信息详情页&#xff0c;然后可以点击编辑按钮导航到编辑页面。 创建项目 我们首先在ViewModels目录下创建UserDetailViewModel。 实现从详情信息页面导航到编辑页面…

Autogen_core 测试代码:test_cache_store.py

目录 原始代码测试代码代码中用到的typing注解 原始代码 from typing import Dict, Generic, Optional, Protocol, TypeVarT TypeVar("T")class CacheStore(Protocol, Generic[T]):"""This protocol defines the basic interface for store/cache o…

变压器的漏感

测量变压器漏感的时候需要将次级绕组短路&#xff1a; 测量变压器初级线圈的电感方法很简单&#xff0c;直接用LCR测量就可&#xff0c;无需像测量漏感那样将次级绕组短接&#xff1a;

从ChatGPT热潮看智算崛起

2025年1月7日&#xff0c;科智咨询发布《2025年IDC产业七大发展趋势》&#xff0c;其中提到“ChatGPT开启生成式AI热潮&#xff0c;智能算力需求暴涨&#xff0c;算力供给结构发生转变”。 【图片来源于网络&#xff0c;侵删】 为何会以ChatGPT发布为节点呢&#xff1f;咱们一起…

攻克 AI 幻觉难题

当下&#xff0c;AI 已经成为我们生活中不可或缺的一部分。无论是智能语音助手&#xff0c;还是对话式的AI模型&#xff0c;它们凭借强大的算法和海量的数据&#xff0c;为我们答疑解惑、出谋划策。 然而&#xff0c;小编今天向AI提问&#xff1a;上山打老虎。他却回答&#x…

格式化时间的插件

1.安装dayjs包 npm i dayjs 2.组件中的应用

自创《艺术人生》浅析

艺术是生活的馈赠&#xff0c;艺术是苦痛的呻吟。 笔记模板由python脚本于2025-01-29 00:01:11创建&#xff0c;本篇笔记适合喜欢写诗读诗诵诗的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅仅是知识的简单复述。 …

防御保护第一次实验:安全策略配置

一、实验拓扑 二、实验要求 三、需求分析 1.创建两个vlan 2.在ENSP中配置基于时间的ACL实现对于办公区PC访问OA Server的时间限制&#xff08;工作日早8到晚6&#xff09;。 3.通过配置基于MAC地址的ACL来实现对于生产区PC访问Web Server的限制&#xff08;除PC3外不能访问&am…

【Pytest】生成html报告中,中文乱码问题解决方案

链接上一篇文章:https://blog.csdn.net/u013080870/article/details/145369926?spm1001.2014.3001.5502 中文乱码问题&#xff0c;python3&#xff0c;Python3.7后&#xff0c;还一个文件就是result.py 因为中文可以在内容中&#xff0c;也可能在文件名&#xff0c;类名&…

【ollama通过命令行启动后如何在网页端查看运行】

ollama通过命令行启动后如何在网页端查看运行 http://localhost:11434/

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊&#xff08;毛玻璃&#xff09;对比&#xff0c;Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.RectF …

Jetpack Compose 和 Compose Multiplatform 还有 KMP 的关系

今天刚好看到官方发布了一篇文章&#xff0c;用于讨论 Compose Multiplatform 和 Jetpack Compose 之间的区别&#xff0c;突然想起之前评论区经常看到说 “Flutter 和 CMP 对于 Google 来说项目重叠的问题”&#xff0c;刚好可以放一起聊一聊。 最近写的几篇内容写的太干&…

python生成图片和pdf,快速

1、下载安装 pip install imgkit pip install pdfkit2、wkhtmltopdf工具包&#xff0c;下载安装 下载地址&#xff1a;https://wkhtmltopdf.org/downloads.html 3、生成图片 import imgkit path_wkimg rD:\app\wkhtmltopdf\bin\wkhtmltoimage.exe # 工具路径&#xff0c;安…

解锁FPGA的故障免疫密码

我们身处“碳基智能”大步迈向“硅基智能”序曲中,前者更像是后者的引导程序,AI平民化时代,万物皆摩尔定律。 越快越好,几乎适用绝大多数场景。 在通往人工智能的征程中,算力无处不在,芯片作用无可替代。 十六年前,就已宣称自己是一家软件公司的英伟达,现已登顶全球…