📄 atlasmgr2dlg.cpp
字号:
// AtlasMgr2Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "blcommon.h"
#include "AtlasMgr2.h"
#include "AtlasMgr2Dlg.h"
#include "AtlasFunc.h"
#include "AtlasUsbMsg.h"
#include "AtlasApi.h"
#include "ProgDlg.h"
#include ".\jtag\define.h"
#include "EnumSerial.h"
#include "jtag_err.h"
#include "jtag.h"
#include "jtag_nf.h"
#include "jtag_nor.h"
#include "pin_cennav.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define BIN_HEADER_LENGTH 7
extern ATLAS_DEV_INFO g_atlasdevinfo;
BOOL g_bNK5_0 = TRUE;
DWORD dwBytesPerSector;
DWORD dwSectorsPerBlock;
DWORD dwBlocks;
DWORD dwDataWidth;
DWORD dwSpareDataLength;
extern unsigned long g_NorID;
extern BOOL g_8BitsNor;
extern DumpNFInfo g_DumpNFInfo;
extern DWORD g_dwTransport;
/////////////////////////////////////////////////////////////////////////////
// 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()
/////////////////////////////////////////////////////////////////////////////
// CAtlasMgr2Dlg dialog
CAtlasMgr2Dlg::CAtlasMgr2Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CAtlasMgr2Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CAtlasMgr2Dlg)
m_nCs = 0;
m_nTransPort = 0;
m_nPort = 0;
m_strInput = _T("");
m_nDumpNFStart = 0;
m_nDumpNFEnd = 0;
m_wholechip = FALSE;
m_nBaud = 3;
m_nFlashType = 0;
m_nChipType = 0;
m_nGPIOPreLoad1Value = 0;
m_nGPIOPreLoad1Group = 0;
m_nGPIOPreLoad1Pins = 0;
m_nGPIOPreLoad2Value = 0;
m_nGPIOPreLoad2Group = 0;
m_nGPIOPreLoad2Pins = 0;
m_nGPIOPreLoad3Value = 0;
m_nGPIOPreLoad3Group = 0;
m_nGPIOPreLoad3Pins = 0;
m_nNorFlashType = -1;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bOpened = FALSE;
}
void CAtlasMgr2Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAtlasMgr2Dlg)
DDX_Control(pDX, IDC_COMBO_NORFLASH_TYPE, m_NorFlash_Type);
DDX_Control(pDX, IDC_COMBO_COM_PORT, m_combo_com_port);
DDX_Control(pDX, IDC_USB_INPUT, m_inputEdit);
DDX_Control(pDX, IDC_USB_OUTPUT, m_outputTerminal);
DDX_Radio(pDX, IDC_CS0, m_nCs);
DDX_Radio(pDX, IDC_TRANSPORT_USB, m_nTransPort);
DDX_CBIndex(pDX, IDC_COMBO_COM_PORT, m_nPort);
DDX_Text(pDX, IDC_USB_INPUT, m_strInput);
DDX_Text(pDX, IDC_DUMP_BLOCK_START, m_nDumpNFStart);
DDX_Text(pDX, IDC_DUMP_BLOCK_END, m_nDumpNFEnd);
DDX_Check(pDX, IDC_DUMP_WHOLE_CHIP, m_wholechip);
DDX_CBIndex(pDX, IDC_COMBO_COM_BAUD, m_nBaud);
DDX_Radio(pDX, IDC_FLASHTYPE_NAND, m_nFlashType);
DDX_CBIndex(pDX, IDC_COMBO_CHIP, m_nChipType);
DDX_CBIndex(pDX, IDC_COMBO_GPIO_PRELOAD1_VALUE, m_nGPIOPreLoad1Value);
DDX_CBIndex(pDX, IDC_COMBO_GPIO_PRELOAD1_GROUP, m_nGPIOPreLoad1Group);
DDX_CBIndex(pDX, IDC_COMBO_GPIO_PRELOAD1_PINS, m_nGPIOPreLoad1Pins);
DDX_CBIndex(pDX, IDC_COMBO_GPIO_PRELOAD2_VALUE, m_nGPIOPreLoad2Value);
DDX_CBIndex(pDX, IDC_COMBO_GPIO_PRELOAD2_GROUP, m_nGPIOPreLoad2Group);
DDX_CBIndex(pDX, IDC_COMBO_GPIO_PRELOAD2_PINS, m_nGPIOPreLoad2Pins);
DDX_CBIndex(pDX, IDC_COMBO_GPIO_PRELOAD3_VALUE, m_nGPIOPreLoad3Value);
DDX_CBIndex(pDX, IDC_COMBO_GPIO_PRELOAD3_GROUP, m_nGPIOPreLoad3Group);
DDX_CBIndex(pDX, IDC_COMBO_GPIO_PRELOAD3_PINS, m_nGPIOPreLoad3Pins);
DDX_CBIndex(pDX, IDC_COMBO_NORFLASH_TYPE, m_nNorFlashType);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAtlasMgr2Dlg, CDialog)
//{{AFX_MSG_MAP(CAtlasMgr2Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CS0, OnCsChange)
ON_BN_CLICKED(IDC_OPEN_DEVICE, OnOpenDevice)
ON_BN_CLICKED(IDC_UPDATE_NBOOT, OnUpdateNboot)
ON_BN_CLICKED(IDC_UPDATE_EBOOT, OnUpdateEboot)
ON_BN_CLICKED(IDC_UPDATE_NB0, OnUpdateNKImage)
ON_BN_CLICKED(IDC_TRANSPORT_RS232, OnTransportChanged)
ON_BN_CLICKED(IDC_FLASHTYPE_NAND, OnFlashTypeChanged)
ON_BN_CLICKED(IDC_UPDATE_NANDXIP, OnUpdateNandxip)
ON_BN_CLICKED(IDC_UPDATE_DM, OnUpdateDm)
ON_BN_CLICKED(IDC_DUMP_NBOOT, OnDumpNboot)
ON_BN_CLICKED(IDC_DUMP_EBOOT, OnDumpEboot)
ON_BN_CLICKED(IDC_DUMP_BLOCKS, OnDumpBlocks)
ON_BN_CLICKED(IDC_CS1, OnCsChange)
ON_BN_CLICKED(IDC_CS2, OnCsChange)
ON_BN_CLICKED(IDC_CS3, OnCsChange)
ON_BN_CLICKED(IDC_TRANSPORT_USB, OnTransportChanged)
ON_BN_CLICKED(IDC_TRANSPORT_JTAG, OnTransportChanged)
ON_BN_CLICKED(IDC_FLASHTYPE_NOR, OnFlashTypeChanged)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_ATLAS_DBG_OUT_MESSAGE, OnAtlasDbgOutMessage)
ON_MESSAGE(WM_ATLAS_DBG_IN_MESSAGE, OnAtlasDbgInMessage)
ON_MESSAGE(WM_ATLAS_DBG_ENTER_EBOOT, OnAtlasEnterEboot)
ON_MESSAGE(WM_ATLAS_DBG_DOWNLOAD_NK_5, OnAtlasDownloadNk5)
ON_MESSAGE(WM_ATLAS_DBG_DOWNLOAD_NK_4, OnAtlasDownloadNk4)
ON_MESSAGE(WM_ATLAS_DUMP_NF,OnAtlasDumpNF)
ON_MESSAGE(WM_ATLAS_GET_ONE_SECTOR_DATA,OnAtlasGetOneSectorData)
ON_MESSAGE(WM_ATALS_CONNECT_BROKEN,OnAtlasUSBConnectBroken)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAtlasMgr2Dlg message handlers
BOOL CAtlasMgr2Dlg::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
m_nTransPort = AfxGetApp()->GetProfileInt("Nboot", "Transport", 0);
m_nFlashType = AfxGetApp()->GetProfileInt("Nboot", "FlashType", 0);
m_nPort = AfxGetApp()->GetProfileInt("Nboot", "Port", 0);
m_nBaud = AfxGetApp()->GetProfileInt("Nboot", "Baud", 0);
m_nChipType = AfxGetApp()->GetProfileInt("Nboot", "Chip", 0);
m_nGPIOPreLoad1Value = AfxGetApp()->GetProfileInt("Nboot", "GPIOPRELOAD1Value", 0);
m_nGPIOPreLoad1Group = AfxGetApp()->GetProfileInt("Nboot", "GPIOPRELOAD1Group", 0);
m_nGPIOPreLoad1Pins = AfxGetApp()->GetProfileInt("Nboot", "GPIOPRELOAD1Pins", 0);
m_nGPIOPreLoad2Value = AfxGetApp()->GetProfileInt("Nboot", "GPIOPRELOAD2Value", 0);
m_nGPIOPreLoad2Group = AfxGetApp()->GetProfileInt("Nboot", "GPIOPRELOAD2Group", 0);
m_nGPIOPreLoad2Pins = AfxGetApp()->GetProfileInt("Nboot", "GPIOPRELOAD2Pins", 0);
m_nGPIOPreLoad3Value = AfxGetApp()->GetProfileInt("Nboot", "GPIOPRELOAD3Value", 0);
m_nGPIOPreLoad3Group = AfxGetApp()->GetProfileInt("Nboot", "GPIOPRELOAD3Group", 0);
m_nGPIOPreLoad3Pins = AfxGetApp()->GetProfileInt("Nboot", "GPIOPRELOAD3Pins", 0);
CArray<SSerInfo,SSerInfo&> asi;
EnumSerialPorts(asi,FALSE/*include all*/);
for (int ii=0; ii<asi.GetSize(); ii++) {
m_combo_com_port.AddString(asi[ii].strPortName);
TRACE("Find out Serial port:strDevPath=%s , asi[ii].strPortName=%s,asi[ii].strFriendlyName=%s, strPortDesc=%s\r\n",asi[ii].strDevPath,asi[ii].strPortName,asi[ii].strFriendlyName,asi[ii].strPortDesc);
}
CString strNorType;
CString strType;
DWORD dwStrPlace = 0;
DWORD dwNumOfNorType = 0;
//CString strInitDir = AfxGetApp()->GetProfileString("NBoot", "Path", "");
strNorType = AfxGetApp()->GetProfileString("NorFlash", "Type", "");
strNorType.TrimLeft();
strNorType.TrimRight();
TRACE("NorType=%s\r\n",strNorType);
while(1)
{
DWORD dwCurrentTypeFinishPlace;
if(dwStrPlace == strNorType.GetLength())
break;
dwCurrentTypeFinishPlace = strNorType.Find(';',dwStrPlace);
if(dwCurrentTypeFinishPlace == dwStrPlace)
{
dwStrPlace++;
continue;
}
if(-1 != dwCurrentTypeFinishPlace)
{
strType = strNorType.Mid(dwStrPlace,dwCurrentTypeFinishPlace - dwStrPlace);
strType.TrimLeft();
strType.TrimRight();
m_NorFlash_Type.AddString(strType);
dwStrPlace = dwCurrentTypeFinishPlace + 1;
dwNumOfNorType++;
TRACE("NorType:%s\r\n",strType);
}
else if(-1 == dwCurrentTypeFinishPlace)
{
strType = strNorType.Right(strNorType.GetLength() - dwStrPlace);
strType.TrimLeft();
strType.TrimRight();
m_NorFlash_Type.AddString(strType);
dwNumOfNorType++;
TRACE("NorType:%s\r\n",strType);
break;
}
}
m_nNorFlashType = AfxGetApp()->GetProfileInt("NorFlash", "Default", 0);
if(dwNumOfNorType < (DWORD)(m_nNorFlashType + 1))
m_nNorFlashType = 0;
else if(-1 == m_nNorFlashType && dwNumOfNorType>0)
m_nNorFlashType = 0;
m_NorFlash_Type.SetDroppedWidth(dwNumOfNorType);
m_inputEdit.SetParent(GetSafeHwnd());
UpdateData(FALSE);
UpdateUI();
/* if(m_nTransPort==2)
GetDlgItem(IDC_UPDATE_NBOOT)->EnableWindow(TRUE); */
return TRUE; // return TRUE unless you set the focus to a control
}
void CAtlasMgr2Dlg::UpdateUI()
{
GetDlgItem(IDC_CS0)->EnableWindow(FALSE);
GetDlgItem(IDC_CS3)->EnableWindow(FALSE);
GetDlgItem(IDC_CS1)->EnableWindow(FALSE);
GetDlgItem(IDC_CS2)->EnableWindow(FALSE);
GetDlgItem(IDC_UPDATE_NBOOT)->EnableWindow(FALSE);
GetDlgItem(IDC_UPDATE_EBOOT)->EnableWindow(FALSE);
GetDlgItem(IDC_UPDATE_NB0)->EnableWindow(FALSE);
GetDlgItem(IDC_UPDATE_NANDXIP)->EnableWindow(FALSE);
GetDlgItem(IDC_UPDATE_DM)->EnableWindow(FALSE);
GetDlgItem(IDC_USB_OUTPUT)->EnableWindow(TRUE);
GetDlgItem(IDC_USB_INPUT)->EnableWindow(FALSE);
GetDlgItem(IDC_DUMP_BLOCKS)->EnableWindow(FALSE);
GetDlgItem(IDC_DUMP_WHOLE_CHIP)->EnableWindow(FALSE);
GetDlgItem(IDC_DUMP_BLOCK_START)->EnableWindow(FALSE);
GetDlgItem(IDC_DUMP_BLOCK_END)->EnableWindow(FALSE);
GetDlgItem(IDC_DUMP_NBOOT)->EnableWindow(FALSE);
GetDlgItem(IDC_DUMP_EBOOT)->EnableWindow(FALSE);
GetDlgItem(IDC_UPDATE_NBOOT)->SetWindowText("Update NBOOT ...");
if(m_bOpened)
{
if(m_nTransPort!=ATLAS_TRANSPORT_JTAG)
{
GetDlgItem(IDC_CS0)->EnableWindow(TRUE);
GetDlgItem(IDC_CS1)->EnableWindow(TRUE);
GetDlgItem(IDC_CS2)->EnableWindow(TRUE);
GetDlgItem(IDC_CS3)->EnableWindow(TRUE);
}
GetDlgItem(IDC_OPEN_DEVICE)->SetWindowText("Close");
GetDlgItem(IDC_TRANSPORT_USB)->EnableWindow(FALSE);
GetDlgItem(IDC_TRANSPORT_RS232)->EnableWindow(FALSE);
GetDlgItem(IDC_TRANSPORT_JTAG)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_COM_PORT)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_COM_BAUD)->EnableWindow(FALSE);
GetDlgItem(IDC_FLASHTYPE_NAND)->EnableWindow(FALSE);
GetDlgItem(IDC_FLASHTYPE_NOR)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_CHIP)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_NORFLASH_TYPE)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD1_VALUE)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD1_GROUP)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD1_PINS)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD2_VALUE)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD2_GROUP)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD2_PINS)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD3_VALUE)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD3_GROUP)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD3_PINS)->EnableWindow(FALSE);
if(m_nTransPort==ATLAS_TRANSPORT_JTAG)
{
GetDlgItem(IDC_UPDATE_NBOOT)->SetWindowText("Jtag Download ...");
GetDlgItem(IDC_UPDATE_NBOOT)->EnableWindow(TRUE);
}
else if(m_nTransPort==ATLAS_TRANSPORT_RS232)
{
if(ATLAS_BOOT_STAGE_BOOTSTRAPE == g_atlasdevinfo.dwBootStage)
{
GetDlgItem(IDC_UPDATE_NBOOT)->SetWindowText("Update BootStrap");
GetDlgItem(IDC_UPDATE_NBOOT)->EnableWindow(TRUE);
}
else
{
GetDlgItem(IDC_UPDATE_NBOOT)->EnableWindow(TRUE);
GetDlgItem(IDC_UPDATE_EBOOT)->EnableWindow(TRUE);
if(g_atlasdevinfo.dwNandXIPInfo)
GetDlgItem(IDC_UPDATE_NANDXIP)->EnableWindow(TRUE);
if(g_atlasdevinfo.dwDMReservedSize>0)
GetDlgItem(IDC_UPDATE_DM)->EnableWindow(TRUE);
}
//GetDlgItem(IDC_UPDATE_NB0)->EnableWindow(TRUE);
}
else if(m_nTransPort==ATLAS_TRANSPORT_USB)
{
// GetDlgItem(IDC_USB_OUTPUT)->EnableWindow(TRUE);
GetDlgItem(IDC_USB_INPUT)->EnableWindow(TRUE);
GetDlgItem(IDC_USB_INPUT)->SetFocus();
if(ATLAS_BOOT_STAGE_NBOOT == g_atlasdevinfo.dwBootStage)
{
GetDlgItem(IDC_UPDATE_NBOOT)->EnableWindow(TRUE);
GetDlgItem(IDC_UPDATE_EBOOT)->EnableWindow(TRUE);
if(g_atlasdevinfo.dwNandXIPInfo)
GetDlgItem(IDC_UPDATE_NANDXIP)->EnableWindow(TRUE);
if(g_atlasdevinfo.dwDMReservedSize>0)
GetDlgItem(IDC_UPDATE_DM)->EnableWindow(TRUE);
}
else if(ATLAS_BOOT_STAGE_EBOOT == g_atlasdevinfo.dwBootStage )
{
GetDlgItem(IDC_UPDATE_NB0)->EnableWindow(FALSE);
}
else if(ATLAS_BOOT_STAGE_NORFLASH_EBOOT == g_atlasdevinfo.dwBootStage )
{
GetDlgItem(IDC_UPDATE_NB0)->EnableWindow(FALSE);
GetDlgItem(IDC_UPDATE_EBOOT)->EnableWindow(TRUE);
GetDlgItem(IDC_UPDATE_DM)->EnableWindow(TRUE);
}
}
}
else
{
GetDlgItem(IDC_TRANSPORT_USB)->EnableWindow(TRUE);
GetDlgItem(IDC_TRANSPORT_RS232)->EnableWindow(TRUE);
GetDlgItem(IDC_TRANSPORT_JTAG)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_COM_PORT)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_COM_BAUD)->EnableWindow(TRUE);
GetDlgItem(IDC_FLASHTYPE_NAND)->EnableWindow(TRUE);
GetDlgItem(IDC_FLASHTYPE_NOR)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_CHIP)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_NORFLASH_TYPE)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD1_VALUE)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD1_GROUP)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD1_PINS)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD2_VALUE)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD2_GROUP)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD2_PINS)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD3_VALUE)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD3_GROUP)->EnableWindow(TRUE);
GetDlgItem(IDC_COMBO_GPIO_PRELOAD3_PINS)->EnableWindow(TRUE);
GetDlgItem(IDC_OPEN_DEVICE)->SetWindowText("Open");
GetDlgItem(IDC_DEV_INFO)->SetWindowText("");
}
return;
}
void CAtlasMgr2Dlg::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 CAtlasMgr2Dlg::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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -