上一个内容:25.入口点注入
首先创建一个mfc项目:
然后
然后
然后就创建好了,选择Dlg自定义比较方便
然后可以设置一下项目的版本信息
然后设置一下tab,让它可以随着窗口的大小进行灵活变更
tab设置之后的效果图:
然后添加一个tab的变量,点完成
在下图红框位置添加额外的初始化代码
然后先插入两个Dialog
它们的样式属性要设置为Child,否则主页面的TAb控制没法切换
然后给新加的Dialog添加上类
双击下图红框位置可以自动创建一个函数,这个函数是用来切换的
函数图:
代码:
GAMEHACKERDlg.cpp文件
bool CGAMEHACKERDlg::InstallPage(CDialogEx* wnd, int IDD_WND, CString&& _Name, BOOL IsShow)
{
if (CurPage >= MAX_PAGE) {
return false;
}
Pages[CurPage] = wnd;
Pages[CurPage]->Create(IDD_WND);
Pages[CurPage]->SetParent(this);
Pages[CurPage]->ShowWindow(IsShow);
CRect rect;
mTab.GetClientRect(&rect);
rect.top += 46;
rect.left += 20;
rect.bottom += 5;
rect.right += 5;
Pages[CurPage]->MoveWindow(&rect);
mTab.InsertItem(CurPage, _Name);
CurPage++;
return false;
}
InstallPage(&PageINJ, IDD_PAGE_0, L"注入", TRUE);
InstallPage(&PageINC, IDD_PAGE_1, L"注入检测");
void CGAMEHACKERDlg::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
// 得到当前选择的tab
int n = mTab.GetCurSel();
for (int i = 0; i < CurPage; i++) {
Pages[i]->ShowWindow(i == n);
}
}
GAMEHACKERDlg.h文件
protected:
HICON m_hIcon;
CWndINJ PageINJ;
CWndINC PageINC;
CDialogEx* Pages[MAX_PAGE];
// CString Name[MAX_PAGE];
short CurPage = 0;
bool InstallPage(CDialogEx* wnd, int IDD_WND, CString&& _Name, BOOL IsShow = FALSE);
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CTabCtrl mTab;
afx_msg void OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult);
};