MFC学习

本文介绍了如何使用MFC实现程序的单例模式,确保同一时间只能有一个实例运行,并展示了如何将已运行的实例调到前台。此外,还详细讲解了如何在MFC中发送消息给其他窗口,包括捕获鼠标、获取目标窗口句柄及发送WM_SETTEXT和WM_CLOSE消息等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

让MFC程序只能运行一个:

使用互斥对象CreateMutex();

BOOL CpipeApp::InitInstance()

{

m_hMute = ::CreateMutex(NULL, FALSE, "ss");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
return FALSE;
}

}


将已运行的实例调到前台

int CpipeDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;


//添加窗口属性
::SetProp(m_hWnd, AfxGetApp()->m_pszExeName, (HANDLE)1);




return 0;
}




void CpipeDlg::OnDestroy()
{
CDialogEx::OnDestroy();


::RemoveProp(m_hWnd, AfxGetApp()->m_pszExeName);
}


BOOL CpipeApp::InitInstance()

{

m_hMute = ::CreateMutex(NULL, FALSE, "ss");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{


CWnd* pDesktopWnd = CWnd::GetDesktopWindow();
CWnd* pWnd = pDesktopWnd->GetWindow(GW_CHILD);
while (pWnd != NULL)
{
if (::GetProp(pWnd->m_hWnd, m_pszExeName))
{
pWnd->SetForegroundWindow();
return FALSE;
}
pWnd = pWnd->GetWindow(GW_HWNDNEXT);


}
return FALSE;
}

}



发送消息:向本窗体或外部窗体发送消息。

SendMessage();

效果图



定义几个全局变量首先:

HICON m_hIcon;
HCURSOR m_hCursor;
RECT m_rtCtrl;
BOOL m_bCapturing;
HWND m_hwndDest;


然后初始化对话框中添加:

m_hCursor = LoadCursor(NULL, IDC_SIZEALL);
GetDlgItem(IDC_CAP)->GetWindowRect(&m_rtCtrl);//picture控件Icon类型

void CSendMessageDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
if (point.x >= m_rtCtrl.left && point.x <= m_rtCtrl.right
|| point.y >= m_rtCtrl.top && point.y <= m_rtCtrl.bottom)
{
m_bCapturing = true;
SetCapture();//开始捕获鼠标
SetCursor(m_hCursor);
}


CDialogEx::OnLButtonDown(nFlags, point);
}




void CSendMessageDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_bCapturing)
{
ReleaseCapture();
m_bCapturing = false;
POINT pt = point;//移动到记事本里坐标
ClientToScreen(&pt);
m_hwndDest = ::WindowFromPoint(pt);


TCHAR szBuf[MAX_PATH] = { 0 };
_stprintf_s(szBuf, L"0x%.8X", m_hwndDest);
CString str;
SetDlgItemText(IDC_EDIT_HWND, szBuf);
GetClassName(m_hwndDest, szBuf, MAX_PATH);
SetDlgItemText(IDC_EDIT_CLASEENAME, szBuf);
::SendMessage(m_hwndDest, WM_GETTEXT, MAX_PATH, (LPARAM)szBuf);
SetDlgItemText(IDC_EDIT_NAME, szBuf);
}


CDialogEx::OnLButtonUp(nFlags, point);
}




void CSendMessageDlg::OnBnClickedButton1()
{
CString str;
GetDlgItemText(IDC_EDIT_NAME, str);
::SendMessage(m_hwndDest, WM_SETTEXT, 0, (LPARAM)(LPCTSTR)str);
}




void CSendMessageDlg::OnBnClickedButton2()
{
::SendMessage(m_hwndDest, WM_CLOSE, 0, 0);
}


格式化字符串 :_stprintf_s


HWND hEdit = ::GetDlgItem(m_hWnd, IDC_EDIT_INPUT);//通过sendmesssage可以获取编辑框中字符串的长度
int nlen = ::SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0);
TCHAR szBuf[128] = { 0 };
_stprintf_s(szBuf, L"%d", nlen);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值