VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 184|回复: 0

VC++高级班之窗口篇-[18]动态创建按钮及响应

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-3-12 16:06:25 | 显示全部楼层 |阅读模式
----------------------------------------------------------------------------------------
①、动态创建按钮:
  1. //#define IDC_BUTTON_1 10001
  2. m_Btn.Create(_T("测试按钮"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20, 20, 100, 60), this, IDC_BUTTON_1);
  3. //CFont *pFont = this->GetFont();
  4. //m_Btn.SetFont(pFont);
复制代码


◆ lpszCaption是按钮上显示的文本;
◆ dwStyle指定按钮风格,可以是按钮风格与窗口风格的组合,取值有:
 窗口风格:
  WS_CHILD  子窗口,必须有
  WS_VISIBLE  窗口可见,一般都有
  WS_DISABLED  禁用窗口,创建初始状态为灰色不可用的按钮时使用
  WS_TABSTOP  可用Tab键选择
  WS_GROUP  成组,用于成组的单选按钮中的第一个按钮
 按钮风格:
  BS_PUSHBUTTON 下压式按钮,也即普通按钮
  BS_AUTORADIOBUTTON 含自动选中状态的单选按钮
  BS_RADIOBUTTON 单选按钮,不常用
  BS_AUTOCHECKBOX 含自动选中状态的复选按钮
  BS_CHECKBOX 复选按钮,不常用
  BS_AUTO3STATE 含自动选中状态的三态复选按钮
  BS_3STATE 三态复选按钮,不常用
 以上风格指定了创建的按钮类型,不能同时使用,但必须有其一。

BS_BITMAP 按钮上将显示位图
BS_DEFPUSHBUTTON 设置为默认按钮,只用于下压式按钮,一个对话框中只能指定一个默认按钮

◆ rect 指定按钮的大小和位置;
◆ pParentWnd 指示拥有按钮的父窗口,不能为NULL;
◆ nID指定与按钮关联的ID号,用上一步创建的ID号。
===================================================
②、添加按钮响应函数:完整功能是要动态创建控件后再动态响应控件中的事件,两者全部做到才算完整!
1、消息映射机制方式添加:
  1. afx_msg void OnBnClickedBtn1();
复制代码
  1. ON_BN_CLICKED(IDC_BUTTON_1, &CDrawTestDlg::OnBnClickedBtn1)
复制代码
  1. void CDrawTestDlg::OnBnClickedBtn1()
  2. {
  3.         MessageBox(_T("测试成功!"));
  4. }
复制代码

  1. //范围式的消息映射:
  2. //ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON_1, IDC_BUTTON_10, &CDrawTestDlg::OnBnClickedBtn)
  3. //void CDrawTestDlg::OnBnClickedBtn(UINT nID)
  4. //{
  5. //        MessageBox(_T("NddddNN"));
  6. //}
复制代码


2、OnCommand 方式添加响应函数:
  1. BOOL CDrawTestDlg::OnCommand(WPARAM wParam, LPARAM lParam)
  2. {
  3.         if (LOWORD(wParam) == IDC_BUTTON_1) {
  4.                 MessageBox(_T("NNN"));
  5.         }

  6.         return CDialog::OnCommand(wParam, lParam);
  7. }
复制代码

===================================================
③、在其他程序的界面上创建控件:
1、地址空间问题:这个分区是进程的私有(非共享)地址空间所在的地方。一个进程不能读取、写入、或者以任何方式访问驻留在该分区中的另一个进程的数据。对于所有应用程序来说,该分区是维护进程的大部分数据的地方。由于每个进程可以得到它自己的私有的、非共享分区,以便存放它的数据,因此,应用程序不太可能被其他应用程序所破坏,这使得整个系统更加健壮。

2、进行DLL注入,以解决exe地址空间问题,在其他进程的窗口中进行子窗口或者控件的创建。
===================================================
④、步骤:
1、创建一MFC规则DLL工程:DLLTester
2、对话框资源的添加(解释为什么创建对话框,而不是直接动态创建控件):IDD_CONTROL_DLG
并关联对话框类:CControlDialog
3、界面线程子类的添加:CUIThread
4、子窗口的创建,代码如下:
  1. DWORD WINAPI UIProc( LPVOID pParam )
  2. {
  3.         CWinThread *pThread = AfxBeginThread(RUNTIME_CLASS(CUIThread));
  4.         return 0;
  5. }
复制代码
  1. BOOL CDLLTesterApp::InitInstance()
  2. {
  3.         CWinApp::InitInstance();

  4.         DWORD dwThreadID = 0;
  5.         ::CreateThread(NULL, 0, UIProc, 0, 0, &dwThreadID);

  6.         return TRUE;
  7. }
复制代码
  1. ////////////////////////////////////////////////////////////////////////////////
  2. BOOL CUIThread::InitInstance()
  3. {
  4.         HWND hCalcWnd = FindWindow(_T("SciCalc"), _T("计算器"));
  5.         if (!hCalcWnd) return FALSE;

  6.         AFX_MANAGE_STATE(AfxGetStaticModuleState());
  7.         controlDlg.Create(IDD_CONTROL_DLG, CWnd::FromHandle(hCalcWnd));
  8.         controlDlg.SetWindowPos(&CWnd::wndTop, 230, 200, 70, 30, SWP_NOZORDER|SWP_SHOWWINDOW);
  9.         UpdateWindow(hCalcWnd);

  10.         return TRUE;
  11. }

  12. int CUIThread::ExitInstance()
  13. {
  14.         controlDlg.DestroyWindow();
  15.         return CWinThread::ExitInstance();
  16. }
复制代码


※※※ 注:
MFC DLL 初始化函数中不能创建MFC线程,具体见:http://support.microsoft.com/kb/142243/en-us
DLL 中资源的切换具体见:在DLL中使用资源:
http://www.cctry.com/thread-5516-1-1.html
http://www.cctry.com/thread-5517-1-1.html
===================================================
⑤、按钮响应函数:
  1. void CControlDialog::OnBnClickedButton1()
  2. {
  3.         CWnd *pParent = GetParent();
  4.         pParent->SetDlgItemText(0x193, _T("1234567890"));
  5. }
复制代码

===================================================
※※※ 小作业:动态创建其他控件……
------------------------------------- End -------------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
教程介绍及详情请见:http://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:http://www.cctry.com/static/vip/index.html





上一篇:VC++高级班之窗口篇-[17]实现任务栏托盘与气泡提示
下一篇:VC++高级班之窗口篇-[19]文档视图类程序框架的讲解

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-8-18 18:27

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表