面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告2

news2024/11/20 16:32:07

源自网络收集,仅供参考

实验三收集到两份完整报告,这是其二,另一份见本专栏上一篇文章。

1 实验要求
· 整体目的:理解、窗口之间的消息传送、调用栈;掌握光标、图标、菜单的制作和使用方
式 ; 掌 握 菜 单 的 响 应 方 式 、 快 捷 菜 单 的 载 入 及 使 用 方 式 ; 理 解
GetWindowLong/SetWindowLong, GetClassLong/SetClassLong 函数的用法。
· 实验内容过程:
1. 改进 ChildWin 示例程序,在子窗口内显示出窗口特定信息(窗口 ID 号);尝试在每个
子窗口中绘制特定颜色的矩形
 在子窗口的窗口过程函数的刷新处理消息中增添处理代码;
 用 GetWindowLong 函数取出子窗口 ID;
 根据子窗口 ID 设定子窗口内需要显示的信息(使用 wsprintf 函数组织待显示的字
符串)
 尝试在子窗口中绘制特定颜色的矩形(使用 CreateSolidBrush、 Rectangle 函数)
2. 跟踪消息传递过程
 在 Childwin 的主窗口过程函数的 WM_CREATE、 WM_PAINT、 WM_COMMAND、
WM_LBUTTONDOWN 处设置断点
 在子窗口的 WM_CREATE、 WM_PAINT、WM_CHILDWIN、 WM_LBUTTONDOWN
处设置断点
 运行程序,查看各断点的响应过程,以此理解消息传递的次序
3. 设计、实现一个软键盘
用子窗口实现一个软键盘(在窗口的客户区用子窗口绘制一个仿真的键盘),鼠标点击
每个子窗口,可输入不同的字符。将输入的字符显示到窗口中。
4. 在自己的工作目录中建立新工程用于控件测试〔可以将 Easywin 工程的 easywin.c 拷贝
到新工程的目录中,修改文件名为 ctltest.cpp(后缀名改为.cpp),编译、链接并使程序
正常工作(包括修正编译错误)〕。
5. * 用 Button 完成 4*所要求的软键盘实现。比较与原有实现的不同之处。
6. 创建各种类型的控件子窗口,包括 static、 edit、 listbox、 combobox、 button、 scrollbar
等;在主窗口的窗口过程函数中增加相应的消息处理实现主窗口与子窗口的通信(可尝
试设置控件的标题/内容,获取控件的标题/内容以及在控件有点击等操作时在主窗口给
出提示)。
7. 同步骤 5,新建用于资源测试的工程。
8. 增加新的资源:光标、图标,并正确显示
 用资源编辑器编辑一个光标(彩色),注意删除资源中不需要的 image 类型,否则
显示光标可能不正确。
 为光标设定热点(hot spot)
 用资源编辑器编辑一个图标
 修改注册窗口类的代码,使程序能正常使用自定义的光标和图标
 用 DrawIcon 函数,在 WM_PAINT 消息中增加处理,在窗口客户区中显示自定义
面向对象编程技术实验报告
2
的光标及图标。
 创建一个另外光标供后续实验步骤使用
9. 增加菜单
 菜单中建立一个菜单项命令以修改窗口使用的光标,可命名为“ChangeCursor”,
对应的 ID 假设为 ID_CHANGECURSOR
 修改注册窗口类的代码,使程序运行时能正确载入菜单
 换一种方式,通过修改创建窗口(CreateWindow) 的代码,使菜单能正确载入
10. 增加菜单消息响应代码
 增加 WM_COMMAND 的消息处理
 参照第五章菜单示例代码中的处理方式,响应菜单命令
 对 ID_CHANGECURSOR 命令的响应为:改变窗口使用的光标,可以使用
SetClassLong (hwnd, GCL_HCURSOR,
(LONG)LoadCursor((HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),
MAKEINTRESOURCE(IDC_CURSOR2) ) );
11. 处理鼠标右键,增加快捷菜单处理
 右键发出的菜单命令同样是通过 WM_COMMAND 消息响应的,增加快捷菜单之
后,程序应该能通过主菜单或快捷菜单两种方式发出同样的命令
12. 将本次实验做好的工程的编译、链接增加到程序构建使用的批处理文件中,用批处理文
件一次性自动构建实验一、二、三的所有工程。

2 实验过程及结果


2.1 改进 ChildWin 示例程序, 在子窗口内显示出窗口特定信息(窗
口 ID 号);尝试在每个子窗口中绘制特定颜色的矩形
如图所示,显示 id 号并绘制绿色矩形

2.2跟踪消息传递过程

1.在ChildWin的主窗口过程函数的WM_CREATE、WM_PAINT、WM_COMMAND、WM_LBUTTONDOWN处设置断点

·WM_CREATE:

创建窗口时产生中断


·WM_COMMAND:
命中子窗口时程序产生中断
 
·WM_LBUTTONDOWN:
当鼠标左键按下时程序会产生中断

2.在子窗口的WM_CREATE、WM_PAINT、WM_CHILDWIN、WM_LBUTTONDOWN处设置断点
·WM_CREATE:


·WM_PAINT:
主窗口绘制完并正常显示,在子窗口绘制前产生中断。在逐过程的操作下,从第一个子窗口开始,随着WM_PAINT的循环逐个绘制显示。
 
·WM_CHILDWIN:
在鼠标命中子窗口时,主窗口收到通知消息,并发送通知消息至WM_CHILDWIN,遂产生中断
 
·WM_LBUTTONDOWN:
 
3.运行程序,查看各断点的响应过程,以此理解消息传递的次序:
通过设置断点并进行相应调试后可以得知:当鼠标左键命中子窗口时,子窗口的WM_LBUTTONDOWN产生响应,发送消息至主窗口WM_COMMAND,WM_COMMAND确定子窗口被命中后发送消息至子窗口的WM_CHILDWIN,WM_CHILDWIN在收到消息后将子窗口命中标志置0。


2.3 设计、实现一个软键盘,鼠标点击每个子窗口可输入不同的字符,将输入的字符显示到窗口中
 

 


2.4 建立新工程用于控件测试,将Easywin工程的easywin.c拷贝到新工程的目录中,修改文件名为ctltest.cpp(后缀名改为.cpp),编译、链接并使程序正常工作(包括修正编译错误)
 
 

 

 

 

 

2.5 *用Button完成4*所要求的软键盘实现

 


2.6 创建各种类型的控件子窗口,在主窗口的窗口过程函数中增加相应的消息处理实现主窗口与子窗口的通信


创建EDIT、LISTBOX、BUTTON窗口进行测试:
1.EDIT窗口可以实现文本输入:
 
2.LISTBOX窗口在点击一行时会弹窗显示当前选项值:
 
3.BUTTON窗口在鼠标左键单击后会弹窗提示button已被按下:
 
2.7 新建用于资源测试的工程
 
2.8 增加新的资源:光标、图标,并正确显示
1.用资源编辑器编辑一个光标(彩色)
  
2.为光标设定热点(hot spot)
 
3.用资源编辑器编辑一个图标

 

 

 

 

 

 

4.修改注册窗口类的代码,使程序能正常使用自定义的光标和图标

 

5.用DrawIcon函数,在WM_PAINT消息中增加处理,在窗口客户区中显示自定义的光标及图标。

 

6.创建一个另外光标供后续实验步骤使用


 
2.9 增加菜单
1.菜单中建立一个菜单项命令以修改窗口使用的光标,可命名为“ChangeCursor”,对应的ID假设为ID_CHANGECURSOR
 

 

 

 

2.修改注册窗口类的代码,使程序运行时能正确载入菜单
 


 
3.换一种方式,通过修改创建窗口(CreateWindow)的代码,使菜单能正确载入
 
 
2.10 增加菜单消息响应代码
增加WM_COMMAND的消息处理,对ID_CHANGECURSOR命令的响应为:改变窗口使用的光标
 
菜单命令ChangeCursor后:
 
2.11 处理鼠标右键,增加快捷菜单处理
右键发出的菜单命令同样是通过WM_COMMAND消息响应的,增加快捷菜单之后,程序应该能通过主菜单或快捷菜单两种方式发出同样的命令
 
2.12 将本次实验做好的工程的编译、链接增加到程序构建使用的批处理文件中,用批处理文件一次性自动构建实验一、二、三的所有工程。
 
3 实验总结
本次实验相比之前的两次实验难度提升了很多,增添了需要自己思考摸索实现的部分,也正因此本次实验使我收获了很多:
1.    对GetWindowLong等函数有了更深的理解,从提取子窗口的ID,到绘制矩形,通过对相关函数的应用及断点调试,我对父窗口、子窗口之间的消息通知联系及相关操作有了更透彻的理解,只有理清父窗口与子窗口之间的关系,才能简洁有效地实现自己想要的东西。
2.    通过设计实现软键盘,我了解了更多子窗口的选中、释放,及父窗口做出响应的操作。并且在创作软键盘的过程中也对子窗口的布局有了更多的思考,在自己的探索尝试下,尽力做出了更加美观的软键盘,在努力实验的过程中也收获了一种成就感。回过头看,软键盘的制作并不复杂,但对于之前的我来说还是一个毫无头绪的项目,一个软键盘的从无到有也见证了我在课程中知识的学习、积累过程。
3.    控件测试部分更多的是课上程序示例的延伸,难度并不大,主要了解学习的知识是各个空间的结构和在窗口中如何去编写、如何应用来达到自己想要的效果。
4.    资源测试同上,在老师的耐心讲解下,课上就已经可以实现大部分实验要求的功能,自己的课下实验中主要是进行了程序对资源的应用等操作。
5.    相比上两个部分,我在菜单部分遇到了一些困难。跟着老师课上的操作,菜单的建立和引用等都没有实现的问题,在菜单功能的实现部分,根据实验中SetClassLong函数几次尝试后也可以实现。相对费时的部分在于快捷菜单的制作使用,这部分是需要自学制作的。在经过查阅资料及不断尝试之后,最终也完成了快捷菜单更换光标的操作。
6.    总的来说,本次实验是比较成功的,虽然耗时较多,但绝大部分项目都是在自己的努力下完成的,对Windows程序设计的知识有了更深的理解,一个个项目的实现也让我感到有付出就有回报。但与此同时,由于我实验进度较慢,选做项目的BUTTON软键盘没有实现,在下次实验中我会更加认真努力,及时完成实验,做好每一项实验任务。

 

 附录:关键代码

 

 

 

 

用GetWindowLong函数取出子窗口ID;

根据子窗口ID设定子窗口内需要显示的信息(使用wsprintf函数组织待显示的字符串)

    int number = GetWindowLong(hWnd, GWL_ID);//取出子窗口ID

    char string[20];

    wsprintf(string, TEXT("%d"), number);

case WM_PAINT:

DrawText(hdc, string,         //显示子窗口ID号

            -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

绘制特定颜色矩形

    HBRUSH hColorPen;

    HGDIOBJ  hGdiobj;

hColorPen = CreateSolidBrush(RGB(10, 100, 100));// 创建画笔并选择颜色

    hGdiobj = SelectObject(hdc, hColorPen);//选择区域使用画笔绘制

    Rectangle(hdc, 5, 20, 45, 45);

DeleteObject(hColorPen);//释放画笔

设计、实现一个软键盘:

#define ROW_NUM 4    //行数

#define COL_NUM 16   //列数

INT t = 0;//全局变量t,当第一次选中子窗口时即变为1,用于避免软键盘初始状态下输入字符

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

    static HWND hChildWnd[COL_NUM][ROW_NUM];  //子窗口句柄

    static int  nXBox, nYBox;                 //子窗口宽度和高度

    static WORD nChildWin_ID;                 //被命中的子窗口标识

    static int  nRow, nCol;                   //被命中的子窗口位置(即行列号)

    int         x, y;

WNDCLASS    wcChild;                      //子窗口类

   

switch (message)

{

case WM_CREATE:

...

//创建类似“画图”程序中绘图工具栏的各工具子窗口

for (y = 0; y < ROW_NUM; y++)

            for (x = 0; x < COL_NUM; x++)

            {

                nChildWin_ID = y << 4 | x;             //子窗口标识值 相当于y * 2^4 +4

                hChildWnd[x][y] = CreateWindow(szChildName, NULL,

                    WS_CHILDWINDOW | WS_DLGFRAME | WS_VISIBLE,

                    0, 0, 0, 0,

                    hWnd,

                    (HMENU)(nChildWin_ID),//子窗口id号

                    //0,

                    hInst, NULL);

}

return 0;

case WM_SIZE:

        nXBox = (LOWORD(lParam)*4/5)/ COL_NUM;

        nYBox = (HIWORD(lParam)*2/5) / ROW_NUM;

//主窗口大小改变时,重新确定各子窗口在主窗口客户区的位置

        for (y = 0; y < ROW_NUM; y++)

            for (x = 0; x < COL_NUM; x++)

            {

                MoveWindow(hChildWnd[x][y], (x * nXBox + LOWORD(lParam)/10),

                    (y * nYBox + HIWORD(lParam) / 3), nXBox, nYBox, TRUE);//x y 宽 高

            }

return 0;

case WM_COMMAND:                //子窗口被命中的通知消息

        //当子窗口被命中时发送此消息通知主窗口,以便由主窗口确定是否命中另一个子窗口,

        //若是,则发送消息通知子窗口函数改变前一次被命中子窗口的状态,

        if (!(LOWORD(wParam) == nChildWin_ID))

        {

            SendMessage((HWND)hChildWnd[nCol][nRow], WM_CHILDWIN, 0, 0L);

            //记录新的被命中的子窗口

            nChildWin_ID = LOWORD(wParam);

            nCol = (nChildWin_ID > 15) ? (nChildWin_ID - 16) : nChildWin_ID;

            nRow = nChildWin_ID >> 4;             

        }

        InvalidateRect(hWnd, NULL, TRUE);

    return 0;

case WM_PAINT:

        if (t)//有子窗口被命中后开始绘制显示对应的字符

        {

            HDC         hdc;

            PAINTSTRUCT ps;

            RECT        rect;

            LONG l = 0;

            GetClientRect(hWnd, &rect);

            hdc = BeginPaint(hWnd, &ps);

            int number = nChildWin_ID;

            static char string[100] = { 0 };

            static int n = 0;

            string[n] = number + 65;

            n++;

            DrawText(hdc, string, n, &rect, DT_SINGLELINE);

            EndPaint(hWnd, &ps);

        }

    return 0;

....

   

return DefWindowProc(hWnd, message, wParam, lParam);

} //函数 WinProc 结束

LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

...

case WM_LBUTTONDOWN:

        //新的子窗口被命中

        if (GetWindowLong(hWnd, 0) == 0)

        {

            t = 1;

            //置该子窗口命中标志为1

            SetWindowLong(hWnd, 0, 1);

            //发送消息通知主窗口

            SendMessage(GetParent(hWnd), WM_COMMAND,

                //(WPARAM) MAKELONG ((WORD)GetWindowWord (hWnd, GWL_ID), (WORD)0),

                GetWindowLong(hWnd, GWL_ID),

                (LPARAM)hWnd);

            //重绘子窗口客户区

            GetClientRect(hWnd, &rect);

            InvalidateRect(hWnd, &rect, TRUE);

        }

    return 0;

case WM_CHILDWIN:          //主窗口发送的通知消息,改变原命中子窗口的状态

        //置子窗口命中标志为0

        SetWindowLong(hWnd, 0, 0);

        //恢复子窗口初始显示方式

        GetClientRect(hWnd, &rect);

        InvalidateRect(hWnd, &rect, TRUE);

return 0;

    case WM_PAINT:

        hdc = BeginPaint(hWnd, &ps);

        GetClientRect(hWnd, &rect);

        Rectangle(hdc, 10, 10, 40, 40);//左高右底

         for (int j = 0; j < COL_NUM; j++)

            for (int i = 0; i < ROW_NUM; i++) //列数

            {

                char szBuff[50];

                char key = GetWindowLong(hWnd, GWL_ID) + 65;

                wsprintf(szBuff, TEXT("%c"), key); //绘制子窗口的字母

                DrawText(hdc, szBuff,

                    -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

            }

EndPaint(hWnd, &ps);

return 0;

case WM_DESTROY:

        PostQuitMessage(0);

        return 0;

    }

return DefWindowProc(hWnd, message, wParam, lParam);

} //函数 ChildWinProc 结束

创建各种类型的控件子窗口,在主窗口的窗口过程函数中增加相应的消息处理实现主窗口与子窗口的通信

#define ITEMCOUNT 5

WCHAR gListItems[ITEMCOUNT][60] = {

    L"MSG msg;",

    L"if (!InitWindow (hInstance, iCmdShow))",

    L"return FALSE;",

    L"GetMessage (&msg, NULL, 0, 0)",

    L"OK"

};

LRESULT CALLBACK WinProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

....

switch (message)

    {

        case WM_CREATE:         //创建消息

            hWndEdit = CreateWindow(TEXT("EDIT"),                   //EDIT

                NULL,                                //无标题

                WS_CHILD | WS_VISIBLE | WS_HSCROLL |    //编辑控件风格

                WS_VSCROLL | WS_BORDER | ES_LEFT |

                ES_MULTILINE | ES_AUTOHSCROLL |

                ES_AUTOVSCROLL,

                0, 0, 0, 0,

                hWnd,                                //父窗口句柄

                (HMENU)1,                            //编辑控件子窗口标识

                (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),

                NULL);

            hWndList = CreateWindow(TEXT("LISTBOX"),                    //LISTBOX                 NULL,                                //无标题

                WS_CHILD | WS_VISIBLE | LBS_STANDARD,   //编辑控件风格

                0, 0, 0, 0,

                hWnd,                                //父窗口句柄

                (HMENU)2,                            //编辑控件子窗口标识

                (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),

                NULL);

            hWndButton = CreateWindow(TEXT("BUTTON"),                 //BUTTON

                NULL,                                //无标题

                WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,

                0, 0, 0, 0,

                hWnd,                                //父窗口句柄

                (HMENU)3,                            //编辑控件子窗口标识

                (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),

                NULL);

            for (int i = 0; i < ITEMCOUNT; i++)

            {

                SendMessage(hWndList, LB_ADDSTRING, 0, (LPARAM)gListItems[i]);

            }

            return 0;

       

case WM_SIZE:

            MoveWindow(hWndEdit, 0, 0, LOWORD(lParam) / 3, HIWORD(lParam), TRUE);

            MoveWindow(hWndList, LOWORD(lParam) / 3 + 2, 0, LOWORD(lParam) / 3 - 5, HIWORD(lParam), TRUE);

            MoveWindow(hWndButton, 2*LOWORD(lParam)/3+2 , 0, 2*LOWORD(lParam)/3-5 , HIWORD(lParam), TRUE);

    return 0;

case WM_COMMAND:

            WORD w, W1, W2, W3;

            w = LOWORD(wParam);

            W1 = HIWORD(wParam);

            W2 = LOWORD(lParam);

            W3 = HIWORD(lParam);

            //编辑控件通知消息

            if ((LOWORD(wParam)) == 1)

            {

            }

            else if ((LOWORD(wParam)) == 2)

            {

                if (HIWORD(wParam) == LBN_SELCHANGE)

                {

                    WCHAR msg[32];

                    UINT u = SendMessage((HWND)lParam, LB_GETCURSEL, 0, 0);

                    wsprintf(msg, L"%d", u);

                    MessageBox(hWnd, msg, L"SEL", MB_OK);

                }

            }

            else if ((LOWORD(wParam)) == 3)

            {

                MessageBox(hWnd, TEXT("Button按下了!"), TEXT("窗口消息"), MB_OK);

            }

            return 0;

        case WM_DESTROY:

            PostQuitMessage(0);

            return 0;

    }

    //调用缺省消息处理过程

    return DefWindowProc (hWnd, message, wParam, lParam);

} //函数 WinProc 结束

修改注册窗口类代码,使程序能正常使用自定义的光标和图标

    wcMainWnd.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));//图标

    wcMainWnd.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));//光标

用DrawIcon函数,在WM_PAINT消息中增加处理,在窗口客户区中显示自定义的光标及图标

HICON        hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));

HCURSOR      hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));

...

DrawIcon(hdc, 160, 80, hIcon);

DrawIcon(hdc, 100, 80, hCursor);

处理鼠标右键,增加快捷菜单处理

HMENU hSubMenu;//全局变量

static BOOL InitWindow(HINSTANCE hInstance, int iCmdShow)

{

    ...

    HMENU hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU2));

    hSubMenu = GetSubMenu(hMenu, 1);

.....

}

LRESULT CALLBACK WinProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

...

case WM_RBUTTONDOWN:        //鼠标消息

        GetCursorPos(&stPos);//获取光标位置

        TrackPopupMenu(hSubMenu, TPM_LEFTALIGN, stPos.x, stPos.y, NULL, hWnd, NULL);//在指定位置显示快捷方式菜单

    return 0;

...

}

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

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

相关文章

【Vue】三:Vue核心处理---vue的其它指令和自定义指令

文章目录 1.vue的其它指令1.1v-text 和 v-html1.2 v-cloak1.3 v-once1.4 v-pre 2. 自定义指令2.1 函数式2.2 对象式2.3.定义全局的指令 1.vue的其它指令 1.1v-text 和 v-html v-text&#xff1a;当做文件解析。 v-html&#xff1a;当做 HTML 代码解析。 1.2 v-cloak v-cloa…

在自定义数据集上训练 YOLOv8——完整教程

Ultralytics 最近发布了 YOLOv8 系列对象检测模型。这些模型在 COCO 数据集上的速度和准确性都优于之前版本的 YOLO 模型。但是自定义数据集的性能如何呢?为了回答这个问题,我们将在自定义数据集上训练 YOLOv8 模型。具体来说,我们将在大规模坑洞检测数据集上对其进行训练。…

电子模块|压力传感器模块HX711---C51STM32驱动

电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动 实物照片模块简介模块特点 软件驱动C51软件代码STM32软件代码 实物照片 模块简介 HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比&#xff0c;该芯片集成了包括稳压电源、…

Rust 标准库字符串类型String及其46种常用方法

Rust字符串 Rust主要有两种类型的字符串&#xff1a;&str和String &str 由&[u8]表示&#xff0c;UTF-8编码的字符串的引用&#xff0c;字符串字面值&#xff0c;也称作字符串切片。&#xff06;str用于查看字符串中的数据。它的大小是固定的&#xff0c;即它不能…

网络层:IP地址

网络层&#xff1a;IP地址 笔记来源&#xff1a; 湖科大教书匠&#xff1a;IP地址 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 IP地址是因特网(Internet)上的主机和路由器所使用的地址&#xff0c;用于标识两部分信息&#xff1a; 网络编号&am…

Allegro16.6详细教程(一)

第一章User Interface 本章的主要內容介紹allegro操作介面,透過本章學習可以對Allegro的工作介面有了大致的瞭解,同時也能體驗出Allegro PCB Layout時的強大功能。 A.程式的啟動 除了以上Allegro主程式,我們還會常用到以下幾個常用工具: • Padstack Designer (Padstack…

《代码日记》

代码日记 Project :Space1、new_method.py new2.pynew3.pynew4.pynew5.py new5.1.pynew6.py Project :Space 都是在D001289数据集上的测试 1、new_method.py 先划分训练集和测试集 通过稀疏自编码器进行降维至20维度 自编器参数&#xff1a; # 训练自编码器模型autoencoder …

JavaEE进阶 Spring AOP(6/1)

目录 1.什么是AOP 2.Spring AOP可以干什么 3.AOP的组成成分 4.SpringAOP实现步骤 5.SpringAOP的原理 1.什么是AOP AOP是面向切面编程&#xff0c;是一种思想 Spring AOP是一种具体的技术 2.Spring AOP可以干什么 1.用户登录状态的判断 2.统一的日志记录&#xff08;比如记录…

基于深度学习的高精度牙齿健康检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度牙齿健康检测识别系统可用于日常生活中检测牙齿健康状况&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的牙齿目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数…

c++代码实现一个线程池(清晰明了,一看就懂)

线程池的应用 在我认知中&#xff0c;任何网络服务器都是一个死循环。这个死循环长下面这个样子。 基本上服务器框架都是基于这个架构而不断开发拓展的。 这个死循环总共分为四个步骤&#xff0c;可以涵盖所有客户端的需求&#xff0c;然而目前绝大多数企业不会用这样的架构。…

带有 Utopia Messenger 的免费 ChatGPT 助手

全世界都喜欢 ChatGPT&#xff01;而且这个工具从未如此易于访问。没有限制、没有VPN、没有代理和佣金。现在您可以使用 Utopia Messenger 的传奇聊天的全部功能。 ChatGPT是每个线上用户的必备工具。它为我们提供任何所需的数据&#xff0c;生成内容&#xff0c;并解决多项任…

[数据集][目标检测]目标检测数据集黄瓜数据集VOC格式1309张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1308 标注数量(xml文件个数)&#xff1a;1308 标注类别数&#xff1a;1 标注类别名称:["cucumber"] 每…

图论与算法(1)图论概念

1. 图论与算法 在计算机科学中&#xff0c;图论与算法是两个重要且紧密相关的领域。图论研究图的性质和特征&#xff0c;而算法设计和分析解决问题的方法和步骤。图论提供了一种形式化的方法来描述和分析各种关系和连接&#xff0c;而算法则为解决图相关的问题提供了有效的解决…

【刷题之路】单调栈秒解每日温度

一、题目描述 原题链接&#xff1a;https://leetcode.cn/problems/daily-temperatures/ 题目描述&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高…

【JVM】什么是双亲委派机制?

一、为什么会有这种机制&#xff1f; 类加载器将.class类加载到内存中时&#xff0c;为了避免重复加载&#xff08;确保Class对象的唯一性&#xff09;以及JVM的安全性&#xff0c;需要使用某一种方式来实现只加载一次&#xff0c;加载过就不能被修改或再次加载。 二、什么是双…

docker安装 sqlserver2017 或者 2008

一、必要条件 服务器的运行内存必须大于2GB 二、拉取2017镜像 docker pull mcr.microsoft.com/mssql/server:2017-latest三、启动镜像 docker run --name sqlserver2017 --restart always -v /home/ceshi1:/var/opt/mssql -d -e ACCEPT_EULAY -e SA_PASSWORDqwer!#123 -…

C语言参悟-运算符表达式和语句

C语言参悟-运算符表达式和语句 一、概述二、运算符0. 运算符分类1. 数学运算符2. 逻辑运算符3. 二进制运算符4. 便捷运算符 三、表达式四、语句 一、概述 在我刚开始学C语言的时候&#xff0c;语句和运算符号这些对我来说还是很陌生的。 现在来看我对于这个的理解其实就是一种…

AUTOSAR架构介绍

简介 AUTOSAR&#xff08;AUTomotive Open System ARchitecture&#xff09;是一种面向汽车电子系统的软件架构标准。AUTOSAR为汽车电子系统提供一种开放式的软件架构标准&#xff0c;以促进汽车电子系统的可重用性、互操作性和可扩展性。它包括一系列的规范和标准&#xff0c…

Force Dimension 全系列触觉反馈装置

力觉或触觉是人体感官中具有双向传递信息能力的信息载体。借助于力反馈&#xff0c;人们可以真实的按照人类的肢体语言进行人机自然互动和信息交流&#xff0c;用户通过应用力反馈&#xff0c;可以获得和触摸实际物体时相同的运动感&#xff0c;从而产生更真实的沉浸感。 力反馈…

毕业遭失业,前途一片黑暗...不得已转行软件测试,太多心酸和无助...

大家好&#xff0c;我叫小涵&#xff0c;一名应届毕业生&#xff0c;目前已经成功转行互联网。写这篇文章的目的是因为很多人不喜欢自己的现状&#xff0c;想通过学习改变&#xff0c;奈何没有出路&#xff0c;所以想为这部分人提供一些思路&#xff1b;其次文章会总结我自己转…