ddedlg.cpp

来自「MFC编程实例」· C++ 代码 · 共 389 行

CPP
389
字号
#include "stdafx.h"
#include "DDECli.h"
#include "DDEDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);
	//}}AFX_VIRTUAL

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)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


TCHAR CDDECliDlg::m_szService[]=TEXT("PROGMAN");
DWORD CDDECliDlg::m_dwInst=0;
HSZ CDDECliDlg::m_hszServiceName=0;
HCONV CDDECliDlg::m_hConvClient=0;

CDDECliDlg::CDDECliDlg(CWnd* pParent):CDialog(CDDECliDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDDECliDlg)
	m_szCommand = _T("");
	//}}AFX_DATA_INIT
	m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_szFormats[0]="[CreateGroup(%s)]";
	m_szFormats[1]="[ShowGroup(%s,1)]";
	m_szFormats[2]="[DeleteGroup(%s)]";
	m_szFormats[3]="[AddItem(%s,%s)]";
	m_szFormats[4]="[DeleteItem(%s)]";
}

void CDDECliDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDDECliDlg)
	DDX_Control(pDX, IDC_COMBO_TYPE, m_cbType);
	DDX_Control(pDX, IDC_BUTTON_COMMAND, m_btnCommand);
	DDX_Control(pDX, IDC_BUTTON_CONNECT, m_btnConnect);
	DDX_Control(pDX, IDC_EDIT, m_ecMsg);
	DDX_Text(pDX, IDC_EDIT_COMMAND, m_szCommand);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDDECliDlg, CDialog)
	//{{AFX_MSG_MAP(CDDECliDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_CONNECT, OnButtonConnect)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_BUTTON_COMMAND, OnButtonCommand)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL CDDECliDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	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);
	
	InitializeDDE();

	m_btnCommand.EnableWindow(FALSE);

	return TRUE;
}

void CDDECliDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

void CDDECliDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this);

		SendMessage(WM_ICONERASEBKGND, (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 CDDECliDlg::OnQueryDragIcon()
{
	return (HCURSOR)m_hIcon;
}

HDDEDATA CALLBACK CDDECliDlg::DdeCallback
(
	UINT wType,
	UINT wFormat,
	HCONV hConv,
	HSZ hszTopic,
	HSZ hszItem,
	HDDEDATA hData,
	DWORD lData1,
	DWORD lData2
)
{
	switch(wType)
	{
	    case XTYP_REGISTER: 
        case XTYP_UNREGISTER:
		case XTYP_ADVSTART:
		case XTYP_ADVDATA:
		case XTYP_ADVREQ:
		case XTYP_ADVSTOP:
		case XTYP_XACT_COMPLETE:
		case XTYP_CONNECT:
		{
			return (HDDEDATA)NULL;
		}
        case XTYP_DISCONNECT:
		{
			m_hConvClient=0;
			((CDDECliDlg *)(AfxGetApp()->m_pMainWnd))->m_btnConnect.SetWindowText("Connect");
			Printf("Disconnected by the server.\r\n");
			((CDDECliDlg *)(AfxGetApp()->m_pMainWnd))->m_btnCommand.EnableWindow(FALSE);
			return (HDDEDATA)NULL;
		}
		case XTYP_CONNECT_CONFIRM:
		{
			return (HDDEDATA)NULL; 
		}
        default:
		{
			return (HDDEDATA)NULL; 
		}
	}
}

void CDDECliDlg::InitializeDDE()
{
	UINT uDdeInit;
	CString szRlt;

	uDdeInit=::DdeInitialize
	(
		&m_dwInst,
		(PFNCALLBACK)DdeCallback,
		APPCMD_FILTERINITS, 
		0L
	);

	switch(uDdeInit)
	{
		case DMLERR_NO_ERROR:
		{
			m_hszServiceName=ObtainHsz(m_szService);
			szRlt="DDE initialized successfully!";
			break;
		}
		case DMLERR_DLL_USAGE:
		{
			szRlt="Fail to initialize DDE: Dll usage error!";
			break;
		}
		case DMLERR_INVALIDPARAMETER:
		{
			szRlt="Fail to initialize DDE: Invalid parameter!";
			break;
		}
		case DMLERR_SYS_ERROR:
		{
			szRlt="Fail to initialize DDE: System error!";
			break;
		}
	}
	
	Printf((LPCSTR)szRlt);
	Printf("\r\n");
}

HSZ CDDECliDlg::ObtainHsz(CString szStr)
{
	HSZ hsz=0;

	if(m_dwInst != 0)
	{
		hsz=::DdeCreateStringHandle(m_dwInst, szStr, NULL);
	}

	return hsz;
}

void CDDECliDlg::UnobtainHsz(HSZ hsz)
{
	if(m_dwInst != 0)
	{
		::DdeFreeStringHandle(m_dwInst, hsz);
	}
}

void CDDECliDlg::Printf(const char *fmt, ...)
{
	char buff[1024];

	va_list argp;
	va_start(argp, fmt);
	vsprintf(buff, fmt, argp);
	va_end(argp);
	((CDDECliDlg *)(AfxGetApp()->m_pMainWnd))->m_ecMsg.ReplaceSel(buff);
}

void CDDECliDlg::OnButtonConnect() 
{
	if(m_hConvClient == 0)
	{
		m_hConvClient=::DdeConnect
		(
			m_dwInst, m_hszServiceName, 0L, (PCONVCONTEXT)NULL
		);
		if(m_hConvClient == FALSE)
		{
			Printf("Unable to connect server!\r\n");
		}
		else 
		{
			m_btnCommand.EnableWindow();
			Printf("Connected to server!\r\n");
		}
		m_btnConnect.SetWindowText("Disconnect");
	}
	else
	{
		::DdeDisconnect(m_hConvClient);
		m_hConvClient=0;
		m_btnConnect.SetWindowText("Connect");
		Printf("Disconnected by the client!\r\n");
		m_btnCommand.EnableWindow(FALSE);
	}
}

void CDDECliDlg::OnClose() 
{
	if(m_hConvClient != 0)
	{
		::DdeDisconnect(m_hConvClient);
	}
	
	::DdeNameService(m_dwInst, NULL, NULL, DNS_UNREGISTER);
	UnobtainHsz(m_hszServiceName);
	::DdeUninitialize(m_dwInst);

	CDialog::OnClose();
}

BOOL CDDECliDlg::PreTranslateMessage(MSG *pMsg) 
{
	if
	(
		pMsg->hwnd == m_ecMsg.m_hWnd && 
		(
			pMsg->message == WM_LBUTTONDOWN ||
			pMsg->message == WM_RBUTTONDOWN ||
			pMsg->message == WM_MOUSEMOVE
		)
	)return TRUE;
	return CDialog::PreTranslateMessage(pMsg);
}

void CDDECliDlg::OnButtonCommand() 
{
	CString szCommand;
	CString szFile;
	CFileDialog dlg(TRUE);
	int nSel;

	UpdateData();
	if(m_szCommand.IsEmpty())
	{
		AfxMessageBox("Please input a string first!");
	}
	else
	{
		nSel=m_cbType.GetCurSel();
		szCommand.Empty();
		if(nSel != CB_ERR)
		{
			if(nSel == 3)
			{
				if(dlg.DoModal() == IDOK)
				{
					szFile=dlg.GetPathName();
					szCommand.Format(m_szFormats[nSel], szFile, m_szCommand);
				}
				else return;
			}
			else
			{
				szCommand.Format(m_szFormats[nSel], m_szCommand);
				szCommand+='\0';
			}
			if
			(
				::DdeClientTransaction
				(
					(LPBYTE)(LPCSTR)szCommand,
					szCommand.GetLength(),
					m_hConvClient,
					0,
					0,
					XTYP_EXECUTE,
					5000,
					NULL
				)
			)
			{
				Printf("Command  %s  executed!\r\n", (LPCSTR)szCommand);
			}
			else Printf("Command  %s  failed!\r\n", (LPCSTR)szCommand);
		}
		else
		{
			AfxMessageBox("Make a selection!");
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?