SDK 控件

目录

控件

控件创建

控件的消息处理

总代码


本篇文章对控件的学习,只是对基础的部分,简单的使用,包括消息的处理上,并不涉及深入的内容。

控件

区分控件,资源:

SDK通常提供了一系列常用的用户界面控件,如按钮、文本框、列表框、组合框等。开发人员可以使用这些控件来构建应用程序的用户界面。SDK通常提供了各种图像、图标和光标资源,开发人员可以使用这些资源来美化应用程序的用户界面。

控件的使用很方便,直接拖过去即可

程序员只需要处理好这些控件的消息也就是(ID)即可

所有控件消息都是WM_COMMAND,各种不同消息的区分就要靠 wParam,lParam这两个参数的信息

一些常用控件的学习可以参考:SDK05- 控件_黑桃鱼的博客-CSDN博客

他人珠玉在前,不再献丑

控件创建

创建控件其实也就是创建一个窗口,指定一个父窗口即可,同时安排好控件的大小位置

按钮一

	// 创建子窗口(控件)控件的操作都会产生Command消息HWND hButton1 = CreateWindowEx(0,_T("BUTTON"),_T("是否打勾"),WS_CHILD | WS_VISIBLE | BS_CHECKBOX | LBS_NOTIFY,  //组合属性,可拉伸窗口0,0,100,50,hWnd,(HMENU)IDB_BUTTON1,g_hInstance,NULL);

按钮二

	HWND hButton2 = CreateWindowEx(0,_T("BUTTON"),_T("粘贴"),WS_CHILD | WS_VISIBLE, // 还可以给按加别的样式BS_开头100,                    //按钮可打勾0,100,50,hWnd,(HMENU)IDB_BUTTON2,g_hInstance,NULL);

编辑框

	HWND hEdit = CreateWindowEx(0,_T("Edit"),NULL,WS_CHILD | WS_VISIBLE | WS_VSCROLL |ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,  //组合属性,可拉伸窗口0,     // ws通用 es Edit控件单独有的60,200,100,hWnd,(HMENU)IDE_Edit1,g_hInstance,NULL);

列表

	HWND hListBox = CreateWindowEx(0,_T("ListBox"),_T("编程语言列表"),WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_HASSTRINGS,  //组合属性,可拉伸窗口0,     // ws通用 es Edit控件单独有的200,200,100,hWnd,(HMENU)IDL_LISTBOX,g_hInstance,NULL);

控件的消息处理

控件的消息都会被转换成WM_COMMAND消息

代码如下:

lParam是控件的句柄,在逻辑中就是先判断是控件的消息,控件句柄是否为空,是控件的消息的话,再更具wParam的低字(控件标识符)来进一步区分是哪一个控件,wParam的高字则是消息,再去进一步处理

LRESULT OnCommand(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {OutputDebugString(_T("[51asm] OnCommand\n"));WORD wID = LOWORD(wParam);WORD wNotifyCode = HIWORD(wParam);HWND hColtrol = (HWND)lParam;if (hColtrol != NULL) { //控件if (wID == IDB_BUTTON1) {if (wNotifyCode == BN_CLICKED) {LRESULT Result = SendMessage(hColtrol, BM_GETCHECK, 0, 0);if (BST_CHECKED == Result) {SendMessage(hColtrol, BM_SETCHECK, BST_UNCHECKED, NULL);MessageBox(NULL, _T("未婚"), _T("婚姻状况"), MB_OK);}else if (BST_UNCHECKED == Result) {SendMessage(hColtrol, BM_SETCHECK, BST_CHECKED, NULL);MessageBox(NULL, _T("已婚"), _T("婚姻状况"), MB_OK);}}}else if (wID == IDB_BUTTON2) {if (wNotifyCode == BN_CLICKED) {HWND hEdit = GetDlgItem(hwnd, IDE_Edit1);char szText[] = { "" };SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)szText); // 直接调用窗口过程函数,知道过程函数返回,否则就会一直卡在这里SendMessage(hEdit, WM_PASTE, 0, 0);}}if (wID == IDL_LISTBOX && wNotifyCode == LBN_SELCHANGE) {int nIndex = SendMessage(hColtrol, LB_GETCURSEL, 0, 0);if (nIndex != -1) {int nLen = SendMessage(hColtrol, LB_GETTEXTLEN, nIndex, 0);LPVOID lpBuff = malloc(nLen+1);SendMessage(hColtrol, LB_GETTEXT, nIndex, (LPARAM)lpBuff);MessageBoxA(hwnd, (char*)lpBuff, "51asm", MB_OK);free(lpBuff);}}return TRUE;}switch (wID) {case IDM_OPEN:MessageBox(NULL, _T("打开"), _T("51asm"), MB_OK);break;case IDM_SAVE:MessageBox(NULL, _T("保存"), _T("51asm"), MB_OK);case IDM_EXIT:SendMessage(hwnd, WM_USER + 1, NULL, NULL);// 向窗口发送一个消息PostQuitMessage(0); // 给自己投递QUIT消息// 操作窗口,想窗口发消息  WM_USER 0x0400开始//SendMessage(hwnd,WM_USER+1,NULL,NULL);// 向窗口发送一个消息break;}return TRUE;
}

总代码

#include <windows.h>
#include <tchar.h>
#include <fstream>
#include <string>#ifdef _DEBUG#define MYOUTPUT OutputDebugString
#else #define MYOUTPUT
#endif // DEBUG#define IDM_OPEN 102
#define IDM_SAVE 103
#define IDM_EXIT 104#define IDB_BUTTON1 105
#define IDB_BUTTON2 106
#define IDE_Edit1 107
#define IDL_LISTBOX 108#define MY_MSG WM_USER+1  // 用户自定义消息using namespace std;string g_Text;
TEXTMETRIC g_tm; // 字体信息HINSTANCE g_hInstance = NULL;void ShowErrorMsg() {LPVOID lpMsgBuf;FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf,0,NULL);MessageBox(NULL, (LPCTSTR)lpMsgBuf, _T("ERROR"), MB_OK | MB_ICONINFORMATION);LocalFree(lpMsgBuf);
}LRESULT OnCreate(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {OutputDebugString(_T("[51asm]: WM_Create\n"));// 创建一个定时器,有两种调用方式,100毫秒画一次
// 	SetTimer(hwnd, 1, 1000, nullptr);
// 	SetTimer(hwnd, 2, 1000, nullptr);return TRUE;
}// 当你关闭窗口点击确定后就会向窗口发送WM_Destroy消息,就意味要销毁窗口,
LRESULT OnClose(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {OutputDebugString(_T("[51asm]: WM_Close\n"));return FALSE;
}// 这个工作可以交给系统处理,也可以自己处理
LRESULT OnDestroy(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {OutputDebugString(_T("[51asm]: WM_Destory\n"));PostQuitMessage(0);// 销毁定时器,倘若有多个窗口,销毁一个窗口而不是全部KillTimer(hwnd, 1);return TRUE;
}LRESULT OnCommand(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {OutputDebugString(_T("[51asm] OnCommand\n"));WORD wID = LOWORD(wParam);WORD wNotifyCode = HIWORD(wParam);HWND hColtrol = (HWND)lParam;if (hColtrol != NULL) { //控件if (wID == IDB_BUTTON1) {if (wNotifyCode == BN_CLICKED) {LRESULT Result = SendMessage(hColtrol, BM_GETCHECK, 0, 0);if (BST_CHECKED == Result) {SendMessage(hColtrol, BM_SETCHECK, BST_UNCHECKED, NULL);MessageBox(NULL, _T("未婚"), _T("婚姻状况"), MB_OK);}else if (BST_UNCHECKED == Result) {SendMessage(hColtrol, BM_SETCHECK, BST_CHECKED, NULL);MessageBox(NULL, _T("已婚"), _T("婚姻状况"), MB_OK);}}}else if (wID == IDB_BUTTON2) {if (wNotifyCode == BN_CLICKED) {HWND hEdit = GetDlgItem(hwnd, IDE_Edit1);char szText[] = { "" };SendMessage(hEdit, WM_SETTEXT, 0, (LPARAM)szText); // 直接调用窗口过程函数,知道过程函数返回,否则就会一直卡在这里SendMessage(hEdit, WM_PASTE, 0, 0);}}if (wID == IDL_LISTBOX && wNotifyCode == LBN_SELCHANGE) {int nIndex = SendMessage(hColtrol, LB_GETCURSEL, 0, 0);if (nIndex != -1) {int nLen = SendMessage(hColtrol, LB_GETTEXTLEN, nIndex, 0);LPVOID lpBuff = malloc(nLen+1);SendMessage(hColtrol, LB_GETTEXT, nIndex, (LPARAM)lpBuff);MessageBoxA(hwnd, (char*)lpBuff, "51asm", MB_OK);free(lpBuff);}}return TRUE;}switch (wID) {case IDM_OPEN:MessageBox(NULL, _T("打开"), _T("51asm"), MB_OK);break;case IDM_SAVE:MessageBox(NULL, _T("保存"), _T("51asm"), MB_OK);case IDM_EXIT:SendMessage(hwnd, WM_USER + 1, NULL, NULL);// 向窗口发送一个消息PostQuitMessage(0); // 给自己投递QUIT消息// 操作窗口,想窗口发消息  WM_USER 0x0400开始//SendMessage(hwnd,WM_USER+1,NULL,NULL);// 向窗口发送一个消息break;}return TRUE;
}BOOL InitControl(HWND hWnd) {// 创建子窗口(控件)控件的操作都会产生Command消息HWND hButton1 = CreateWindowEx(0,_T("BUTTON"),_T("是否打勾"),WS_CHILD | WS_VISIBLE | BS_CHECKBOX | LBS_NOTIFY,  //组合属性,可拉伸窗口0,0,100,50,hWnd,(HMENU)IDB_BUTTON1,g_hInstance,NULL);HWND hButton2 = CreateWindowEx(0,_T("BUTTON"),_T("粘贴"),WS_CHILD | WS_VISIBLE, // 还可以给按加别的样式BS_开头100,                    //按钮可打勾0,100,50,hWnd,(HMENU)IDB_BUTTON2,g_hInstance,NULL);HWND hEdit = CreateWindowEx(0,_T("Edit"),NULL,WS_CHILD | WS_VISIBLE | WS_VSCROLL |ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,  //组合属性,可拉伸窗口0,     // ws通用 es Edit控件单独有的60,200,100,hWnd,(HMENU)IDE_Edit1,g_hInstance,NULL);HWND hListBox = CreateWindowEx(0,_T("ListBox"),_T("编程语言列表"),WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_HASSTRINGS,  //组合属性,可拉伸窗口0,     // ws通用 es Edit控件单独有的200,200,100,hWnd,(HMENU)IDL_LISTBOX,g_hInstance,NULL);SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"C语言");SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"C++");SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)"C数据结构");// 操作控件发消息SendMessage(hButton1, BM_SETCHECK, BST_UNCHECKED, NULL);return TRUE;}LRESULT OnKeyDown(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {OutputDebugString(_T("[51asm]: OnKeyDown\n"));return TRUE;
}LRESULT OnKeyUp(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {OutputDebugString(_T("[51asm]: OnKeyUp\n"));return TRUE;
}// 定时器消息
LRESULT OnTimer(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {if (wParam == 1) {MYOUTPUT(_T("[51asm]: OnTimer\n"));HWND hDesktop = GetDesktopWindow();HDC hdc = GetDC(hDesktop);TextOut(hdc, 0, 0, _T("51asm"), 5);ReleaseDC(hDesktop,hdc);//CloseHandle(hDesktop); GetDesktopWinodw()函数的句柄不需要用户释放MYOUTPUT(_T("[51asm]: OnTimer ID=1 \n"));}else if (wParam == 2){MYOUTPUT(_T("[51asm]: OnTimer ID=2 \n"));}return TRUE;
}LRESULT OnNotify(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {OutputDebugString(_T("[51asm]: OnNotify\n"));NMHDR* pnmh = (LPNMHDR)lParam;if (wParam == IDL_LISTBOX) {int nIndex = SendMessage(pnmh->hwndFrom, LB_GETCURSEL, 0, 0);if (nIndex != -1) {int nLen = SendMessage(pnmh->hwndFrom, LB_GETTEXTLEN, nIndex, 0);LPVOID lpBuff = malloc(nLen);SendMessage(pnmh->hwndFrom, LB_GETTEXT, nIndex, (LPARAM)lpBuff);MessageBoxA(hwnd, (char*)lpBuff, "51asm", MB_OK);free(lpBuff);}}return TRUE;
}// 消息处理
// 可以下断点debug调试分析消息,在监视这里可以 uMsg.wm 可以以看到
// 先创建非客户区,再创建客户区,还有创建窗口等很多消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {LRESULT lResult = FALSE;switch (uMsg) {case WM_NOTIFY:lResult = OnNotify(hwnd, uMsg, wParam, lParam);break;case WM_CREATE:lResult = OnCreate(hwnd, uMsg, wParam, lParam); break;case WM_CLOSE:lResult = OnClose(hwnd, uMsg, wParam, lParam);break;case WM_DESTROY:lResult = OnDestroy(hwnd, uMsg, wParam, lParam);break;case WM_COMMAND:   lResult = OnCommand(hwnd, uMsg, wParam, lParam);break;case WM_KEYDOWN:     lResult = OnKeyDown(hwnd, uMsg, wParam, lParam);break;case WM_KEYUP:    lResult = OnKeyUp(hwnd, uMsg, wParam, lParam);break;case WM_TIMER:lResult = OnTimer(hwnd, uMsg, wParam, lParam);break;case MY_MSG:MessageBox(NULL, _T("我的消息"), NULL, NULL);}if (!lResult) {return DefWindowProc(hwnd, uMsg, wParam, lParam); // 默认窗口过程处理函数,包括销毁窗口}return lResult;
}/*客户区(用户区)与非客户区(系统的) NC*/int WINAPI wWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPWSTR lpCmdLine,int nShowCmd
) {g_hInstance = hInstance;// 申请堆控件,因为快捷键需要全局访问// 申请100字节的局部堆地址空间// 这样设计的原因,内存空间申请释放,产生了很多碎片,通过把这些碎片整理得到一个更大的内存空间,这是地址变化了// 申请局部堆地址HLOCAL hMenu = LocalAlloc(LHND, 100);LPVOID lpMemory = LocalLock(hMenu);LocalFree(hMenu);// 申请全局堆地址// 原因:16位系统,有全局堆和局部堆;32位,两者合并,只有一个堆GlobalAlloc(LHND, 100);// 申请堆空间// 新的API,返回值是一个地址,前两个函数的底层是调用这个//HeapAlloc();// 申请堆地址空间,可以指定内存属性//VirtualAlloc();ACCEL* pAccelNews = (ACCEL*)HeapAlloc(GetProcessHeap(), 0, sizeof(ACCEL) * 2);if (pAccelNews == nullptr) {ShowErrorMsg();return 0;}// 快捷键,可以用下面的写法,把快捷键和菜单消息一起处理
// 	pAccelNews[0].fVirt = FALT | FCONTROL | FVIRTKEY;
// 	pAccelNews[0].key = 'A';
// 	pAccelNews[0].cmd = WM_COMMAND;// pAccelNews[1].fVirt = FCONTROL | FVIRTKEY;pAccelNews[1].key = 'S';pAccelNews[1].cmd = IDM_SAVE;// 创建快捷键表HACCEL hAccel = CreateAcceleratorTable(pAccelNews, 2);if (hAccel == NULL) {ShowErrorMsg();return 0;}// 创建窗口实例TCHAR szWndClassName[] = { _T("CR41WndClassName") };WNDCLASSEX wc = { 0 };wc.cbSize = sizeof(WNDCLASSEX);wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;wc.lpfnWndProc = WindowProc;wc.hInstance = hInstance;wc.hIcon = LoadIcon(NULL, IDI_HAND);wc.hCursor = LoadCursor(NULL, IDC_ARROW);wc.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));wc.lpszMenuName = NULL;wc.lpszClassName = szWndClassName;// 注册窗口if (RegisterClassEx(&wc) == 0) {ShowErrorMsg();return 0;}// 创建窗口TCHAR szWndName[] = { _T("51asm") };HWND hWnd = CreateWindowEx(0,szWndClassName,szWndName,WS_OVERLAPPEDWINDOW,  //组合属性,可拉伸窗口CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);if (hWnd == NULL) {ShowErrorMsg();return 0;}// 菜单HMENU HMenu = CreateMenu();// 弹出菜单BOOL ret;ret = AppendMenu(HMenu, MF_STRING | MF_POPUP, (UINT_PTR)HMenu, _T("文件(&F)"));ret = AppendMenu(HMenu, MF_STRING | MF_POPUP, (UINT_PTR)HMenu, _T("编辑(&E)"));SetMenu(hWnd, HMenu);// 添加子菜单HMENU hSubMenu = GetSubMenu(HMenu, 0);ret = AppendMenu(hSubMenu, MF_STRING, IDM_OPEN, _T("打开(&O)"));ret = AppendMenu(hSubMenu, MF_STRING, IDM_SAVE, _T("保存(&O)"));ret = AppendMenu(hSubMenu, MF_STRING, IDM_EXIT, _T("退出(&O)"));SetMenu(hWnd, HMenu);RECT rc;GetClientRect(hWnd, &rc);// 创建子窗口(控件)InitControl(hWnd);// 显示,更新窗口ShowWindow(hWnd, SW_SHOWNORMAL); // 调用Show时候父子窗口都会被调用//ShowWindow(hChild, SW_SHOWNORMAL);  非子窗口需要单独showUpdateWindow(hWnd);  // 产生WM_PAINTSetClassLong(hWnd, GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_CROSS));// 消息循环BOOL bRet;MSG msg;while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0){if (bRet == -1) {break;}else {// 转换快捷键消息 WM_COMMANDif (!TranslateAccelerator(hWnd, hAccel, &msg)) {TranslateMessage(&msg);// 转换键盘消息DispatchMessage(&msg); // 派发消息}}}// 删除快捷键表DestroyAcceleratorTable(hAccel);HeapFree(GetProcessHeap(), 0, pAccelNews);return msg.wParam;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openEuler 22.03 LTS 环境使用 Docker Compose 一键部署 JumpServer (all-in-one 模式)

环境回顾 上一篇文章中&#xff0c;我们讲解了 openEuler 22.03 LTS 安装 Docker CE 和 Dcoker Compose&#xff0c;部署的软件环境版本分别如下&#xff1a; OS 系统&#xff1a;openEuler 22.03 LTS(openEuler-22.03-LTS-x86_64-dvd.iso)Docker Engine&#xff1a;Docker C…

GEE案例——一个完整的火灾监测案例dNBR差异化归一化烧毁指数

差异化归一化烧毁指数 dNBR是"差异化归一化烧毁指数"的缩写。它是一种用于评估卫星图像中烧毁区域严重程度的遥感指数。dNBR值通过将火灾前的归一化烧毁指数(NBR)减去火灾后的NBR来计算得出。该指数常用于野火监测和评估。 dNBR(差异化归一化烧毁指数)是一种用…

汇编运算符和表达式

运算符&#xff1a; 汇编语言由表达式和运算符组成&#xff0c;运算符分为数值运算符和属性运算符。属性运算符面向变量或标号。 数值运算符&#xff1a; 算术运算符&#xff1a; 运算符类型 ✓ ( 正号 ) 、 -( 负号 ) ✓ ( 加 ) 、 -( 减 ) 、 *( 乘 ) 、 /( 除 ) 、 MO…

Tensorflow2 中模型训练标签顺序和预测结果标签顺序不一致问题解决办法

本篇文章将详细介绍Tensorflow2.x中模型训练标签顺序和预测结果标签顺序不一致问题&#xff0c;这个问题如果考虑不周&#xff0c;或者标签顺序没有控制好的情况下会出现预测结果精度极其不准确的情况。 训练数据集的结构&#xff1a;数据集有超过10的类别数&#xff0c;这里包…

私有云:【3】NFS存储服务器的安装

私有云&#xff1a;【3】NFS存储服务器的安装 1、使用vmwork创建虚拟机2、配置NFS服务器3、安装NFS存储服务4、配置NFS服务及创建存储共享 1、使用vmwork创建虚拟机 新建虚拟机NFS 分配400G硬盘&#xff0c;可以更高【用作存储】 自定义硬件 选择win2012的iso文件 设置登录密码…

python爬虫request和BeautifulSoup使用

request使用 1.安装request pip install request2.引入库 import requests3.编写代码 发送请求 我们通过以下代码可以打开豆瓣top250的网站 response requests.get(f"https://movie.douban.com/top250"&#xff09;但因为该网站加入了反爬机制&#xff0c;所以…

在 Windows 用 Chrome System Settings 设置代理

在 Windows 用 Chrome System Settings 设置代理 贴心提示&#xff1a;在设置代理之前&#xff0c;请确保您已经安装了 浏览器。 &#x1f527; 设置代理的详细步骤如下&#xff1a; 打开 浏览器&#xff0c;输入 //settings/system 并回车。 在「系统和网络设置」页面中&am…

C++----模板进阶

文章目录 非类型模板参数STL知识补充 类模板的特化函数模板特化类模板特化偏特化 模板的分离编译模板总结 非类型模板参数 模板参数分为类型形参与非类型形参。 类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参…

Seata入门系列【15】@GlobalLock注解使用场景及源码分析

1 前言 在Seata 中提供了一个全局锁注解GlobalLock&#xff0c;字面意思是全局锁&#xff0c;搜索相关文档&#xff0c;发现资料很少&#xff0c;所以分析下它的应用场景和基本原理&#xff0c;首先看下源码中对该注解的说明&#xff1a; // 声明事务仅在单个本地RM中执行 //…

Docker Harbor概述及构建

Docker Harbor概述及构建 一、Docker Harbor 概述1.1、harbor 简介1.2、Harbor的优势1.3、Harbor 的核心组件1.4、Docker私有仓库 架构 二、Harbor构建Docker私有仓库2.1 环境配置2.2、部署Harbor服务2.2.1、上传dock-compose&#xff0c;并设置权限2.2.2、安装harbor-offline-…

软考系列(系统架构师)- 2011年系统架构师软考案例分析考点

试题一 软件架构&#xff08;质量属性效用树、架构风险、敏感点、权衡点&#xff09; 【问题2】&#xff08;13分&#xff09; 在架构评估过程中&#xff0c;需要正确识别系统的架构风险、敏感点和权衡点&#xff0c;并进行合理的架构决策。请用300字以内的文字给出系统架构风险…

MySQL主从复制(基于binlog日志方式)

目录 一、什么是主从复制&#xff1f;二、主从复制原理、存在问题和解决方法2.1.主从复制原理2.2.主从复制存在的问题以及解决办法2.3.主从复制的同步模型2.4.拓展—Mysql并行复制 三、主从复制之基于binlog日志方式3.1.bin-log日志简介3.2.bin-log的使用3.2.1.开启binlog3.2.2…