rasdiadlg.cpp
来自「Visual_C++.NET实用编程百例」· C++ 代码 · 共 342 行
CPP
342 行
// rasdiaDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "rasdia.h"
#include "rasdiaDlg.h"
#include "Ras.h"
#include "Raserror.h"
#include ".\rasdiadlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CrasdiaDlg 对话框
CrasdiaDlg::CrasdiaDlg(CWnd* pParent /*=NULL*/)
: CDialog(CrasdiaDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CrasdiaDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CrasdiaDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
END_MESSAGE_MAP()
// CrasdiaDlg 消息处理程序
BOOL CrasdiaDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将\“关于...\”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
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);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
DWORD dwRet,dwSize,dwEntries;
LPBYTE lpBuf;
LPRASENTRYNAME lpRasEntry= new RASENTRYNAME;
lpRasEntry->dwSize=sizeof(RASENTRYNAME);
dwSize=sizeof(RASENTRYNAME);
dwRet=RasEnumEntries(NULL,NULL,lpRasEntry,&dwSize,&dwEntries);
delete lpRasEntry;
lpBuf=new BYTE[dwSize];
lpRasEntry=(LPRASENTRYNAME)lpBuf;
lpRasEntry->dwSize =sizeof(RASENTRYNAME);
dwRet=RasEnumEntries(NULL,NULL,lpRasEntry,&dwSize,&dwEntries);
CComboBox* pcbBox=(CComboBox*)GetDlgItem(IDC_COMBO1);
if(dwSize>0)
{
for(DWORD i=0;i<dwEntries;lpRasEntry++,i++)
pcbBox->AddString (lpRasEntry->szEntryName);
pcbBox->SetCurSel (0);
}
else
{
AfxMessageBox("你必须先建立拨号网络连接",MB_OK|MB_ICONERROR);
SendMessage(WM_CLOSE);
return FALSE;
}
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void CrasdiaDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CrasdiaDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
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;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CrasdiaDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CrasdiaDlg::OnBnClickedOk()
{
UpdateData();
GetDlgItem(IDOK)->EnableWindow(FALSE);
GetDlgItem(IDC_COMBO1)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);
TCHAR lpszEntry[256];
GetDlgItemText(IDC_COMBO1,lpszEntry,255);
RASDIALPARAMS rasDial;
rasDial.dwSize=sizeof(RASDIALPARAMS);
lstrcpy(rasDial.szEntryName,lpszEntry);
lstrcpy(rasDial.szPhoneNumber,_T(""));
lstrcpy(rasDial.szCallbackNumber,_T(""));
GetDlgItemText(IDC_EDIT1,rasDial.szUserName,UNLEN);
GetDlgItemText(IDC_EDIT2,rasDial.szPassword,PWLEN);
hRasConn=NULL;
DWORD dwRet=RasDial(NULL,NULL,&rasDial,0L,NULL,&hRasConn);
if(dwRet)
{
CString szMsg;
if(RasGetErrorString((UINT)dwRet,szMsg.GetBuffer(256),256)!=0)
{
szMsg.ReleaseBuffer ();
szMsg.Format (" 未知的远程访问错误,错误代码为:%ld.",dwRet);
}
else
szMsg.ReleaseBuffer ();
CString buf;
buf.Format ("错误代码为:%ld.",dwRet);
szMsg+=buf;
MessageBox(szMsg,"拨号失败",MB_OK|MB_ICONSTOP);
hRasConn=NULL;
GetDlgItem(IDOK)->EnableWindow();
GetDlgItem(IDC_COMBO1)->EnableWindow();
GetDlgItem(IDC_EDIT1)->EnableWindow();
GetDlgItem(IDC_EDIT2)->EnableWindow();
SetDlgItemText(IDC_STATUS,"未连接,空闲");
}
}
void CrasdiaDlg::RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
{
CrasdiaDlg* dlg=(CrasdiaDlg*)AfxGetApp()->m_pMainWnd;
dlg->PostMessage (WM_RASDIALEVENT,(WPARAM)rasconnstate,(LPARAM)dwError);
}
LRESULT CrasdiaDlg::DefWindowProc(UINT message, WPARAM wParam,LPARAM lParam)
{
if(message==WM_RASDIALEVENT)
return OnRasDialEvent(wParam,lParam);
else
return CDialog::DefWindowProc (message,wParam,lParam);
return LRESULT();
}
LRESULT CrasdiaDlg::OnRasDialEvent(WPARAM wParam, LPARAM lParam)
{
CString szMsg;
CString buf;
LoadString(AfxGetInstanceHandle(),GetRasConnState((RASCONNSTATE)wParam),buf.GetBuffer (256),256);
szMsg.ReleaseBuffer ();
SetDlgItemText(IDC_STATUS,"");
SetDlgItemText(IDC_STATUS,buf);
if(lParam)
{
if(RasGetErrorString((UINT)lParam,szMsg.GetBuffer (256),256)!=0)
{
szMsg.ReleaseBuffer ();
szMsg.Format ("未知得远程访问错误,");
}
else
szMsg.ReleaseBuffer ();
buf.Format ("错误代码为:%ld.",lParam);
szMsg+=buf;
MessageBox(szMsg,"拨号失败",MB_OK|MB_ICONSTOP);
RasHangUp(hRasConn);
hRasConn=NULL;
GetDlgItem(IDOK)->EnableWindow();
GetDlgItem(IDC_COMBO1)->EnableWindow();
GetDlgItem(IDC_EDIT1)->EnableWindow();
GetDlgItem(IDC_EDIT2)->EnableWindow();
SetDlgItemText(IDC_STATUS,"未连接,空闲");
}
else if(RASCS_DONE*wParam)
{
CDialog::OnOK ();
}
return LRESULT();
}
UINT CrasdiaDlg::GetRasConnState(RASCONNSTATE rasconn)
{
switch(rasconn)
{
case RASCS_OpenPort:
return IDS_OPENPORT;
case RASCS_PortOpened:
return IDS_PORTOPENED;
case RASCS_ConnectDevice:
return IDS_CONNECTDEVICE;
case RASCS_DeviceConnected:
return IDS_DEVICECONNECTED;
case RASCS_AllDevicesConnected:
return IDS_ALLDEVICESCONNECTED;
case RASCS_Authenticate:
return IDS_AUTHENTICATE;
case RASCS_AuthNotify:
return IDS_AUTHNOTIFY;
case RASCS_AuthRetry:
return IDS_AUTHRETRY;
case RASCS_AuthCallback:
return IDS_AUTHCALLBACK;
case RASCS_AuthChangePassword:
return IDS_AUTHCHANGEPASSWORD;
case RASCS_AuthProject:
return IDS_AUTHPROJECT;
case RASCS_AuthLinkSpeed:
return IDS_AUTHLINKSPEED;
case RASCS_AuthAck:
return IDS_AUTHACK;
case RASCS_ReAuthenticate:
return IDS_REAUTHENTICATE;
case RASCS_Authenticated:
return IDS_AUTHENTICATED;
case RASCS_PrepareForCallback:
return IDS_PREPAREFORCALLBACK;
case RASCS_WaitForModemReset:
return IDS_WAITFORMODEMRESET;
case RASCS_WaitForCallback:
return IDS_WAITFORCALLBACK;
case RASCS_Interactive:
return IDS_INTERACTIVE;
case RASCS_RetryAuthentication:
return IDS_RETRYAUTHENTICATION;
case RASCS_CallbackSetByCaller:
return IDS_CALLBACKSETBYCALLER;
case RASCS_PasswordExpired:
return IDS_PASSWORDEXPIRED;
case RASCS_Connected:
return IDS_CONNECTED;
case RASCS_Disconnected:
return IDS_DISCONNECTED;
default:
return IDS_UNDEFINED_ERROR;
}
return 0;
}
void CrasdiaDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
if(hRasConn!=NULL)
{
RasHangUp(hRasConn);
hRasConn=NULL;
GetDlgItem(IDOK)->EnableWindow();
GetDlgItem(IDC_COMBO1)->EnableWindow();
GetDlgItem(IDC_EDIT1)->EnableWindow();
GetDlgItem(IDC_EDIT2)->EnableWindow();
SetDlgItemText(IDC_STATUS,"未连接,空闲");
}
else
OnCancel();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?