From 4503aa91fed0adcbeed2754258472a66e5d3346a Mon Sep 17 00:00:00 2001 From: WalterCouto Date: Sat, 10 Dec 2022 15:03:42 -0500 Subject: [PATCH] Simplify logic for #53 (#54) * Simplify logic for #53 - Add invisible group boxes to hold RECT of drawing area for Grid or equipped ara. - Resize controls and fix up borders in RC to match initial size to simplify initial size handling and remove magic numbers * Make sure all Frame dialogs use the same font to have comparable sizes - Allow sizing of frame and scrollbars to work - fix up scaling for icon images. --- Diablo Edit2/CharacterDialogBase.h | 1 - Diablo Edit2/Diablo Edit2View.cpp | 62 ++++------------ Diablo Edit2/DiabloEdit2.rc | Bin 132618 -> 136804 bytes Diablo Edit2/DlgCharBasicInfo.cpp | 94 +++++++----------------- Diablo Edit2/DlgCharBasicInfo.h | 2 +- Diablo Edit2/DlgCharItems.cpp | 113 ++++++++++++++++++++++++----- Diablo Edit2/DlgCharItems.h | 1 - Diablo Edit2/DlgQuestInfo.cpp | 7 -- Diablo Edit2/DlgQuestInfo.h | 1 - Diablo Edit2/DlgWayPoints.cpp | 7 -- Diablo Edit2/DlgWayPoints.h | 1 - Diablo Edit2/MainFrm.cpp | 2 +- Diablo Edit2/Resource.h | 43 ++++++++--- Diablo Edit2/language.dat | Bin 41803 -> 41801 bytes Diablo Edit2/resource.h | 43 ++++++++--- Generate Data/language.txt | 2 +- 16 files changed, 205 insertions(+), 174 deletions(-) diff --git a/Diablo Edit2/CharacterDialogBase.h b/Diablo Edit2/CharacterDialogBase.h index 5702eb4..215b26b 100644 --- a/Diablo Edit2/CharacterDialogBase.h +++ b/Diablo Edit2/CharacterDialogBase.h @@ -12,7 +12,6 @@ class CCharacterDialogBase : public CDialog CCharacterDialogBase(UINT nIDTemplate,CWnd* pParent = NULL); // 标准构造函数 virtual ~CCharacterDialogBase(); // 自定义函数 - virtual CSize GetSize() const = 0; virtual void UpdateUI(const CD2S_Struct & character) = 0; virtual BOOL GatherData(CD2S_Struct & character) = 0; virtual void ResetAll() = 0; diff --git a/Diablo Edit2/Diablo Edit2View.cpp b/Diablo Edit2/Diablo Edit2View.cpp index 63f1187..a6ee34b 100644 --- a/Diablo Edit2/Diablo Edit2View.cpp +++ b/Diablo Edit2/Diablo Edit2View.cpp @@ -75,6 +75,7 @@ void CDiabloEdit2View::OnInitialUpdate() GetParentFrame()->RecalcLayout(); //初始化界面 InitUI(); + RefreshUI(); } // CDiabloEdit2View 诊断 @@ -135,63 +136,27 @@ void CDiabloEdit2View::InitUI(void) LoadText(); - // Calulate minimum size for view - CSize newSize; - CSize result = m_dlgTabPage[0]->GetSize(); - newSize.cx = max(result.cx, newSize.cx); - newSize.cy = max(result.cy, newSize.cy); - - result = m_dlgTabPage[1]->GetSize(); - newSize.cx = max(result.cx, newSize.cx); - newSize.cy = max(result.cy, newSize.cy); - - // Adjust size for frame - CRect toolRect(0, 0, 0, 0); - CWnd* pBar; - WINDOWPLACEMENT wndpl; - if (pBar = GetParent()->GetDescendantWindow(AFX_IDW_TOOLBAR)) - { - pBar->GetWindowPlacement(&wndpl); - if (wndpl.showCmd && SW_SHOW) - { - toolRect = wndpl.rcNormalPosition; - newSize.cy -= toolRect.Height(); - } - } - - if (pBar = GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)) - { - pBar->GetWindowPlacement(&wndpl); - if (wndpl.showCmd && SW_SHOW) - { - toolRect = wndpl.rcNormalPosition; - newSize.cy -= toolRect.Height(); - } - } - - newSize.cx += (GetSystemMetrics(SM_CXSIZEFRAME) + GetSystemMetrics(SM_CXBORDER)) * 2 + GetSystemMetrics(SM_CYVSCROLL); - - CRect rect; - GetWindowRect(&rect); - GetParent()->ScreenToClient(&rect); - rect.right = rect.left + newSize.cx; - rect.bottom = rect.top + newSize.cy; - m_dlgTabPage[0]->MoveWindow(rect); - m_dlgTabPage[1]->MoveWindow(rect); - SetWindowPos(NULL, -1, -1, rect.Width(), rect.Height(), SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - GetParentFrame()->SetWindowPos(NULL, -1, -1, rect.Width(), rect.Height(), SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); + // resize views + ResizeParentToFit(); + RefreshUI(); } } void CDiabloEdit2View::RefreshUI(void) { + // In case of resize, the tab control needs to resize CRect rect; GetClientRect(&rect); + + // get the current scroll bar state and adjust rect + CSize scrollPos = GetScrollPosition(); + rect.left -= scrollPos.cx; + rect.top -= scrollPos.cy; m_tcTab.MoveWindow(rect); m_tcTab.GetClientRect(&rect); - rect.top += 20; - if(m_dlgTabPage) - for(int i = 0;i < m_nTabPageCount;++i) + m_tcTab.AdjustRect(FALSE, &rect); + if (m_dlgTabPage) + for (int i = 0; i < m_nTabPageCount; ++i) m_dlgTabPage[i]->MoveWindow(rect); } @@ -408,4 +373,3 @@ void CDiabloEdit2View::OnLanguage3() LoadText(); } } - diff --git a/Diablo Edit2/DiabloEdit2.rc b/Diablo Edit2/DiabloEdit2.rc index f747e5a91910ccfce06cdce5a21d5d4f22442cd1..c7a7a660f3a64bf4852370d761158c23eacc7e13 100644 GIT binary patch delta 6401 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 VgEWmVj~-Q+>U^v?nwC6@{tZV$Axi)N delta 3751 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 diff --git a/Diablo Edit2/DlgCharBasicInfo.cpp b/Diablo Edit2/DlgCharBasicInfo.cpp index e40722b..9e7c2a2 100644 --- a/Diablo Edit2/DlgCharBasicInfo.cpp +++ b/Diablo Edit2/DlgCharBasicInfo.cpp @@ -144,53 +144,6 @@ BEGIN_MESSAGE_MAP(CDlgCharBasicInfo, CDialog) ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CDlgCharBasicInfo::OnTcnSelchangeTab1) END_MESSAGE_MAP() -CSize CDlgCharBasicInfo::GetSize() const -{ - CRect rect; - auto pWnd = GetDlgItem(IDC_TAB1); // This control should have an pixel top position of 235 - if (pWnd == nullptr || !::IsWindow(pWnd->GetSafeHwnd())) - { - GetClientRect(&rect); - return CSize(rect.Width(), rect.Height()); - } - - CRect rectTab; - pWnd->GetWindowRect(&rectTab); - ScreenToClient(&rectTab); - - m_dlgTabPage[0]->GetWindowRect(&rect); - ScreenToClient(&rect); - CSize result = m_dlgTabPage[0]->GetSize(); - result.cx += rectTab.left + rect.left; - result.cy += rectTab.top + rect.top; - CSize newSize = result; - - m_dlgTabPage[1]->GetWindowRect(&rect); - ScreenToClient(&rect); - result = m_dlgTabPage[0]->GetSize(); - result.cx += rectTab.left + rect.left; - result.cy += rectTab.top + rect.top; - newSize.cx = max(result.cx, newSize.cx); - newSize.cy = max(result.cy, newSize.cy); - - pWnd = GetDlgItem(IDC_STATIC_GoldinSta); // This control should be the right most - if (pWnd != nullptr && ::IsWindow(pWnd->GetSafeHwnd())) - { - CRect rect2; - pWnd->GetWindowRect(&rect2); - ScreenToClient(&rect); - newSize.cx = max(newSize.cx, rect2.right + rect.left); - } - - GetClientRect(&rect); - rect.right = rect.left + newSize.cx; - rect.bottom = rect.top + newSize.cy; - ::SetWindowPos(GetSafeHwnd(), NULL, -1, -1, rect.Width(), rect.Height(), SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - m_dlgTabPage[0]->MoveWindow(rect); - m_dlgTabPage[1]->MoveWindow(rect); - return newSize; -} - // 更新显示的人物信息 void CDlgCharBasicInfo::UpdateUI(const CD2S_Struct& character) { @@ -376,6 +329,9 @@ void CDlgCharBasicInfo::InitUI(void) m_dlgTabPage[1]->Create(CDlgQuestInfo::IDD, &m_tcBasicInfo); m_dlgTabPage[1]->ShowWindow(SW_HIDE); //在此处添加新的属性窗体 + // + // resize views + RefreshUI(); m_nTabCurSel = 0; m_tcBasicInfo.SetCurSel(m_nTabCurSel); @@ -383,6 +339,27 @@ void CDlgCharBasicInfo::InitUI(void) } } +void CDlgCharBasicInfo::RefreshUI(void) +{ + // In case of resize, the tab control needs to resize + CRect rect; + GetClientRect(&rect); + + CRect rectTab; + m_tcBasicInfo.GetWindowRect(&rectTab); + ScreenToClient(&rectTab); + rect.top = rectTab.top; + + m_tcBasicInfo.MoveWindow(rect); + m_tcBasicInfo.GetClientRect(&rect); + m_tcBasicInfo.AdjustRect(FALSE, &rect); + + // resize views + if (m_dlgTabPage) + for (int i = 0; i < m_nTabPageCount; ++i) + m_dlgTabPage[i]->MoveWindow(rect); +} + void CDlgCharBasicInfo::LoadText(void) { TCITEM tci; @@ -449,29 +426,8 @@ void CDlgCharBasicInfo::OnEnChangeLevel() void CDlgCharBasicInfo::OnPaint() { + RefreshUI(); CCharacterDialogBase::OnPaint(); - CRect rect; - GetClientRect(&rect); - - auto pWnd = GetDlgItem(IDC_TAB1); // This control should have an pixel left position of 338 and bottom position of 58 - if (pWnd != nullptr && ::IsWindow(pWnd->GetSafeHwnd())) - { - CRect rectTab; - pWnd->GetWindowRect(&rectTab); - ScreenToClient(&rectTab); - rect.top = rectTab.top; - } - else - { - rect.top += 235; - } - - m_tcBasicInfo.MoveWindow(rect); - m_tcBasicInfo.GetClientRect(&rect); - rect.top += 20; - if (m_dlgTabPage) - for (int i = 0; i < m_nTabPageCount; ++i) - m_dlgTabPage[i]->MoveWindow(rect); } void CDlgCharBasicInfo::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) diff --git a/Diablo Edit2/DlgCharBasicInfo.h b/Diablo Edit2/DlgCharBasicInfo.h index f9634e0..b4f9c71 100644 --- a/Diablo Edit2/DlgCharBasicInfo.h +++ b/Diablo Edit2/DlgCharBasicInfo.h @@ -66,13 +66,13 @@ class CDlgCharBasicInfo : public CCharacterDialogBase DWORD m_dwMaxGoldInStash; // 自定义函数 public: - CSize GetSize() const; void UpdateUI(const CD2S_Struct & character); BOOL GatherData(CD2S_Struct & character); void ResetAll(); void LoadText(void); //加载控件的字符串内容 private: void InitUI(void); + void RefreshUI(void); public: virtual BOOL OnInitDialog(); afx_msg void OnBnClicked_Skills(); diff --git a/Diablo Edit2/DlgCharItems.cpp b/Diablo Edit2/DlgCharItems.cpp index 79b1e0f..45dcad9 100644 --- a/Diablo Edit2/DlgCharItems.cpp +++ b/Diablo Edit2/DlgCharItems.cpp @@ -25,8 +25,6 @@ using namespace std; const int GRID_WIDTH = 30; //每个网格的边长(像素) // SCALING to take into account the possiblity of different dialog base units -static double DLG_SCALE_X = 1.0; -static double DLG_SCALE_Y = 1.0; static int GRID_WIDTH_SCALED = GRID_WIDTH; //物品类型和能装备的位置 @@ -126,7 +124,7 @@ static BOOL IsGolem(EPosition pos) { return GOLEM == pos; } //每个位置(EPosition)在UI的起始坐标(像素),列数,行数 //left,top,col,row,equip -const int POSITION_INFO[POSITION_END][5] = { +int POSITION_INFO[POSITION_END][5] = { // Top-Left position adjusted by CalculateScale at runtime to adjust for DPI {10,5,6,8,E_ANY}, //箱子 {10,5,10,10,E_ANY}, //D2R大箱子 {10,315,10,4,E_ANY}, //口袋 @@ -164,10 +162,48 @@ const int POSITION_INFO[POSITION_END][5] = { {600,30,2,4,E_ANY}, //生成金属石魔的物品 }; +const int POSITION_RECT[POSITION_END] = { // Rect used to position images + IDC_INV_STASH, //箱子 + IDC_INV_STASH, //D2R大箱子 + IDC_INV, //口袋 + IDC_INV_CUBE, //方块 + IDC_INV_BELT_GRID, //腰带里 + IDC_INV_SOCKETS, //镶嵌在孔里 + + IDC_INV_HELM, //头 + IDC_INV_AMU, //项链 + IDC_INV_TORSO, //身体 + IDC_INV_RH, //武器右 + IDC_INV_LH, //武器左 + IDC_INV_RF, //戒指右 + IDC_INV_LF, //戒指左 + IDC_INV_BELT, //腰带 + IDC_INV_FOOT, //鞋子 + IDC_INV_GLOVE, //手套 + + IDC_INV_CORPSE_HELM, //尸体的头 + IDC_INV_CORPSE_AMU, //尸体的项链 + IDC_INV_CORPSE_TORSO, //尸体的身体 + IDC_INV_CORPSD_RH, //尸体的武器右 + IDC_INV_CORPSD_LH, //尸体的武器左 + IDC_INV_CORPSE_RF, //尸体的戒指右 + IDC_INV_CORPSE_LF, //尸体的戒指左 + IDC_INV_CORPSE_BELT, //尸体的腰带 + IDC_INV_CORPSE_FOOT, //尸体的鞋子 + IDC_INV_CORPSE_GLOVE, //尸体的手套 + + IDC_INV_MERC_HELM, //雇佣兵的头 + IDC_INV_MERC_TORSO, //雇佣兵的身体 + IDC_INV_MERC_RH, //雇佣兵的武器右 + IDC_INV_MERC_LH, //雇佣兵的武器左 + + IDC_INV_GOLEM, //生成金属石魔的物品 +}; + static CRect PositionToRect(EPosition pos) { ASSERT(pos < POSITION_END); auto & p = POSITION_INFO[pos]; - return CRect(p[0] * DLG_SCALE_X, p[1] * DLG_SCALE_Y, p[0] * DLG_SCALE_X + GRID_WIDTH_SCALED * p[2], p[1] * DLG_SCALE_Y + GRID_WIDTH_SCALED * p[3]); + return CRect(p[0], p[1], p[0] + GRID_WIDTH_SCALED * p[2], p[1] + GRID_WIDTH_SCALED * p[3]); } static int PositionToCol(EPosition pos) { @@ -492,13 +528,6 @@ BEGIN_MESSAGE_MAP(CDlgCharItems, CDialog) ON_NOTIFY(NM_DBLCLK, IDC_LIST_RECYCLE, &CDlgCharItems::OnNMDblclkListRecycle) END_MESSAGE_MAP() -CSize CDlgCharItems::GetSize() const -{ - CRect rect; - GetClientRect(&rect); - return CSize(rect.Width(), rect.Height()); -} - void CDlgCharItems::UpdateUI(const CD2S_Struct & character) { ResetAll(); m_bHasCharacter = TRUE; @@ -665,15 +694,34 @@ static void DrawGrid(CPaintDC & dc, const CRect & rect, int intervalX = 0, int i void CDlgCharItems::CalculateScale() { - auto pWnd = GetDlgItem(IDC_CHECK1); // This control should have an pixel left position of 338 and bottom position of 58 + // Fix up position and grid scale + auto pWnd = GetDlgItem(IDC_INV_STASH); // This control is a good one to calculate scale and it is the biggest grid and the other grids should follow it's scale if (pWnd != nullptr && ::IsWindow(pWnd->GetSafeHwnd())) { CRect rect; pWnd->GetWindowRect(&rect); ScreenToClient(&rect); - DLG_SCALE_X = double(rect.left) / 338.0; - DLG_SCALE_Y = double(rect.bottom) / 58.0; - GRID_WIDTH_SCALED = (int)std::floor(min(DLG_SCALE_X, DLG_SCALE_Y) * GRID_WIDTH); + + // This grid should be info[2] * GRID_WIDTH wide and info[3] * GRID_WIDTH high, so calcualte scale of each GRID Cell. + auto& info = POSITION_INFO[STASH_D2R]; + double scaleX = double(rect.Width()) / double(info[2] * GRID_WIDTH); + double scaleY = double(rect.Height()) / double(info[3] * GRID_WIDTH); + GRID_WIDTH_SCALED = (int)std::floor(min(scaleX, scaleY) * GRID_WIDTH); + } + + // Adjust POSITION_RECT top-left values + for (size_t i = 0; i < POSITION_END; ++i) + { + pWnd = GetDlgItem(POSITION_RECT[i]); + if (pWnd != nullptr && ::IsWindow(pWnd->GetSafeHwnd())) + { + auto& info = POSITION_INFO[i]; + CRect rect; + pWnd->GetWindowRect(&rect); + ScreenToClient(&rect); + info[0] = rect.left; + info[1] = rect.top; + } } //初始化所有网格 @@ -1186,11 +1234,42 @@ void CDlgCharItems::OnChangeMercenary() { } } -static HCURSOR CreateCursorFromBitmap(int picIndex, CSize sz) { +static HCURSOR CreateCursorFromBitmap(CDC* pDC, int picIndex, CSize sz) { // Load bitmap CBitmap bmp; if (!bmp.LoadBitmap(picIndex)) ASSERT(FALSE); + + // Check to see if we need to be scaled + BITMAP bmpInfo; + bmp.GetBitmap(&bmpInfo); + if (bmpInfo.bmWidth != sz.cx || bmpInfo.bmHeight != sz.cy) + { + // select the source CBitmap in a memory DC; + CDC memSrcDc; + memSrcDc.CreateCompatibleDC(pDC); + memSrcDc.SelectObject(&bmp); //now bitmap is an instance of CBitmap class + + // Create your new CBitmap with the new desired size and select it into a destination memory DC + CDC memDestDC; + CBitmap image; + memDestDC.CreateCompatibleDC(pDC); + image.CreateCompatibleBitmap(&memSrcDc, sz.cx, sz.cy); + memDestDC.SelectObject(&image); + + // StretchBlt from src to dest + memDestDC.StretchBlt(0, 0, sz.cx, sz.cy, &memSrcDc, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY); + + HGDIOBJ hbitmap_detach = bmp.Detach(); + if (hbitmap_detach) + { + DeleteObject(hbitmap_detach); + } + + bmp.Attach(image.Detach()); + bmp.GetBitmap(&bmpInfo); + } + // Create an empty mask bitmap. CBitmap monobmp; monobmp.CreateBitmap(sz.cx, sz.cy, 1, 1, NULL); @@ -1206,7 +1285,7 @@ static HCURSOR CreateCursorFromBitmap(int picIndex, CSize sz) { } HCURSOR CDlgCharItems::CreateAlphaCursor(const CItemView & itemView) { - return ::CreateCursorFromBitmap(itemView.nPicRes, itemView.ViewSize()); + return ::CreateCursorFromBitmap(GetDC(), itemView.nPicRes, itemView.ViewSize()); } BOOL CDlgCharItems::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { diff --git a/Diablo Edit2/DlgCharItems.h b/Diablo Edit2/DlgCharItems.h index 09c78e5..9116f9e 100644 --- a/Diablo Edit2/DlgCharItems.h +++ b/Diablo Edit2/DlgCharItems.h @@ -128,7 +128,6 @@ class CDlgCharItems : public CCharacterDialogBase enum { IDD = IDD_DIALOG_CharItems }; CDlgCharItems(CWnd* pParent = NULL); //虚函数 - CSize GetSize() const; void UpdateUI(const CD2S_Struct & character); BOOL GatherData(CD2S_Struct & character); void ResetAll(); diff --git a/Diablo Edit2/DlgQuestInfo.cpp b/Diablo Edit2/DlgQuestInfo.cpp index 53bd5e6..de7cad2 100644 --- a/Diablo Edit2/DlgQuestInfo.cpp +++ b/Diablo Edit2/DlgQuestInfo.cpp @@ -113,13 +113,6 @@ BEGIN_MESSAGE_MAP(CDlgQuestInfo, CDialog) ON_BN_CLICKED(IDC_CHECK1, &CDlgQuestInfo::OnBnClickedCheck1) END_MESSAGE_MAP() -CSize CDlgQuestInfo::GetSize() const -{ - CRect rect; - GetClientRect(&rect); - return CSize(rect.Width(), rect.Height()); -} - void CDlgQuestInfo::UpdateUI(const CD2S_Struct & character) { for(int i = 0;i < LEVEL_SIZE;++i){ diff --git a/Diablo Edit2/DlgQuestInfo.h b/Diablo Edit2/DlgQuestInfo.h index 41dda4a..06a8c04 100644 --- a/Diablo Edit2/DlgQuestInfo.h +++ b/Diablo Edit2/DlgQuestInfo.h @@ -21,7 +21,6 @@ class CDlgQuestInfo : public CCharacterDialogBase DECLARE_MESSAGE_MAP() // 自定义函数 public: - CSize GetSize() const; void UpdateUI(const CD2S_Struct & character); BOOL GatherData(CD2S_Struct & character); void ResetAll(); diff --git a/Diablo Edit2/DlgWayPoints.cpp b/Diablo Edit2/DlgWayPoints.cpp index 1cd9da5..6207e79 100644 --- a/Diablo Edit2/DlgWayPoints.cpp +++ b/Diablo Edit2/DlgWayPoints.cpp @@ -123,13 +123,6 @@ BEGIN_MESSAGE_MAP(CDlgWayPoints, CDialog) ON_BN_CLICKED(IDC_CHECK0, &CDlgWayPoints::OnBnClicked_SelAll) END_MESSAGE_MAP() -CSize CDlgWayPoints::GetSize() const -{ - CRect rect; - GetClientRect(&rect); - return CSize(rect.Width(), rect.Height()); -} - void CDlgWayPoints::UpdateUI(const CD2S_Struct & character) { for(int i = 0;i < 3;++i){ diff --git a/Diablo Edit2/DlgWayPoints.h b/Diablo Edit2/DlgWayPoints.h index 8939d37..96ce592 100644 --- a/Diablo Edit2/DlgWayPoints.h +++ b/Diablo Edit2/DlgWayPoints.h @@ -22,7 +22,6 @@ class CDlgWayPoints : public CCharacterDialogBase DECLARE_MESSAGE_MAP() // 自定义函数 public: - CSize GetSize() const; void UpdateUI(const CD2S_Struct & character); BOOL GatherData(CD2S_Struct & character); void ResetAll(); diff --git a/Diablo Edit2/MainFrm.cpp b/Diablo Edit2/MainFrm.cpp index 5eda509..b56e799 100644 --- a/Diablo Edit2/MainFrm.cpp +++ b/Diablo Edit2/MainFrm.cpp @@ -93,7 +93,7 @@ BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) // CREATESTRUCT cs 来修改窗口类或样式 cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE - | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU; + | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU | WS_SIZEBOX; return TRUE; } diff --git a/Diablo Edit2/Resource.h b/Diablo Edit2/Resource.h index 1aa906e..d085d8b 100644 --- a/Diablo Edit2/Resource.h +++ b/Diablo Edit2/Resource.h @@ -1,11 +1,10 @@ //{{NO_DEPENDENCIES}} -// Microsoft Visual C++ 生成的包含文件。 -// 供 DiabloEdit2.rc 使用 +// Microsoft Visual C++ generated include file. +// Used by DiabloEdit2.rc // #define IDD_ABOUTBOX 100 #define IDP_OLE_INIT_FAILED 100 #define IDD_DIABLOEDIT2_FORM 101 -#define IDD_DIALOG_OnlyTabCtrl 101 #define IDD_DIALOG_BasicCharInfo 102 #define IDD_DIALOG_WayPoints 103 #define IDR_MAINFRAME 128 @@ -463,13 +462,39 @@ #define IDC_LIST_RECYCLE 1058 #define IDC_STATIC_TIP 1059 #define IDC_TREE1 1060 +#define IDC_INV_STASH 1061 +#define IDC_INV 1062 +#define IDC_INV_SOCKETS 1063 +#define IDC_INV_CUBE 1064 +#define IDC_INV_BELT_GRID 1065 +#define IDC_INV_RH 1066 +#define IDC_INV_LH 1067 #define IDC_BUTTON1 1068 -#define IDC_BUTTON2 1069 +#define IDC_INV_CORPSD_RH 1069 +#define IDC_INV_CORPSD_LH 1070 +#define IDC_INV_MERC_RH 1071 +#define IDC_INV_MERC_LH 1072 #define IDC_LIST1 1073 -#define IDC_BUTTON3 1074 -#define IDC_BUTTON4 1075 -#define IDC_BUTTON5 1076 +#define IDC_INV_GOLEM 1074 +#define IDC_INV_TORSO 1075 +#define IDC_INV_CORPSE_TORSO 1076 #define IDC_SLIDER1 1077 +#define IDC_INV_MERC_TORSO 1078 +#define IDC_INV_HELM 1079 +#define IDC_INV_CORPSE_HELM 1080 +#define IDC_INV_MERC_HELM 1081 +#define IDC_INV_GLOVE 1082 +#define IDC_INV_CORPSE_GLOVE 1083 +#define IDC_INV_FOOT 1084 +#define IDC_INV_CORPSE_FOOT 1085 +#define IDC_INV_BELT 1086 +#define IDC_INV_CORPSE_BELT 1087 +#define IDC_INV_RF 1088 +#define IDC_INV_CORPSE_RF 1089 +#define IDC_INV_LF 1090 +#define IDC_INV_CORPSE_LF 1091 +#define IDC_INV_AMU 1092 +#define IDC_INV_CORPSE_AMU 1093 #define IDC_STATIC05 1094 #define IDC_STATIC06 1095 #define IDC_STATIC07 1096 @@ -591,9 +616,9 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 478 +#define _APS_NEXT_RESOURCE_VALUE 479 #define _APS_NEXT_COMMAND_VALUE 32780 -#define _APS_NEXT_CONTROL_VALUE 1061 +#define _APS_NEXT_CONTROL_VALUE 1062 #define _APS_NEXT_SYMED_VALUE 310 #endif #endif diff --git a/Diablo Edit2/language.dat b/Diablo Edit2/language.dat index 3ff9c4888ad118a8f3fc31eea5ed3a00d45112c1..919476040ee6b6c66102217333ca61f43f60f7d2 100644 GIT binary patch delta 6140 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 diff --git a/Diablo Edit2/resource.h b/Diablo Edit2/resource.h index 1aa906e..d085d8b 100644 --- a/Diablo Edit2/resource.h +++ b/Diablo Edit2/resource.h @@ -1,11 +1,10 @@ //{{NO_DEPENDENCIES}} -// Microsoft Visual C++ 生成的包含文件。 -// 供 DiabloEdit2.rc 使用 +// Microsoft Visual C++ generated include file. +// Used by DiabloEdit2.rc // #define IDD_ABOUTBOX 100 #define IDP_OLE_INIT_FAILED 100 #define IDD_DIABLOEDIT2_FORM 101 -#define IDD_DIALOG_OnlyTabCtrl 101 #define IDD_DIALOG_BasicCharInfo 102 #define IDD_DIALOG_WayPoints 103 #define IDR_MAINFRAME 128 @@ -463,13 +462,39 @@ #define IDC_LIST_RECYCLE 1058 #define IDC_STATIC_TIP 1059 #define IDC_TREE1 1060 +#define IDC_INV_STASH 1061 +#define IDC_INV 1062 +#define IDC_INV_SOCKETS 1063 +#define IDC_INV_CUBE 1064 +#define IDC_INV_BELT_GRID 1065 +#define IDC_INV_RH 1066 +#define IDC_INV_LH 1067 #define IDC_BUTTON1 1068 -#define IDC_BUTTON2 1069 +#define IDC_INV_CORPSD_RH 1069 +#define IDC_INV_CORPSD_LH 1070 +#define IDC_INV_MERC_RH 1071 +#define IDC_INV_MERC_LH 1072 #define IDC_LIST1 1073 -#define IDC_BUTTON3 1074 -#define IDC_BUTTON4 1075 -#define IDC_BUTTON5 1076 +#define IDC_INV_GOLEM 1074 +#define IDC_INV_TORSO 1075 +#define IDC_INV_CORPSE_TORSO 1076 #define IDC_SLIDER1 1077 +#define IDC_INV_MERC_TORSO 1078 +#define IDC_INV_HELM 1079 +#define IDC_INV_CORPSE_HELM 1080 +#define IDC_INV_MERC_HELM 1081 +#define IDC_INV_GLOVE 1082 +#define IDC_INV_CORPSE_GLOVE 1083 +#define IDC_INV_FOOT 1084 +#define IDC_INV_CORPSE_FOOT 1085 +#define IDC_INV_BELT 1086 +#define IDC_INV_CORPSE_BELT 1087 +#define IDC_INV_RF 1088 +#define IDC_INV_CORPSE_RF 1089 +#define IDC_INV_LF 1090 +#define IDC_INV_CORPSE_LF 1091 +#define IDC_INV_AMU 1092 +#define IDC_INV_CORPSE_AMU 1093 #define IDC_STATIC05 1094 #define IDC_STATIC06 1095 #define IDC_STATIC07 1096 @@ -591,9 +616,9 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 478 +#define _APS_NEXT_RESOURCE_VALUE 479 #define _APS_NEXT_COMMAND_VALUE 32780 -#define _APS_NEXT_CONTROL_VALUE 1061 +#define _APS_NEXT_CONTROL_VALUE 1062 #define _APS_NEXT_SYMED_VALUE 310 #endif #endif diff --git a/Generate Data/language.txt b/Generate Data/language.txt index c57d8eb..3c0afac 100644 --- a/Generate Data/language.txt +++ b/Generate Data/language.txt @@ -175,7 +175,7 @@ Ladder 天梯 天梯 Expansion 资料片 資料片 Hardcore 专家级 專家級 - Died berfore 以前死过 以前死過 + Died before 以前死过 以前死過 Skill Points 技能点剩余 技能點剩餘 Gold in person 身上金钱 身上金錢 Gold in stash 箱子金钱 箱子金錢