7 MFC CWnd类

该代码段展示了MFC中对对话框类CDemoDlg的实现,包括初始化对话框、处理各种窗口消息(如按键、鼠标点击)、窗口样式修改、子窗口操作等。通过这些方法可以了解如何在MFC应用中控制窗口及其组件的行为。
摘要由CSDN通过智能技术生成

// DemoDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "Demo.h"
#include "DemoDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CDemoDlg 对话框



CDemoDlg::CDemoDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_DEMO_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDemoDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CDemoDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_LBUTTONDOWN()
	ON_WM_KEYDOWN()
	ON_WM_KEYUP()
	ON_BN_CLICKED(IDC_BUTTON1, &CDemoDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CDemoDlg::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &CDemoDlg::OnBnClickedButton3)
	ON_BN_CLICKED(IDC_BUTTON4, &CDemoDlg::OnBnClickedButton4)
	ON_BN_CLICKED(IDC_BUTTON5, &CDemoDlg::OnBnClickedButton5)
	ON_BN_CLICKED(IDC_BUTTON6, &CDemoDlg::OnBnClickedButton6)
	ON_BN_CLICKED(IDC_BUTTON7, &CDemoDlg::OnBnClickedButton7)
	ON_BN_CLICKED(IDC_BUTTON8, &CDemoDlg::OnBnClickedButton8)
	ON_BN_CLICKED(IDC_BUTTON9, &CDemoDlg::OnBnClickedButton9)
	ON_BN_CLICKED(IDC_BUTTON10, &CDemoDlg::OnBnClickedButton10)
	ON_BN_CLICKED(IDC_BUTTON11, &CDemoDlg::OnBnClickedButton11)
	ON_BN_CLICKED(IDC_BUTTON12, &CDemoDlg::OnBnClickedButton12)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON13, &CDemoDlg::OnBnClickedButton13)
	ON_BN_CLICKED(IDC_BUTTON14, &CDemoDlg::OnBnClickedButton14)
	ON_BN_CLICKED(IDC_BUTTON15, &CDemoDlg::OnBnClickedButton15)
	ON_BN_CLICKED(IDC_BUTTON16, &CDemoDlg::OnBnClickedButton16)
	ON_BN_CLICKED(IDC_BUTTON17, &CDemoDlg::OnBnClickedButton17)
	ON_BN_CLICKED(IDC_BUTTON18, &CDemoDlg::OnBnClickedButton18)
	ON_BN_CLICKED(IDC_BUTTON19, &CDemoDlg::OnBnClickedButton19)
	ON_BN_CLICKED(IDC_BUTTON20, &CDemoDlg::OnBnClickedButton20)
	ON_BN_CLICKED(IDC_BUTTON21, &CDemoDlg::OnBnClickedButton21)
	ON_BN_CLICKED(IDC_BUTTON22, &CDemoDlg::OnBnClickedButton22)
	ON_BN_CLICKED(IDC_BUTTON23, &CDemoDlg::OnBnClickedButton23)
	ON_BN_CLICKED(IDC_BUTTON24, &CDemoDlg::OnBnClickedButton24)
	ON_BN_CLICKED(IDC_BUTTON25, &CDemoDlg::OnBnClickedButton25)
	ON_BN_CLICKED(IDC_BUTTON26, &CDemoDlg::OnBnClickedButton26)
	ON_BN_CLICKED(IDC_BUTTON27, &CDemoDlg::OnBnClickedButton27)
	ON_BN_CLICKED(IDC_BUTTON28, &CDemoDlg::OnBnClickedButton28)
	ON_BN_CLICKED(IDC_BUTTON29, &CDemoDlg::OnBnClickedButton29)
	ON_BN_CLICKED(IDC_BTN_START, &CDemoDlg::OnBnClickedBtnStart)
	ON_BN_CLICKED(IDC_BTN_STOP, &CDemoDlg::OnBnClickedBtnStop)
	ON_BN_CLICKED(IDC_BTN_TEST, &CDemoDlg::OnBnClickedBtnTest)
	ON_BN_CLICKED(IDC_BUTTON30, &CDemoDlg::OnBnClickedButton30)
	ON_BN_CLICKED(IDC_BUTTON31, &CDemoDlg::OnBnClickedButton31)
	ON_BN_CLICKED(IDC_BUTTON32, &CDemoDlg::OnBnClickedButton32)
	ON_BN_CLICKED(IDC_BUTTON33, &CDemoDlg::OnBnClickedButton33)
	ON_BN_CLICKED(IDC_BUTTON34, &CDemoDlg::OnBnClickedButton34)
	ON_BN_CLICKED(IDC_BUTTON35, &CDemoDlg::OnBnClickedButton35)
	ON_BN_CLICKED(IDC_BUTTON36, &CDemoDlg::OnBnClickedButton36)
	ON_BN_CLICKED(IDC_BUTTON37, &CDemoDlg::OnBnClickedButton37)
	ON_BN_CLICKED(IDC_BUTTON40, &CDemoDlg::OnBnClickedButton40)
	ON_BN_CLICKED(IDC_BUTTON39, &CDemoDlg::OnBnClickedButton39)
	ON_BN_CLICKED(IDC_BUTTON41, &CDemoDlg::OnBnClickedButton41)
	ON_BN_CLICKED(IDC_BUTTON42, &CDemoDlg::OnBnClickedButton42)
	ON_BN_CLICKED(IDC_BUTTON47, &CDemoDlg::OnBnClickedButton47)
	ON_BN_CLICKED(IDC_BUTTON48, &CDemoDlg::OnBnClickedButton48)
END_MESSAGE_MAP()


// CDemoDlg 消息处理程序

BOOL CDemoDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标


	HICON hIcon = GetIcon(TRUE);

	// TODO: 在此添加额外的初始化代码
	m_testWnd.MoveWindow(100, 100, 200, 100);//绑定之后就可以操作窗口


	
	//设置编辑框焦点
	CWnd* pEdit = GetDlgItem(IDC_EDIT1);
	pEdit->SetFocus();

	return FALSE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CDemoDlg::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
	{
		
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CDemoDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


//创建子空间,一般在这里创建
int CDemoDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CDialogEx::OnCreate(lpCreateStruct) == -1)
		return -1;

	//创建子控件
	
	HWND hEdit=::CreateWindow(L"Edit", L"", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_WANTRETURN, 0, 0, 200, 100, m_hWnd, NULL, AfxGetInstanceHandle(), NULL);
	//绑定函数
	m_testWnd.Attach(hEdit);//SubclassWindow 也可以

	return 0;
}


void CDemoDlg::OnDestroy()
{
	CDialogEx::OnDestroy();
	m_testWnd.Detach();//一定要分离
	
}


void CDemoDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	ClientToScreen(&point);//客户端坐标系转屏幕坐标系
	CString str;

	str.Format(L"%d,%d", point.x, point.y);
	SetWindowText(str);

	CDialogEx::OnLButtonDown(nFlags, point);
}


//PreTranslateMessage是虚函数,是用来截获消息的。
//我们可以通过重载它来处理键盘和鼠标消息。
//对MFC没有实现的消息进行重载
BOOL CDemoDlg::PreTranslateMessage(MSG* pMsg)
{
	CString str;
	// TODO: 在此添加专用代码和/或调用基类
	if (pMsg->message == WM_KEYDOWN)
	{
		switch (pMsg->wParam)
		{
			case VK_LEFT:
			{
				str.Format(L"左移");
				SetWindowText(str);
				break;
			}
			case VK_ESCAPE://发现窗口退出,修改返回值
			{
				str.Format(L"ESC");
				SetWindowText(str);
				return TRUE;
			}
			case VK_RETURN://回车,发现窗口退出,此时要重写OnOK()函数
			{
				str.Format(L"回车");
				SetWindowText(str);
				break;
			}
		}
	}

	return CDialogEx::PreTranslateMessage(pMsg);
}

//键盘按下消息
void CDemoDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	CString str;
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	switch (nChar)
	{
		case VK_NUMPAD0:
		{
			str.Format(L"按了0键盘");
			SetWindowText(str);
			break;
		}
		/*case VK_LEFT://不能实现在PreTranslateMessage 进行重载
		{
			str.Format(L"左移");
			SetWindowText(str);
			break;
		}*/
	}

	CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}

//键盘抬起消息
void CDemoDlg::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CDialogEx::OnKeyUp(nChar, nRepCnt, nFlags);
}




//将OnOK 重写
void CDemoDlg::OnOK()
{
	// TODO: 在此添加专用代码和/或调用基类

	//CDialogEx::OnOK();
}


//MessageBox
void CDemoDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	MessageBox(L"CWnd::MessageBox");
}

//获取窗口标题
void CDemoDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	CString str;
	GetWindowText(str);
	MessageBox(str);
}


//设置窗口标题
void CDemoDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	SetWindowText(L"设置窗口标题");
}

//获取窗口标题长度
void CDemoDlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	int nLength = GetWindowTextLength();
}

//设置窗口大小
void CDemoDlg::OnBnClickedButton5()
{
	// TODO: 在此添加控件通知处理程序代码

	ShowWindow(SW_MINIMIZE);//最小化
}

//得到窗口控件
void CDemoDlg::OnBnClickedButton6()
{
	// TODO: 在此添加控件通知处理程序代码
	CWnd* pWnd=GetDlgItem(IDC_BUTTON1);
	if (pWnd != NULL)
	{
		pWnd->SetWindowText(SW_HIDE);//隐藏
	}
}

//最小化
void CDemoDlg::OnBnClickedButton7()
{
	// TODO: 在此添加控件通知处理程序代码
	CWnd* pWnd = GetDlgItem(IDC_BUTTON1);
	pWnd->CloseWindow();
}

//销毁窗口
void CDemoDlg::OnBnClickedButton8()
{
	// TODO: 在此添加控件通知处理程序代码
	CWnd* pWnd = GetDlgItem(IDC_BUTTON1);
	if (pWnd != NULL)
		pWnd->DestroyWindow();
}

//居中
void CDemoDlg::OnBnClickedButton9()
{
	// TODO: 在此添加控件通知处理程序代码
	CenterWindow();
}

//查找窗口
//FindWindow 只能查找主窗口,不能查找子空间
void CDemoDlg::OnBnClickedButton10()
{
	// TODO: 在此添加控件通知处理程序代码
	CWnd* pWnd=FindWindow(L"Notepad", L"新建文本文档.txt - 记事本");//(类,标题)
	if (pWnd == NULL)
	{
		MessageBox(L"没找到");
	}
	else
	{
		pWnd->SendMessage(WM_CLOSE, 0, 0);//发送关闭窗口
	}
}

//查找窗口
void CDemoDlg::OnBnClickedButton11()
{
	// TODO: 在此添加控件通知处理程序代码

	CWnd* pWnd = FindWindow(L"Notepad", L"新建文本文档.txt - 记事本");//(类,标题)
	if (pWnd == NULL)
	{
		MessageBox(L"没找到");
	}
	else
	{
		CWnd* pEditWnd=FindWindowEx(pWnd->m_hWnd,NULL,L"Edit",NULL);
		pEditWnd->CloseWindow();//最小化
	}
	
}

//闪动窗口
void CDemoDlg::OnBnClickedButton12()
{
	// TODO: 在此添加控件通知处理程序代码
	SetTimer(1, 700, NULL);
}

//定时器
void CDemoDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	FlashWindow(TRUE);
	switch (nIDEvent)
	{
		case 2:
		{
			CWnd* pWnd = GetDlgItem(IDC_BTN_TEST);
			CRect rect;
			pWnd->GetWindowRect(&rect);//基于屏幕坐标
			//转换客户区坐标
			ScreenToClient(&rect);

			int nWidth = rect.Width();
			int nHeight = rect.Height();
			rect.left += 25;
			rect.right += 25;
			

			//获取窗口客户区大小
			CRect WndRect;
			GetClientRect(&WndRect);
			if (rect.left > WndRect.right)
			{
				rect.left = -nWidth;
				rect.right = 0;
			}
			pWnd->MoveWindow(&rect, TRUE);
			break;
		}

	}

	CDialogEx::OnTimer(nIDEvent);
}

// FlashWindowEx不需要定时器连续闪烁
void CDemoDlg::OnBnClickedButton13()
{
	// TODO: 在此添加控件通知处理程序代码 

	
	FlashWindowEx(FLASHW_ALL,5,1000);
}

//返回桌面窗口的句柄
void CDemoDlg::OnBnClickedButton14()
{
	// TODO: 在此添加控件通知处理程序代码
	CWnd* pWnd=GetDesktopWindow();
	if (pWnd)
	{
		HWND hWnd = pWnd->m_hWnd;
	}
}

//获取窗口风格
void CDemoDlg::OnBnClickedButton15()
{
	CString str;
	// TODO: 在此添加控件通知处理程序代码
	DWORD  dwStyle=this->GetStyle();
	if (dwStyle &WS_CAPTION)
	{
		str += L"标题栏风格";
	}
	SetWindowText(str);
}

//获取拓展风格
void CDemoDlg::OnBnClickedButton16()
{
	// TODO: 在此添加控件通知处理程序代码
	DWORD  dwStyle = GetExStyle();
}

//修改风格
void CDemoDlg::OnBnClickedButton17()
{
	// TODO: 在此添加控件通知处理程序代码
	DWORD  dwStyle = this->GetStyle();
	//if (dwStyle &WS_CAPTION)
	//{
	//	ModifyStyle(WS_CAPTION,0);//移除
	//}
	ModifyStyle(0, WS_MAXIMIZEBOX | WS_MINIMIZEBOX);//添加风格

}

//ModifyStyleEx 拓展风格
void CDemoDlg::OnBnClickedButton18()
{
	// TODO: 在此添加控件通知处理程序代码
}

//判断窗口是不是子窗口
void CDemoDlg::OnBnClickedButton19()
{
	CWnd* pWnd = GetDlgItem(IDC_BUTTON1);//获取控件
	if (IsChild(pWnd))
	{
		MessageBox(L"是");
	}
	else
	{
		MessageBox(L"不是");
	}
}

//判断是不是最小化
void CDemoDlg::OnBnClickedButton20()
{
	// TODO: 在此添加控件通知处理程序代码
	if (FALSE==IsIconic())
	{
		ShowWindow(SW_MINIMIZE);
	}
	else
	{
		ShowWindow(SW_SHOW);
	}
}

//禁用窗口
void CDemoDlg::OnBnClickedButton21()
{
	// TODO: 在此添加控件通知处理程序代码
	CWnd* pWnd = GetDlgItem(IDC_BUTTON1);
	pWnd->EnableWindow(FALSE);//禁用
}

//判断是否被警用
void CDemoDlg::OnBnClickedButton22()
{
	// TODO: 在此添加控件通知处理程序代码
	CWnd* pWnd = GetDlgItem(IDC_BUTTON1);
	if (pWnd->IsWindowEnabled())
	{
		pWnd->EnableWindow(FALSE);//禁用
	}
	else
	{
		pWnd->EnableWindow(TRUE);//可用
	}
}

//判断窗口有没有隐藏
void CDemoDlg::OnBnClickedButton23()
{
	// TODO: 在此添加控件通知处理程序代码
	CWnd* pWnd = GetDlgItem(IDC_BUTTON1);
	if (pWnd->IsWindowVisible())
	{
		pWnd->ShowWindow(SW_HIDE);
	}
	else
	{
		pWnd->ShowWindow(SW_SHOW);
	}

}

//最大化
void CDemoDlg::OnBnClickedButton24()
{
	// TODO: 在此添加控件通知处理程序代码
	CWnd* pWnd = GetDlgItem(IDC_BUTTON1);
	if (pWnd->IsZoomed())
	{
		pWnd->CloseWindow();
	}
	else
	{
		pWnd->ShowWindow(SW_MAXIMIZE);
	}
	
}

//获取窗口大小,都属基于屏幕坐标(不管是主窗口还是子窗口)
void CDemoDlg::OnBnClickedButton25()
{
	// TODO: 在此添加控件通知处理程序代码
	CRect rect;
	GetWindowRect(&rect);

	CString str;
	str.Format(L"left:%d, top:%d, right:%d, bottom:%d", rect.left, rect.top, rect.right, rect.bottom);
	SetWindowText(str);
}

//基于客户区坐标系
void CDemoDlg::OnBnClickedButton26()
{
	// TODO: 在此添加控件通知处理程序代码
	CRect rect;
	GetClientRect(&rect);
	CString str;
	str.Format(L"left:%d, top:%d, right:%d, bottom:%d", rect.left, rect.top, rect.right, rect.bottom);
	SetWindowText(str);
}

//屏幕坐标系转客户端坐标系
void CDemoDlg::OnBnClickedButton27()
{
	// TODO: 在此添加控件通知处理程序代码
	//获取按钮的屏幕坐标系
	CWnd* pWnd = GetDlgItem(IDC_BUTTON1);
	CRect rect;
	pWnd->GetWindowRect(&rect);
	ScreenToClient(&rect);

	CString str;
	str.Format(L"转换后left:%d, top:%d, right:%d, bottom:%d", rect.left, rect.top, rect.right, rect.bottom);
	SetWindowText(str);
}


//客户区坐标系转屏幕坐标系
void CDemoDlg::OnBnClickedButton28()
{
	// TODO: 在此添加控件通知处理程序代码、

	CWnd* pWnd = GetDlgItem(IDC_BUTTON1);
	CRect rect;
	pWnd->GetWindowRect(&rect);
	ClientToScreen(&rect);

	CString str;
	str.Format(L"转换后left:%d, top:%d, right:%d, bottom:%d", rect.left, rect.top, rect.right, rect.bottom);
	SetWindowText(str);

}


//移动一个窗口
void CDemoDlg::OnBnClickedButton29()
{
	// TODO: 在此添加控件通知处理程序代码
	CWnd* pWnd = GetDlgItem(IDC_BUTTON1);
	pWnd->MoveWindow(0, 0, 70, 20,TRUE);

}

//开始移动
void CDemoDlg::OnBnClickedBtnStart()
{
	// TODO: 在此添加控件通知处理程序代码
	

	//开启定时器
	SetTimer(2, 200, NULL);
}

//停止移动
void CDemoDlg::OnBnClickedBtnStop()
{
	// TODO: 在此添加控件通知处理程序代码
	KillTimer(2);

	//获取屏幕的宽和高
	int nWidth = GetSystemMetrics(SM_CXSCREEN);
	int nHeigth = GetSystemMetrics(SM_CYSCREEN);
}

//测试
void CDemoDlg::OnBnClickedBtnTest()
{
	
}




//抖动窗口
void CDemoDlg::OnBnClickedButton30()
{
	CRect rect;
	GetWindowRect(&rect);

	int nWidth = rect.Width();
	int nHeight = rect.Height();

	for (int i = 0; i < 5; i++)
	{
		//用OffsetRect 偏移
		rect.OffsetRect(5, 5);
		MoveWindow(&rect);
		Sleep(50);//延迟
		rect.OffsetRect(-5, -5);
		MoveWindow(&rect);
		Sleep(50);//延迟
	}

	

}

//设置窗口位置,设置顶层,底层,也能改变大小和移动
void CDemoDlg::OnBnClickedButton31()
{
	// TODO: 在此添加控件通知处理程序代码
	SetWindowPos(&wndTopMost,0,0,500,300, SWP_SHOWWINDOW);//设置顶层
}



//GetTopWindow函数检查与特定父窗口相联的子窗口z序,
//并返回在z序顶部的子窗口的句柄。
void CDemoDlg::OnBnClickedButton32()
{
	// TODO: 在此添加控件通知处理程序代码
	Sleep(2000);
	CWnd* pWnd=GetTopWindow();
	CString str;
	pWnd->GetWindowText(str);
	MessageBox(str);
}

//获取焦点
void CDemoDlg::OnBnClickedButton33()
{
	
	CWnd* pWnd = GetFocus();
	pWnd->SetWindowText(L"焦点");
}


//设置焦点
void CDemoDlg::OnBnClickedButton34()
{
	CWnd* pEdit = GetDlgItem(IDC_EDIT1);
	pEdit->SetFocus();
}

//激活窗口
void CDemoDlg::OnBnClickedButton35()
{
	
	CWnd* pWnd=GetActiveWindow();//获取出来的一般都是自己的窗口
	CString str;
	pWnd->GetWindowText(str);
	MessageBox(str);

}

//获取一个前台窗口的句柄(用户当前工作的窗口)。
//该系统分配给其他线程比它的前台窗口的线程创建一个稍微更高的优先级。
void CDemoDlg::OnBnClickedButton36()
{
	CWnd* pWnd=GetForegroundWindow();
	CString str;
	pWnd->GetWindowText(str);
	MessageBox(str);
}


void CDemoDlg::OnBnClickedButton37()
{
	GetDlgCtrlID();

}

//获取文本
void CDemoDlg::OnBnClickedButton40()
{
	CString str;
	GetDlgItemText(IDC_EDIT1,str);
	MessageBox(str);
}

//获取文本整数
void CDemoDlg::OnBnClickedButton39()
{
	CString str;
	BOOL b;
	int n=GetDlgItemInt(IDC_EDIT1,&b,TRUE);//(控件ID,是否转换成功,要不要带负号)

	int a = 10;
}

//设置文本内容
void CDemoDlg::OnBnClickedButton41()
{
	SetDlgItemText(IDC_EDIT1, L"123");
}

//设置整数
void CDemoDlg::OnBnClickedButton42()
{
	SetDlgItemInt(IDC_EDIT1, 10,TRUE);//(控件,整数值,是否有符号)
}

//创建子窗口
void CDemoDlg::OnBnClickedButton47()
{
	static CWnd testButton;//延长生命周期
	testButton.Create(L"Button",L"Create创建",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,CRect(0,0,120,30),this,1099);
}

//创建子窗口
void CDemoDlg::OnBnClickedButton48()
{
	static CWnd m_wnd;
	LPCTSTR lpClassName=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
		LoadCursor(NULL, IDC_ARROW), 
		CreateSolidBrush(RGB(255, 0, 0)), 
		LoadIcon(NULL, IDI_ERROR));
	
	//窗口类型
	m_wnd.CreateEx(WS_EX_APPWINDOW, lpClassName,
		L"CreateEx",
		WS_BORDER|WS_CAPTION|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
		0,0,600,300,this->m_hWnd,NULL,NULL);
	m_wnd.ShowWindow(SW_SHOW);

}

在这里插入图片描述

获取窗口名以及句柄函数


// SpyDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "Spy.h"
#include "SpyDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CSpyDlg 对话框



CSpyDlg::CSpyDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_SPY_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSpyDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CSpyDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CSpyDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CSpyDlg::OnBnClickedButton2)
END_MESSAGE_MAP()


// CSpyDlg 消息处理程序

BOOL CSpyDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	//获取列表
	CListCtrl* pList =(CListCtrl*)GetDlgItem(IDC_LIST1);
	pList->InsertColumn(0, L"窗口名", LVCFMT_LEFT, 150);//插入列表标题
	pList->InsertColumn(1, L"句柄", LVCFMT_LEFT, 150);
	pList->InsertColumn(2, L"控件ID", LVCFMT_LEFT, 150);


	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CSpyDlg::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
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CSpyDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


//获取所有列
void CSpyDlg::OnBnClickedButton1()
{
	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST1);
	

	//获取桌面
	//CWnd* pWnd=GetDesktopWindow();
	CWnd* pWnd;
	pWnd = this->GetWindow(GW_HWNDFIRST);//获取桌面同级的第一个
	//pWnd->GetWindow(GW_HWNDFIRST);//获取桌面同级的第一个
	while (pWnd)
	{
		//获取窗口标题
		CString str;
		pWnd->GetWindowText(str);
		pList->InsertItem(0, str);//插入一行
		pWnd->m_hWnd;//获取窗口句柄
		str.Format(L"%#x", pWnd->m_hWnd);
		pList->SetItemText(0, 1, str);//修改一行

		int nID=pWnd->GetDlgCtrlID();
		str.Format(L"%d", nID);
		pList->SetItemText(0, 2, str);
		pWnd = pWnd->GetWindow(GW_HWNDNEXT);//获取窗口的下一个
	}

}


//获取子控件
void CSpyDlg::OnBnClickedButton2()
{
	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST1);

	

	//获取桌面
	//CWnd* pWnd=GetDesktopWindow();
	CWnd* pWnd;
	pWnd = this->GetWindow(GW_CHILD| GW_HWNDFIRST);获取桌面同级的第一个
	//pWnd->GetWindow(GW_HWNDFIRST);//获取桌面同级的第一个
	while (pWnd)
	{
		//获取窗口标题
		CString str;
		pWnd->GetWindowText(str);
		pList->InsertItem(0, str);//插入一行
		//pWnd->m_hWnd;//获取窗口句柄
		str.Format(L"%#x", pWnd->m_hWnd);
		pList->SetItemText(0, 1, str);//修改一行

		//获取父窗口
		CWnd* pParentWnd = this->GetParent();

		pWnd = pWnd->GetWindow(GW_HWNDNEXT);//获取窗口的下一个
	}
}

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值