MFC(对话框,孙鑫C++第七讲笔记整理)

1.如果在SDI中要调用对话框

 a.先插入一个对话框资源;

 b.然后在ClassWizards中为其创建一个类。其目的是比较方便为添加按纽和消息响应函数。

 c.然后实例化它。在实例化时,必须将其头文件包含进去。

 

2.创建非模态对话框,注意它不能是局部变量。当点击非模态对话框的OnOK按纽时,它并没有关闭,而是隐藏了。需要调用destroyWindow().

 

3.一个对象只能一个按纽。为什么?因为在Wincore.cpp的628行有代码 ASSERT(pWnd->m_hWnd == NULL);   // only do once而创建后它的m_hWnd就不为0了。此处ASSERT的用法是如果括号里面不为真,则程序崩溃。

 

4.如何为静态文本框增加消息响应?首先将IDC_STATIC改名。同时还需要将Notify特性复选中。

 

5.完成加法功能。

 a.GetDlgItem();

 b.GetDlgItemText();

 c.GetDlgItemInt();

 d.将IDC_EDIT1关联CEDIT类型变量

 e.将IDC_EDIT1关联int型变量。注意调用 UpdateData();

 f. //::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);

 //::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);

 //GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1);

 m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);

 g. SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);

 SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)ch2);

 

6.点击按纽改变窗口尺寸

  if(GetDlgItemText(IDC_BUTTON2,str),str=="收缩<<")

 {

 SetDlgItemText(IDC_BUTTON2,"扩展>>");

 static CRect rectLarge;

 static CRect rectSmall;

 

 if(rectLarge.IsRectNull())

 {

 CRect rectSeparator;

 GetWindowRect(&rectLarge);

 GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator); rectSmall.left=rectLarge.left;

 rectSmall.top=rectLarge.top;

 rectSmall.right=rectLarge.right;

 rectSmall.bottom=rectSeparator.bottom;

 }

 if(str=="收缩<<")

 {

 SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),

  SWP_NOMOVE | SWP_NOZORDER);

 }

 else

 {

 SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),

  SWP_NOMOVE | SWP_NOZORDER);

 }

 

7.回车时将输入焦点移动到下一个控件

SetWindowLong()改变窗口的属性。

方法1:

改变控件的回调函数,注意IDC_EDIT1的MultiLine要复选上。

WNDPROC prevProc;

LRESULT CALLBACK WinSunProc(

 HWND hwnd,     // handle to window

 UINT uMsg,     // message identifier

 WPARAM wParam, // first message parameter

 LPARAM lParam  // second message parameter

)

{

 if(uMsg==WM_CHAR && wParam==0x0d)

 {

 //::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));

 //SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));

 CString str;

 str.Format("%d",hwnd);

 AfxMessageBox(str);//, UINT nType = MB_OK, UINT nIDHelp = 0 );

// AfxGetApp()->

 SetFocus(::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE));

 return 1;

 }

 else

 {

 return prevProc(hwnd,uMsg,wParam,lParam);

 }

}

BOOL CTestDlg::OnInitDialog()

{

 CDialog::OnInitDialog();

 

 // TOD Add extra initialization here

 prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,

 (LONG)WinSunProc);//设置回调函数

 return TRUE; // return TRUE unless you set the focus to a control

              // EXCEPTION: OCX Property Pages should return FALSE

}

方法2:

在OnOK响应函数中加入代码

 //GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus();

 //GetFocus()->GetNextWindow()->SetFocus();

 //GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();

 GetNextDlgTabItem(GetFocus())->SetFocus();

 

显示一个模态对话框:

显示一个非模态对话框:

[cpp]  view plain copy
  1. void CMyDialogView::OnShowmenue()   
  2. {  
  3.     // TODO: Add your command handler code here  
  4.   
  5.     /*CTestDialog cdlg; 
  6.     cdlg.DoModal();*/  
  7.   
  8.     CTestDialog *cdlg=new CTestDialog();//这里可以设置成成员变量,指针定义,堆栈跟程序一样的声明周期  
  9.     cdlg->Create(IDD_DIALOG1,NULL);  
  10.     cdlg->ShowWindow(SW_NORMAL);  
  11.       
  12.       
  13. }  

 

下面两端代码的效果是一样的:

[cpp]  view plain copy
  1. void CTestDialog::OnButton()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.       
  5.     if(!bIsCreate)  
  6.     {  
  7.         m_btn.Create("按钮",BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,80),this,123);  
  8.         bIsCreate=TRUE;  
  9.     }  
  10.     else  
  11.     {  
  12.         m_btn.DestroyWindow();  
  13.         bIsCreate=FALSE;  
  14.     }  
  15.   
  16.     /*if(!m_btn.m_hWnd) 
  17.     { 
  18.  
  19.     m_btn.Create("按钮",BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,80),this,123); 
  20.     } 
  21.     else 
  22.     { 
  23.         m_btn.DestroyWindow(); 
  24.     }*/  
  25. }  



 几种访问控件的方式:

拉控件:

 

利用

调整位置

 

改变了静态文本的ID,才能添加事件

修改了Notify才能在事件中,改变文本的内容

 

方法一:

[cpp]  view plain copy
  1. void CTestDialog::OnNumber1()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     CString str;  
  5.     GetDlgItem(ID_NUMBER1)->GetWindowText(str);  
  6.     if(str=="number1:")  
  7.     {  
  8.         GetDlgItem(ID_NUMBER1)->SetWindowText("数值1:");  
  9.     }  
  10.     else  
  11.     {  
  12.         GetDlgItem(ID_NUMBER1)->SetWindowText("number1:");  
  13.     }  
  14. }  


方法二:

[cpp]  view plain copy
  1. int num1,num2,num3;  
  2.     char ch1[8],ch2[8],ch3[9];  
  3.     GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,8);  
  4.     GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,8);  
  5.       
  6.     num1=atoi(ch1);//将字符串转化为整数  
  7.     num2=atoi(ch2);  
  8.     num3=num1+num2;  
  9.       
  10.     itoa(num3,ch3,10);//将整数转化为字符串  
  11.       
  12.     GetDlgItem(IDC_EDIT3)->SetWindowText(ch3);  


方法三:

[cpp]  view plain copy
  1. TCHAR ch1[8],ch2[8],ch3[9];  
  2.     GetDlgItemText(IDC_EDIT1,ch1,8);  
  3.     GetDlgItemText(IDC_EDIT2,ch2,8);  
  4.   
  5.     int num1=atoi(ch1);  
  6.     int num2=atoi(ch2);  
  7.     int num3=num1+num2;  
  8.   
  9.     itoa(num3,ch3,10);  
  10.   
  11.     SetDlgItemText(IDC_EDIT3,ch3);  


方法四:

数值关联:

 

[cpp]  view plain copy
  1.         UpdateData();//默认参数是TRUE,不直接调用DodataExchange函数  
  2. m_num3=m_num1+m_num2;  
  3. UpdateData(FALSE);  


方法五:

控制关联:

 

[cpp]  view plain copy
  1. TCHAR ch1[9],ch2[9],ch3[9];  
  2. int num1,num2,num3;  
  3. m_edit1.GetWindowText(ch1,9);  
  4. m_edit2.GetWindowText(ch2,9);  
  5.   
  6. num1=atoi(ch1);  
  7. num2=atoi(ch2);  
  8.   
  9. num3=num1+num2;  
  10.   
  11. itoa(num3,ch3,10);  
  12.   
  13. m_edit3.SetWindowText(ch3);  


方法六:

[cpp]  view plain copy
  1. int num1=GetDlgItemInt(IDC_EDIT1);  
  2.     int num2=GetDlgItemInt(IDC_EDIT2);  
  3.     int num3=num1+num2;  
  4.   
  5.     SetDlgItemInt(IDC_EDIT3,num3);  


方法七:

[cpp]  view plain copy
  1. /*TCHAR ch1[10],ch2[10],ch3[10]; 
  2.     ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1); 
  3.     ::SendMessage(GetDlgItem(IDC_EDIT2)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch2); 
  4.  
  5.     int num1=atoi(ch1); 
  6.     int num2=atoi(ch2); 
  7.     int num3=num1+num2; 
  8.  
  9.     itoa(num3,ch3,10); 
  10.  
  11.     ::SendMessage(GetDlgItem(IDC_EDIT3)->m_hWnd,WM_SETTEXT,0,(LPARAM)ch3);*/  
  12.   
  13.   
  14.     /*TCHAR ch1[10],ch2[10],ch3[10]; 
  15.     GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1); 
  16.     GetDlgItem(IDC_EDIT2)->SendMessage(WM_GETTEXT,10,(LPARAM)ch2); 
  17.  
  18.     int num1=atoi(ch1); 
  19.     int num2=atoi(ch2); 
  20.     int num3=num1+num2; 
  21.      
  22.     itoa(num3,ch3,10); 
  23.  
  24.     SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3); 
  25.     SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,2); 
  26.     GetDlgItem(IDC_EDIT3)->SetFocus();*/  
  27.   
  28.       
  29.     TCHAR ch1[10],ch2[10],ch3[10];  
  30.     SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);  
  31.     SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)ch2);  
  32.   
  33.     int num1=atoi(ch1);  
  34.     int num2=atoi(ch2);  
  35.     int num3=num1+num2;  
  36.       
  37.     itoa(num3,ch3,10);  
  38.   
  39.     SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3);  
  40.     SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,2);  
  41.     GetDlgItem(IDC_EDIT3)->SetFocus();  


 

伸缩效果:

拉入一个picture:

 

[cpp]  view plain copy
  1. void CTestDialog::OnShensuo()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     CString cst;  
  5.     if(GetDlgItemText(ID_SHENSUO,cst),cst=="缩小<<")  
  6.     {  
  7.         SetDlgItemText(ID_SHENSUO,"扩展>>");  
  8.     }  
  9.     else  
  10.     {  
  11.         SetDlgItemText(ID_SHENSUO,"缩小<<");  
  12.     }  
  13.   
  14.     static CRect crectLarge,crectSmall;  
  15.       
  16.     if(crectLarge.IsRectNull())  
  17.     {  
  18.         GetWindowRect(&crectLarge);  
  19.         CRect ctemp;  
  20.           
  21.         GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&ctemp);  
  22.   
  23.         crectSmall.left=crectLarge.left;  
  24.         crectSmall.top=crectLarge.top;  
  25.         crectSmall.right=crectLarge.right;  
  26.         crectSmall.bottom=ctemp.bottom;  
  27.   
  28.     }  
  29.   
  30.     if(cst=="缩小<<")  
  31.     {  
  32.         SetWindowPos(NULL,0,0,crectSmall.Width(),crectSmall.Height(),SWP_NOZORDER|SWP_NOMOVE);  
  33.     }  
  34.     else  
  35.     {  
  36.           
  37.         SetWindowPos(NULL,0,0,crectLarge.Width(),crectLarge.Height(),SWP_NOZORDER|SWP_NOMOVE);  
  38.     }  
  39.   
  40. }  


 回车响应SetFocus()只能一次 multiline

 

[cpp]  view plain copy
  1. WNDPROC prevProc;  
  2. LRESULT CALLBACK DialogProc(  
  3.                             HWND hwnd,      // handle to window  
  4.                             UINT uMsg,      // message identifier  
  5.                             WPARAM wParam,  // first message parameter  
  6.                             LPARAM lParam   // second message parameter  
  7.                             )  
  8. {  
  9.     if(uMsg==WM_CHAR && wParam==0x0d)  
  10.     {  
  11.         //::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));  
  12.         //::SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));  
  13.         ::SetFocus(::GetNextDlgTabItem(GetParent(hwnd),hwnd,FALSE));  
  14.         return 1;  
  15.     }  
  16.     else  
  17.     {  
  18.         return prevProc(hwnd,uMsg,wParam,lParam);  
  19.     }  
  20. }  
  21.   
  22.   
  23. BOOL CTestDialog::OnInitDialog()   
  24. {  
  25.     CDialog::OnInitDialog();  
  26.       
  27.   
  28.     // TODO: Add extra initialization here  
  29.     prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)DialogProc);  
  30.       
  31.       
  32.     return TRUE;  // return TRUE unless you set the focus to a control  
  33.                   // EXCEPTION: OCX Property Pages should return FALSE  
  34. }  


 

[cpp]  view plain copy
  1. void CTestDlg::OnOK()   
  2. {  
  3.     // TODO: Add extra validation here  
  4.     //GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus();  
  5.     //GetFocus()->GetNextWindow()->SetFocus();  
  6.     //GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();  
  7.     GetNextDlgTabItem(GetFocus())->SetFocus();  
  8. //  CDialog::OnOK();  
  9. }  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该书共分成15个章节,由易到难,由浅及深的介绍了MFC的功能框架和实际运用。每个知识点都有对应的代码实例。学习起来快速而不费力。更重要的是不是扫描版本。看着舒服。 目录结构如下: 目 录 译者序 前言 第一部分 基础知识 第1章 窗口 2 1.1 窗口和API环境 2 1.1.1 三种类型窗口 2 1.1.2 客户区和非客户区 3 1.2 窗口和MFC环境 4 1.3 怎样应用MFC创建一个窗口 5 1.4 怎样使用MFC销毁一个窗口 9 1.4.1 捆绑到一个已有的窗口 9 1.4.2 窗口类 10 1.4.3 窗口进程 10 1.5 怎样使用MFC创建一个窗口类 11 1.5.1 使用AfxRegisterWndClass () 函数注册一个窗口类 11 1.5.2 使用AfxRegisterClass ()函数 创建一个窗口类 12 1.6 怎样销毁一个MFC窗口类 14 1.7 厂商安装的窗口类 14 1.8 其他类型窗口 15 1.9 桌面窗口 16 1.10 小结 16 第2章 类 18 2.1 基类 18 2.1.1 CObject 18 2.1.2 CCmdTarget 19 2.1.3 CWnd 19 2.2 应用程序、框架、文档和视图类 19 2.2.1 CWinApp(O/C/W) 20 2.2.2 CView (O/C/W) 21 2.3 其他用户界面类 22 2.3.1 通用控件类 23 2.3.2 菜单类 23 2.3.3 对话框类 24 2.3.4 控制条类 24 2.3.5 属性类 25 2.4 绘图类 25 2.4.1 设备环境类 25 2.4.2 图形对象类 25 2.5 文件类 26 2.6 数据库类 26 2.6.1 ODBC类 26 2.6.2 DAO类 27 2.7 数据集类 27 2.8 其他数据类 27 2.9 通信类 28 2.10 其他类 29 2.11 小结 31 第3章 消息处理 32 3.1 发送或寄送一个消息 32 3.1.1 发送一个消息 32 3.1.2 寄送一个消息 32 3.1.3 发送一个消息与寄送一个消息 的比较 32 3.2 怎样使用MFC发送一个消息 33 3.3 怎样用MFC寄送一个消息 33 3.4 三种类型的消息 34 3.4.1 窗口消息 34 3.4.2 命令消息 34 3.4.3 控件通知 34 3.5 MFC怎样接收一个寄送的消息 36 3.6 MFC怎样处理一个接收到的消息 36 3.7 处理用户界面的对象 44 3.8 创建自定义窗口消息 45 3.8.1 静态分配的窗口消息 45 3.8.2 动态分配的窗口消息 46 3.9 重定向消息 47 3.9.1 子分类和超分类 47 3.9.2 用MFC子分类窗口 48 3.9.3 重载OnCmdMsg ( ) 49 3.9.4 使用SetWindowsHookEx ( ) 49 3.9.5 使用SetCapture ( ) 49 3.9.6 专有的消息泵 50 3.10 小结 50 第4章 绘图 51 4.1 设备环境 51 4.2 在MFC环境中创建一个设备环境 52 4.2.1 屏幕 52 4.2.2 打印机 53 4.2.3 内存 54 4.2.4 信息 54 4.3 绘图例程 55 4.3.1 画点 55 4.3.2 画线 55 4.3.3 画形状 55 4.3.4 形状填充和翻转 55 4.3.5 滚动 56 4.3.6 绘制文本 56 4.3.7 绘制位图和图标 56 4.4 绘图属性 56 4.4.1 设备环境属性 57 4.4.2 画线属性 58 4.4.3 形状填充属性 58 4.4.4 文本绘制属性 58 4.4.5 映像模式 59 4.4.6 调色板属性 62 4.4.7 混合属性 62 4.4.8 剪裁属性 63 4.4.9 位图绘制属性 64 4.5 元文件和路径 65 4.5.1 元文件 65 4.5.2 路径 66 4.6 颜色和调色板 66 4.6.1 抖动色 67 4.6.2 未经抖动色 67 4.6.3 系统调色板 67 4.6.4 使用系统调色板 68 4.6.5 动画色 71 4.7 控制什么时候在哪里绘图 71 4.7.1 处理WM_PAINT 71 4.7.2 只绘制被无效化的区域 72 4.7.3 处理WM_DRAWITEM 72 4.7.4 在其他时间绘图 73 4.8 小结 74 第二部分 用户界面实例 第5章 应用程序与环境 76 5.1 例1 规划MFC应用程序 76 5.2 例2 用AppWizard创建一个MFC 应用程序 79 5.3 例3 用ClassWizard创建一个类 83 5.4 例4 初始化应用程序屏幕 84 5.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值