📄 tcsylist.cpp
字号:
BOOL CTcsyRegistList::AddEndDiskItem(STcsyRegistItem &sItem)
{
if(TcsyHead.nItemCount < 0) return FALSE; // 链表尚未建立
STcsyRegistItem TempItem = sItem; // 临时单元数据
if(!LoadDiskItem(TempItem)) return FALSE; // 装载单元失败
STcsyRegistNode *pNode = new STcsyRegistNode; // 新的内存节点
if(pNode == NULL) return FALSE; // 申请内存失败
sItem = TempItem; // 返回提取数据
m_nNodeCount++; // 多了一个成员
pNode->ItemData = TempItem; // 拷贝到新内存
if(PtrEnd == NULL) // 当前为一空链
{
PtrStart = PtrEnd = PtrCurr = pNode; // 内存首尾指针
}
else
{
pNode->PtrPrior = PtrEnd; // 新单元上节点
PtrEnd->PtrNext = pNode; // 原尾的下节点
PtrEnd = PtrCurr = pNode; // 新尾和新当前
}
return TRUE; // 返回成功追加
}
//-------------------------------------------------------------------------//
// 尾删节点(0成功、1空链、2失败):释放内存。移除扇区数据(可选)
LONG CTcsyRegistList::DelEnd(BOOL bDelItem)
{
if(m_nNodeCount <= 0) return DEL_EMPTYLIST; // 已经是空链啦
if(bDelItem == TRUE) // 移除扇区数据
{
if(m_nNodeCount != TcsyHead.nItemCount) // 防扇区删断链
return DEL_FAILURE;
STcsyRegistItem tEndItem = PtrEnd->ItemData, bPriorItem;
if(Delete(tEndItem.AddrSelf) == FALSE) // 删除结束单元
return DEL_FAILURE;
STcsyRegistHead TempHead = TcsyHead; // 临时注册标头
BOOL bEmptyList = FALSE; // 是否已经删空
STcsyRegistAddr eEmptyAddr;
if(TempHead.nItemCount == 1) // 再删就没有啦
{
bEmptyList = TRUE;
TempHead.AddrStart = TempHead.AddrEnd = eEmptyAddr;
}
else // 还有很多的呢
{
STcsyRegistItem tPriorItem = PtrEnd->PtrPrior->ItemData;
tPriorItem.AddrNext = eEmptyAddr;
TempHead.AddrEnd = tPriorItem.AddrSelf;
if(SaveDiskItem(tPriorItem) == FALSE) // 不成功则恢复
{
SaveDiskItem(tEndItem); return DEL_FAILURE;
}
bPriorItem = PtrEnd->PtrPrior->ItemData; // 写新的尾内存
PtrEnd->PtrPrior->ItemData = tPriorItem;
}
TempHead.nItemCount--; // 减少一个成员
if(SaveDiskHead(TempHead) == FALSE)
{
if(!bEmptyList) SaveDiskItem(bPriorItem);// 不成功则恢复
SaveDiskItem(tEndItem);
if(!bEmptyList) PtrEnd->PtrPrior->ItemData = bPriorItem;
return DEL_FAILURE;
}
TcsyHead = TempHead; // 记录新的标头
if(m_bUserRegisted && IsSameAddr(tEndItem.AddrSelf,
AddrRegist)) // 同步登陆注册
{
m_bUserRegisted = FALSE; AddrRegist.Set(0L, 0L);
}
}
if((--m_nNodeCount) == 0) PtrStart = NULL; // 少了一个成员
STcsyRegistNode *pPrior = PtrEnd->PtrPrior;
delete PtrEnd; if(pPrior) pPrior->PtrNext = NULL;// 删除内存节点
PtrEnd = PtrCurr = pPrior;
return DEL_SUCCESS; // 返回成功标志
}
// 首删节点(0成功、1空链、2失败):释放内存。移除扇区数据(可选)
LONG CTcsyRegistList::DelStart(BOOL bDelItem)
{
if(m_nNodeCount <= 0) return DEL_EMPTYLIST; // 已经是空链啦
if(bDelItem == TRUE) // 移除扇区数据
{
if(m_nNodeCount != TcsyHead.nItemCount) // 防扇区删断链
return DEL_FAILURE;
STcsyRegistItem tStartItem = PtrStart->ItemData, bNextItem;
if(Delete(tStartItem.AddrSelf) == FALSE) // 删除开始单元
return DEL_FAILURE;
STcsyRegistHead TempHead = TcsyHead; // 临时注册标头
BOOL bEmptyList = FALSE; // 是否已经删空
STcsyRegistAddr eEmptyAddr;
if(TempHead.nItemCount == 1) // 再删就没有啦
{
bEmptyList = TRUE;
TempHead.AddrStart = TempHead.AddrEnd = eEmptyAddr;
}
else // 还有很多的呢
{
STcsyRegistItem tNextItem = PtrStart->PtrNext->ItemData;
tNextItem.AddrPrior = eEmptyAddr;
TempHead.AddrStart = tNextItem.AddrSelf;
if(SaveDiskItem(tNextItem) == FALSE) // 不成功则恢复
{
SaveDiskItem(tStartItem); return DEL_FAILURE;
}
bNextItem = PtrStart->PtrNext->ItemData; // 写新的首内存
PtrStart->PtrNext->ItemData = tNextItem;
}
TempHead.nItemCount--; // 减少一个成员
if(SaveDiskHead(TempHead) == FALSE)
{
if(!bEmptyList) SaveDiskItem(bNextItem); // 不成功则恢复
SaveDiskItem(tStartItem);
if(!bEmptyList) PtrStart->PtrNext->ItemData = bNextItem;
return DEL_FAILURE;
}
TcsyHead = TempHead; // 记录新的标头
if(m_bUserRegisted && IsSameAddr(tStartItem.AddrSelf,
AddrRegist)) // 同步登陆注册
{
m_bUserRegisted = FALSE; AddrRegist.Set(0L, 0L);
}
}
if((--m_nNodeCount) == 0) PtrEnd = NULL; // 少了一个成员
STcsyRegistNode *pNext = PtrStart->PtrNext;
delete PtrStart; if(pNext) pNext->PtrPrior = NULL;// 删除内存节点
PtrStart = PtrCurr = pNext;
return DEL_SUCCESS; // 返回成功标志
}
// 移除节点:先从磁盘扇区移除数据(可选),再释放内存中的节点
LONG CTcsyRegistList::RemoveCurr(BOOL bDelItem)
{
if(PtrCurr == NULL) return DEL_EMPTYLIST; // 当前指针无效
if(!PtrCurr->PtrNext) return DelEnd(bDelItem); // 删除首和尾点
else if(!PtrCurr->PtrPrior) return DelStart(bDelItem);
if(bDelItem == TRUE) // 移除扇区数据
{
if(m_nNodeCount != TcsyHead.nItemCount) // 防扇区删断链
return DEL_FAILURE;
STcsyRegistItem tCurrItem = PtrCurr->ItemData;
if(Delete(tCurrItem.AddrSelf) == FALSE) // 删除当前单元
return DEL_FAILURE;
STcsyRegistItem tPriorItem = PtrCurr->PtrPrior->ItemData;
STcsyRegistItem tNextItem = PtrCurr->PtrNext->ItemData;
tPriorItem.AddrNext = tNextItem.AddrSelf; // 更新上下位置
tNextItem.AddrPrior = tPriorItem.AddrSelf;
if(SaveDiskItem(tPriorItem) == FALSE) // 保存原上节点
{
SaveDiskItem(tCurrItem);
return DEL_FAILURE;
}
if(SaveDiskItem(tNextItem) == FALSE) // 保存原下节点
{
SaveDiskItem(tCurrItem);
SaveDiskItem(PtrCurr->PtrPrior->ItemData);
return DEL_FAILURE;
}
STcsyRegistHead TempHead = TcsyHead; // 临时注册标头
TempHead.nItemCount--; // 减少一个成员
if(SaveDiskHead(TempHead) == FALSE) // 保存注册标头
{
SaveDiskItem(tCurrItem);
SaveDiskItem(PtrCurr->PtrPrior->ItemData);
SaveDiskItem(PtrCurr->PtrNext->ItemData);
return DEL_FAILURE;
}
TcsyHead = TempHead; // 记录新的标头
PtrCurr->PtrPrior->ItemData = tPriorItem;
PtrCurr->PtrNext->ItemData = tNextItem; // 采用新的位置
if(m_bUserRegisted && IsSameAddr(tCurrItem.AddrSelf,
AddrRegist)) // 同步登陆注册
{
m_bUserRegisted = FALSE; AddrRegist.Set(0L, 0L);
}
}
m_nNodeCount--; // 少了一个成员
PtrCurr->PtrPrior->PtrNext = PtrCurr->PtrNext;
PtrCurr->PtrNext->PtrPrior = PtrCurr->PtrPrior;
STcsyRegistNode *pNext = PtrCurr->PtrNext; // 记录下点指针
delete PtrCurr; PtrCurr = pNext;
return DEL_SUCCESS; // 返回删除成功
}
/////////////////////////////////////////////////////////////////////////////
// 注册对话框的窗口过程:SDK开发,系统回调函数
INT FAR PASCAL RegistDlgProc(HWND hWnd, // 对话框窗口句柄
UINT uMsg, // 收到的消息
WPARAM wParam, // 第一消息参数
LPARAM lParam) // 第二消息参数
{
INT nSuccess = 1L, nLen = 0L, i = 0L; // 处理结果标记
static HBRUSH hBackBrush = NULL; // 窗体背景画刷
static SckRegistExchange *pExch = NULL; // 对话交换数据
const int nID[4] = {IDC_REGISTERCODE1, IDC_REGISTERCODE2,
IDC_REGISTERCODE3, IDC_REGISTERCODE4}; // 四个注册编辑
char chReturn[100] = ""; // 四分隔返回码
int nWide = 0, nHigh = 0; RECT rect; // 窗口的宽和高
switch(uMsg) // 消息分发处理
{
//------------------------------------------------------------//
case WM_INITDIALOG: // 初始化对话框
pExch = (SckRegistExchange *)lParam; if(!pExch) break;
SetDlgItemText(hWnd, IDC_USERNAME, pExch->chNameID);
SetDlgItemText(hWnd, IDC_PRODUCTNUM, pExch->chProduct);
nLen = lstrlen(pExch->chReturn) / 4; i = 0; // 分段显返回码
memcpy(&chReturn[i], &pExch->chReturn[0 * nLen], nLen); i += nLen;
chReturn[i++] = '-';
memcpy(&chReturn[i], &pExch->chReturn[1 * nLen], nLen); i += nLen;
chReturn[i++] = '-';
memcpy(&chReturn[i], &pExch->chReturn[2 * nLen], nLen); i += nLen;
chReturn[i++] = '-';
memcpy(&chReturn[i], &pExch->chReturn[3 * nLen], nLen); i += nLen;
chReturn[i] = '\0'; // 四段显示字串
SetDlgItemText(hWnd, IDC_RETURNCODE, chReturn);
SendMessage(GetDlgItem(hWnd, IDC_USERNAME), EM_LIMITTEXT,
sizeof(pExch->chNameID) - 1, 0); // 最大允许长度
for(i=0; i<4; i++) SendMessage(GetDlgItem(hWnd, nID[i]), \
EM_LIMITTEXT, 8, 0);
nWide = GetSystemMetrics(SM_CXSCREEN); // 屏幕的宽和高
nHigh = GetSystemMetrics(SM_CYSCREEN);
GetWindowRect(hWnd, &rect); // 窗口的宽和高
nWide = (nWide - (rect.right - rect.left + 1)) / 2;
nHigh = (nHigh - (rect.bottom - rect.top + 1)) / 2;
hBackBrush = CreateSolidBrush(RGB(0xA5, 0xCB, 0xF7));
SetWindowPos(hWnd, HWND_TOPMOST, nWide, nHigh, 0, 0, SWP_NOSIZE);
break;
//------------------------------------------------------------//
case WM_DESTROY: // 释放画刷资源
if(hBackBrush) DeleteObject(hBackBrush);
break;
//------------------------------------------------------------//
case WM_COMMAND: // 菜单按钮命令
i = LOWORD(wParam);
if(HIWORD(wParam) == EN_CHANGE && i >= nID[0] && i <= nID[3])
{
i = i - nID[0]; // 移到下一单元
nLen = SendMessage(GetDlgItem(hWnd, nID[i]), EM_LINELENGTH, 0, 0);
if(nLen == 8) SetFocus(GetDlgItem(hWnd, nID[(i + 1) % 4]));
}
switch(LOWORD(wParam)) // 用户选择取消
{
case IDCANCEL:
EndDialog(hWnd, IDCANCEL);
break;
case IDOK:
if(pExch != NULL) // 返回各类数据
{
nLen = GetDlgItemText(hWnd, IDC_USERNAME, pExch->chNameID,
sizeof(pExch->chNameID)); // 提取用户名称
if(nLen < 1) {SetFocus(GetDlgItem(hWnd, IDC_USERNAME)); break;}
for(i=0; i<4; i++) // 检查注册码长
{
if(SendMessage(GetDlgItem(hWnd, nID[i]), EM_LINELENGTH, 0,
0) != 8) {SetFocus(GetDlgItem(hWnd, nID[i])); break;}
}
if(i < 4) break; // 不足08字符长
for(i=0; i<4; i++) GetDlgItemText(hWnd, nID[i], \
&pExch->chRegist[i * 8], 9); // 提取注册全码
}
EndDialog(hWnd, IDOK);
break;
default: nSuccess = 0L; break; // 其它的不响应
}
break;
//------------------------------------------------------------//
case WM_CTLCOLORDLG: // 浅蓝背景画刷
return (INT)hBackBrush;
break;
//------------------------------------------------------------//
case WM_LBUTTONDOWN: // 点击移动窗体
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -