📄 myprogdlg.cpp
字号:
// MYPROGDlg.cpp : implementation file
//
#include "stdafx.h"
#include "MYPROG.h"
#include "MYPROGDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMYPROGDlg dialog
CMYPROGDlg::CMYPROGDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMYPROGDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMYPROGDlg)
m_csCom = _T("");
m_csMessage = _T("");
m_hexfile = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMYPROGDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMYPROGDlg)
DDX_Control(pDX, IDC_COMBO_DEVICE, m_ComboBox_Device);
DDX_Control(pDX, IDC_OPENS, m_opens);
DDX_Control(pDX, IDC_PROGRESS1, m_nProgress);
DDX_Text(pDX, IDC_STATIC_COM, m_csCom);
DDX_Text(pDX, IDC_STATIC_MESSAGE, m_csMessage);
DDX_Text(pDX, IDC_EDIT_HEX, m_hexfile);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMYPROGDlg, CDialog)
//{{AFX_MSG_MAP(CMYPROGDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(NM_CLICK, IDC_LIST3, OnClickList3)
ON_BN_CLICKED(IDOK, OnOpens)
ON_CBN_SELCHANGE(IDC_COMBO_DEVICE, OnSelchangeComboDevice)
ON_BN_CLICKED(IDC_BUTTON_EXPLORER, OnButtonExplorer)
ON_BN_CLICKED(IDC_BUTTON_SREAD, OnButtonSread)
ON_BN_CLICKED(IDC_BUTTON_SPROG, OnButtonSprog)
ON_BN_CLICKED(IDC_BUTTON_ERASE, OnButtonErase)
ON_CBN_SELCHANGE(IDC_COMBO_LOCK1, OnSelchangeComboLock1)
ON_CBN_SELCHANGE(IDC_COMBO_LOCK2, OnSelchangeComboLock2)
ON_CBN_SELCHANGE(IDC_COMBO_LOCK3, OnSelchangeComboLock3)
ON_BN_CLICKED(IDC_BUTTON_FPROG, OnButtonFprog)
ON_BN_CLICKED(IDC_BUTTON_FREAD, OnButtonFread)
ON_BN_CLICKED(IDC_BUTTON_FVERI, OnButtonFveri)
ON_BN_CLICKED(IDC_BUTTON_EPROG, OnButtonEprog)
ON_BN_CLICKED(IDC_BUTTON_EVERI, OnButtonEveri)
ON_BN_CLICKED(IDC_BUTTON_EREAD, OnButtonEread)
ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
ON_BN_CLICKED(IDC_CHECK2, OnCheck2)
ON_BN_CLICKED(IDC_CHECK3, OnCheck3)
ON_BN_CLICKED(IDC_CHECK4, OnCheck4)
ON_BN_CLICKED(IDC_CHECK5, OnCheck5)
ON_BN_CLICKED(IDC_CHECK6, OnCheck6)
ON_CBN_SELCHANGE(IDC_COMBO_FUSE1, OnSelchangeComboFuse1)
ON_CBN_SELCHANGE(IDC_COMBO_FUSE2, OnSelchangeComboFuse2)
ON_CBN_SELCHANGE(IDC_COMBO_FUSE3, OnSelchangeComboFuse3)
ON_CBN_SELCHANGE(IDC_COMBO_FUSE4, OnSelchangeComboFuse4)
ON_BN_CLICKED(IDC_CHECK0, OnCheck0)
ON_BN_CLICKED(IDC_CHECK7, OnCheck7)
ON_BN_CLICKED(IDC_CHECK8, OnCheck8)
ON_BN_CLICKED(IDC_CHECK9, OnCheck9)
ON_BN_CLICKED(IDC_CHECK10, OnCheck10)
ON_BN_CLICKED(IDC_CHECK11, OnCheck11)
ON_BN_CLICKED(IDC_CHECK12, OnCheck12)
ON_BN_CLICKED(IDC_CHECK13, OnCheck13)
ON_BN_CLICKED(IDC_CHECK14, OnCheck14)
ON_BN_CLICKED(IDC_CHECK15, OnCheck15)
ON_BN_CLICKED(IDC_CHECK16, OnCheck16)
ON_BN_CLICKED(IDC_CHECK17, OnCheck17)
ON_BN_CLICKED(IDC_CHECK18, OnCheck18)
ON_BN_CLICKED(IDC_CHECK19, OnCheck19)
ON_BN_CLICKED(IDC_CHECK20, OnCheck20)
ON_BN_CLICKED(IDC_CHECK21, OnCheck21)
ON_BN_CLICKED(IDC_CHECK22, OnCheck22)
ON_BN_CLICKED(IDC_CHECK23, OnCheck23)
ON_BN_CLICKED(IDC_CHECK_L0, OnCheckL0)
ON_BN_CLICKED(IDC_CHECK_L1, OnCheckL1)
ON_BN_CLICKED(IDC_CHECK_L2, OnCheckL2)
ON_BN_CLICKED(IDC_CHECK_L3, OnCheckL3)
ON_BN_CLICKED(IDC_CHECK_L4, OnCheckL4)
ON_BN_CLICKED(IDC_CHECK_L5, OnCheckL5)
ON_BN_CLICKED(IDC_CHECK_L6, OnCheckL6)
ON_BN_CLICKED(IDC_OPENS, OnOpens)
ON_BN_CLICKED(IDC_CHECK_L7, OnCheckL7)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMYPROGDlg message handlers
BOOL CMYPROGDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//锁位部分
lockGroup=(CButton*)GetDlgItem(IDC_STATIC_GROUPLOCK);
lock=(CButton*)GetDlgItem(IDC_STATIC_LOCK);
lockb[0 ]=(CButton*)GetDlgItem(IDC_CHECK_L0);
lockb[1 ]=(CButton*)GetDlgItem(IDC_CHECK_L1);
lockb[2 ]=(CButton*)GetDlgItem(IDC_CHECK_L2);
lockb[3 ]=(CButton*)GetDlgItem(IDC_CHECK_L3);
lockb[4 ]=(CButton*)GetDlgItem(IDC_CHECK_L4);
lockb[5 ]=(CButton*)GetDlgItem(IDC_CHECK_L5);
lockb[6 ]=(CButton*)GetDlgItem(IDC_CHECK_L6);
lockb[7 ]=(CButton*)GetDlgItem(IDC_CHECK_L7);
lock1Combo = (CComboBox*)GetDlgItem(IDC_COMBO_LOCK1);
lock2Combo = (CComboBox*)GetDlgItem(IDC_COMBO_LOCK2);
lock3Combo = (CComboBox*)GetDlgItem(IDC_COMBO_LOCK3);
//熔丝部分
fuseGroup=(CButton*)GetDlgItem(IDC_STATIC_GROUPFUSE);
fuse0=(CButton*)GetDlgItem(IDC_STATIC_FUSE0);
fuse1=(CButton*)GetDlgItem(IDC_STATIC_FUSE1);
fuse2=(CButton*)GetDlgItem(IDC_STATIC_FUSE2);
check[0 ] = (CButton*)GetDlgItem(IDC_CHECK0 );
check[1 ] = (CButton*)GetDlgItem(IDC_CHECK1 );
check[2 ] = (CButton*)GetDlgItem(IDC_CHECK2 );
check[3 ] = (CButton*)GetDlgItem(IDC_CHECK3 );
check[4 ] = (CButton*)GetDlgItem(IDC_CHECK4 );
check[5 ] = (CButton*)GetDlgItem(IDC_CHECK5 );
check[6 ] = (CButton*)GetDlgItem(IDC_CHECK6 );
check[7 ] = (CButton*)GetDlgItem(IDC_CHECK7 );
check[8 ] = (CButton*)GetDlgItem(IDC_CHECK8 );
check[9 ] = (CButton*)GetDlgItem(IDC_CHECK9 );
check[10] = (CButton*)GetDlgItem(IDC_CHECK10);
check[11] = (CButton*)GetDlgItem(IDC_CHECK11);
check[12] = (CButton*)GetDlgItem(IDC_CHECK12);
check[13] = (CButton*)GetDlgItem(IDC_CHECK13);
check[14] = (CButton*)GetDlgItem(IDC_CHECK14);
check[15] = (CButton*)GetDlgItem(IDC_CHECK15);
check[16] = (CButton*)GetDlgItem(IDC_CHECK16);
check[17] = (CButton*)GetDlgItem(IDC_CHECK17);
check[18] = (CButton*)GetDlgItem(IDC_CHECK18);
check[19] = (CButton*)GetDlgItem(IDC_CHECK19);
check[20] = (CButton*)GetDlgItem(IDC_CHECK20);
check[21] = (CButton*)GetDlgItem(IDC_CHECK21);
check[22] = (CButton*)GetDlgItem(IDC_CHECK22);
check[23] = (CButton*)GetDlgItem(IDC_CHECK23);
fuse1Combo = (CComboBox*)GetDlgItem(IDC_COMBO_FUSE1);
fuse2Combo = (CComboBox*)GetDlgItem(IDC_COMBO_FUSE2);
fuse3Combo = (CComboBox*)GetDlgItem(IDC_COMBO_FUSE3);
fuse4Combo = (CComboBox*)GetDlgItem(IDC_COMBO_FUSE4);
//操作
sreadButton=(CButton*)GetDlgItem(IDC_BUTTON_SREAD);
sprogButton=(CButton*)GetDlgItem(IDC_BUTTON_SPROG);
eraseButton=(CButton*)GetDlgItem(IDC_BUTTON_ERASE);
//////////////////////////////////////////////////////////////////////////////////////////////////
m_nProgress.SetPos(0);
EnableFlash(FALSE);
EnableEeprom(FALSE);
DisableLockAndFuse();
CButton* OpensButton=(CButton*)GetDlgItem(IDC_OPENS);
OpensButton->EnableWindow(FALSE);
SetDlgItemText(IDC_STATIC_SW, "");
SetDlgItemText(IDC_STATIC_HW, "");
SetDlgItemText(IDC_STATIC_NAME, "");
/*
LONG RegOpenKeyEx(
HKEY hKey, // handle to open key
LPCTSTR lpSubKey, // address of name of subkey to open
DWORD ulOptions, // reserved
REGSAM samDesired, // security access mask
PHKEY phkResult // address of handle to open key
);
LONG RegEnumValue(
HKEY hKey, // handle to key to query
DWORD dwIndex, // index of value to query
LPTSTR lpValueName, // address of buffer for value string
LPDWORD lpcbValueName, // address for size of value buffer
LPDWORD lpReserved, // reserved
LPDWORD lpType, // address of buffer for type code
LPBYTE lpData, // address of buffer for value data
LPDWORD lpcbData // address for size of data buffer
);
LONG RegQueryValueEx(
HKEY hKey, // handle to key to query
LPTSTR lpValueName, // address of name of value to query
LPDWORD lpReserved, // reserved
LPDWORD lpType, // address of buffer for value type
LPBYTE lpData, // address of data buffer
LPDWORD lpcbData // address of data buffer size
);
*/
#define MAXKEYPATH 99
HKEY hKey = HKEY_LOCAL_MACHINE;
LPCTSTR lpSubKey = "HARDWARE\\DEVICEMAP\\SERIALCOMM";
REGSAM samDesired = KEY_READ;
DWORD dwIndex = 0;
LPDWORD lpType =new DWORD; *lpType= REG_SZ;
LPBYTE COMName =new BYTE[80];
LPDWORD lpcbData=new DWORD; *lpcbData=80;
char COMObject[MAXKEYPATH];
LPSTR lpszDescBuff = NULL;
DWORD rc;
DWORD dwBufSize=MAXKEYPATH;
CListCtrl* p1;
rc = RegOpenKeyEx(hKey,lpSubKey,0,samDesired,&hKey);
if (rc == ERROR_SUCCESS)
{
p1= (CListCtrl*)GetDlgItem(IDC_LIST3);
//p1->SetBkColor(RGB(255,255,255));
//p1->SetTextBkColor(RGB(255,255,255));
while (RegEnumValue(hKey,dwIndex++,COMObject,&dwBufSize,NULL,lpType,COMName,lpcbData)==ERROR_SUCCESS)
{
CString ts=COMName;
p1->InsertItem(dwIndex,ts,dwIndex);
if(dwIndex==1)SetDlgItemText(IDC_STATIC_COM, ts);
dwBufSize = MAXKEYPATH;
}
RegCloseKey(hKey);
}
else
{
//DisplayMessage("未能检测串口!");
}
if(dwIndex!=0)OpensButton->EnableWindow(TRUE);
else SetDlgItemText(IDC_STATIC_COM, "无串口");
return TRUE; // return TRUE unless you set the focus to a control
}
void CMYPROGDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMYPROGDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMYPROGDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMYPROGDlg::OnClickList3(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
CListCtrl* pList =
(CListCtrl*) GetDlgItem(IDC_LIST3);
int nSelected = pNMListView->iItem;
if (nSelected >= 0) {
CString strItem = pList->GetItemText(nSelected, 0);
UpdateData(TRUE);
m_csCom=strItem;
UpdateData(FALSE);
}
*pResult = 0;
}
//打开串口并获取编程器信息
void CMYPROGDlg::OnOpens()
{
// TODO: Add your control notification handler code here
CString ss1;//,ss2;
UpdateData(TRUE);
UpdateData(FALSE);
m_opens.GetWindowText(ss1);
if (ss1=="联机")
{
if(avrp.com.Open(m_csCom,19200))//打开串口并使用默认设置
{
//com.SetWnd(AfxGetMainWnd()->m_hWnd); //设置消息处理窗口
long major,minor;
CString cstr;
//读软件标识
cstr = avrp.readProgrammerID();
if(cstr == "1234567")return;
SetDlgItemText(IDC_STATIC_NAME, cstr);
//读软件版本
if(!avrp.programmerSoftwareVersion(&major,&minor))return;
cstr.Empty();
cstr.Insert(0,(char)major);
cstr.Insert(1,'.');
cstr.Insert(2,(char)minor);
SetDlgItemText(IDC_STATIC_SW, cstr);
//读硬件版本
if(!avrp.programmerHardwareVersion(&major,&minor))return;
cstr.Empty();
cstr.Insert(0,(char)major);
cstr.Insert(1,'.');
cstr.Insert(2,(char)minor);
SetDlgItemText(IDC_STATIC_HW, cstr);
//读器件列表
for(int i = 0;i<avrp.devicesupportNumber;i++)
{
avrp.device.SetDevice(avrp.devicesupport[i]);
m_ComboBox_Device.AddString(avrp.device.getDeviceName());
}
if(m_ComboBox_Device.GetCount())
{
int n=m_ComboBox_Device.FindString(0,"ATmega16");
if(n == CB_ERR)
m_ComboBox_Device.SetCurSel(0);
else m_ComboBox_Device.SetCurSel(n);
OnSelchangeComboDevice();
}
//改变串口操作状态
m_opens.SetWindowText("断开");
CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LIST3);
pList->EnableWindow(FALSE);
}
else
{
AfxMessageBox( "联机失败:通信端口无法打开!");
}
}
else
{
avrp.com.Close();
m_opens.SetWindowText("联机");
CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LIST3);
pList->EnableWindow();
SetDlgItemText(IDC_STATIC_SW, "");
SetDlgItemText(IDC_STATIC_HW, "");
SetDlgItemText(IDC_STATIC_NAME, "");
while(m_ComboBox_Device.GetCount())
{
m_ComboBox_Device.DeleteString(0);
}
m_nProgress.SetPos(0);
EnableFlash(FALSE);
EnableEeprom(FALSE);
DisableLockAndFuse();
}
}
void CMYPROGDlg::ReadSignature()
{
//读器件标识
char ts[60];
if(!avrp.enterProgrammingMode())
{
SetDlgItemText(IDC_STATIC_SIGNATURE, "");
return;
}
long s0,s1,s2;
bool r = avrp.isRightSignature( &s0, &s1, &s2 );
sprintf(ts," %02X %02X %02X",(UCHAR)s0,(UCHAR)s1,(UCHAR)s2);
SetDlgItemText(IDC_STATIC_SIGNATURE, ts);
avrp.device.getSignature(&s0,&s1,&s2);
if(r )
{
sprintf(ts,"%s 标识:%02X %02X %02X!",avrp.device.getDeviceName(),
(unsigned char)s0,(unsigned char)s1,(unsigned char)s2);
UpdateData(TRUE);
m_csMessage = ts;
UpdateData(FALSE);
}
else
{
sprintf(ts,"%s 标识不匹配:%02X %02X %02X!",avrp.device.getDeviceName(),
(unsigned char)s0,(unsigned char)s1,(unsigned char)s2);
UpdateData(TRUE);
m_csMessage = ts;
UpdateData(FALSE);
}
ReadLockAndFuse();
avrp.leaveProgrammingMode();
}
//选择器件
void CMYPROGDlg::OnSelchangeComboDevice()
{
// TODO: Add your control notification handler code here
char ts[60];
if(m_ComboBox_Device.GetCount())
{
m_ComboBox_Device.GetLBText(m_ComboBox_Device.GetCurSel(),ts);
avrp.device.SetDevice(ts);
EnableFlash();
EnableEeprom();
DisableLockAndFuse();
EnableLockAndFuse();
ReadSignature();
//OnButtonSread();
}
}
//打开HEX文件
void CMYPROGDlg::OnButtonExplorer()
{
// CFileDialog( BOOL bOpenFileDialog, false=保存,true=打开
// LPCTSTR lpszDefExt = NULL, 缺省扩展名
// LPCTSTR lpszFileName = NULL, 文件名
// DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, 读写方式
// LPCTSTR lpszFilter = NULL, 文件流
// CWnd* pParentWnd = NULL );
CString m_edit2temp=m_hexfile;
CString sFilter="Hexfile(*.hex)|*.hex|All Files (*.*)|*.*|";
CFileDialog dlg(true,"bin",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,(LPCTSTR)sFilter,this);
UpdateData(TRUE);
if(dlg.DoModal()==IDOK)
m_hexfile=dlg.GetPathName();
else
m_hexfile=m_edit2temp;
UpdateData(FALSE);
}
//使能或禁止Flash操作按钮
void CMYPROGDlg::EnableFlash(BOOL EN)
{
CButton *flashGroup=(CButton*)GetDlgItem(IDC_STATIC_GROUPFLASH);
flashGroup->EnableWindow(EN);
if(EN)
{
char s[30];
sprintf(s,"Flash:%d",avrp.device.getFlashSize());
flashGroup->SetWindowText(s);
}
else flashGroup->SetWindowText("Flash");
CButton *fprogButton=(CButton*)GetDlgItem(IDC_BUTTON_FPROG);
CButton *fveriButton=(CButton*)GetDlgItem(IDC_BUTTON_FVERI);
CButton *freadButton=(CButton*)GetDlgItem(IDC_BUTTON_FREAD);
fprogButton->EnableWindow(EN);
fveriButton->EnableWindow(EN);
freadButton->EnableWindow(EN);
}
//使能或禁止Eeprom操作按钮
void CMYPROGDlg::EnableEeprom(BOOL EN)
{
CButton *eepromGroup=(CButton*)GetDlgItem(IDC_STATIC_GROUPEEPROM);
CButton *eprogButton=(CButton*)GetDlgItem(IDC_BUTTON_EPROG);
CButton *everiButton=(CButton*)GetDlgItem(IDC_BUTTON_EVERI);
CButton *ereadButton=(CButton*)GetDlgItem(IDC_BUTTON_EREAD);
if(avrp.device.getEEPROMSize() && EN)
{
eepromGroup->EnableWindow(EN);
eprogButton->EnableWindow(EN);
everiButton->EnableWindow(EN);
ereadButton->EnableWindow(EN);
char s[30];
sprintf(s,"EEPROM:%d",avrp.device.getEEPROMSize());
eepromGroup->SetWindowText(s);
}
else
{
eepromGroup->EnableWindow(FALSE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -