C++ MFC各控件代码练习例子
MFC应用程序编写实例—完整版(原创)
MFC应⽤程序编写实例—完整版(原创)前段时间,将近花了⼀周⾄两周上班和上班后的闲余时间,做了⼀个⽤于调试和测试⼯作项⽬的应⽤软件,下⾯将实现软件的重要步骤及主要功能讲解⼀遍,⽅便⽇后查阅。
程序开始后,提⽰登录框,输⼊⽤户名,密码后,登录进去主窗体,效果图如下:下⾯将主要实现的功能函数要点进⾏描述,具体实现如下:⼀、设置主窗体⼤⼩1、进⼊⼯程窗体初始化函数,OnInitDialog()中,在CDialog::OnInitDialog() 下⾯添加函数语句如下:SetWindowPos(NULL,0,0,600,400,SWP_NOMOVE); ////设置主窗体⼤⼩,长为600,⾼为400⼆、为主窗体添加背景图⽚:1、⾸先,在⼯程头⽂件中,声明画刷变量如:CBrush m_brBk;2、在⼯程OnInitDialog()中,添加如下代码:CBitmap bmp1;bmp1.LoadBitmap(IDB_BITMAP1);m_brBk.CreatePatternBrush(&bmp1);3、添加消息函数OnCtlColor,代码如下所⽰:HBRUSH CDebugDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// if (pWnd == this)//// {//// return m_brBk;//// }return(HBRUSH) m_brBk;}三、调⽤模态对话框和⾮模态对话框(以菜单⼊⼝为例)如菜单所属的主窗体类名为CDebugDlg,调⽤对话框的类名为CPing实现调⽤⾮模态对话框⽅法:选择调⽤菜单⼊⼝后,点击添加消息处理函数,在函数体内添中如下代码:CPing *dlg = new CPing();dlg->Create(IDD_DIALOG_PING); //创建⼀个⾮模态对话框dlg->ShowWindow(SW_SHOW); //显⽰⾮模态对话框 实现调⽤模态对话框⽅法:Cping dlg;dlg.DoModal();四、调⽤外部应⽤程序⽅法:1、调⽤外部应⽤程序可采⽤WinExec函数例如,调⽤⼀个Tcpview.exe外部程序,可在消息处理函数中添加如下代码:WinExec(".\\dll\\TCPview\\Tcpview.exe",SW_SHOW); // 其中.代表当前路径,此时需要⽤到\\来区分路径。
MFC编程示例参考
1、变更控件变量
设置编辑框内 容的长度
49
头文件中的生成代码
// Dialog Data //{{AFX_DATA(CStep1Dlg) enum { IDD = IDD_STEP1_DIALOG }; CString m_edit; //}}AFX_DATA
50
构造函数中的生成代码
CStep1Dlg::CStep1Dlg(CWnd* pParent /*=NULL*/) : CDialog(CStep1Dlg::IDD, pParent) { //{{AFX_DATA_INIT(CStep1Dlg) m_edit = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
}
43
运行
有文字,变灰
44
3、编辑框的控制
对话框数据交换机制 DDX(Dialog Data exchange),用于控 件初始化和获取用户输入的数据。 对话框数据验证DDV(Dialog data validation),用于对话框中输入数据的合 法性检验。
用户只关心编辑框的内容,不 关心编辑框的属性,可以使用内容 相关变量操作编辑框。
所有和控件映射的变 量均在此
41
数据交换函数中的生成代码
系统自动添加代码如下
void CStep1Dlg::DoDataExchange(CDataExchange* 映射变量 pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CStep1Dlg) DDX_Control(pDX, IDC_EDIT1, m_edit); 控件ID //}}AFX_DATA_MAP }
VC++MFC编程3
return (int)sqrt(dx*dx+dy*dy); } 第八步:编译运行程序员 函数原型: public: void DrawCircle(CDC* pDC, CPoint cenp, CPoint ardp); int ComputeRadius(CPoint cenp,CPoint ardp); 具体操作方法:用鼠标右键单击视图类, 选择“ 选择“Add Member Function…”,如下图所 Function…”,如下图所 示。分别添加上述两个成员函数,分别用 于画圆和计算圆的半径。
第一步:建立MouseSpring工程文件; 第一步:建立MouseSpring工程文件; 第二步:向视图类中添加自定义的成员变量 用鼠标右键单击视图类,选择“ 用鼠标右键单击视图类,选择“Add Member Variable…”, Variable…”,添加下面三个成员变量。 proctected : CPoint m_bO; // 圆心 CPoint m_bR; //圆上的点 //圆上的点 int m_ist; //圆心与圆周上点的区别,m_ist=0, //圆心与圆周上点的区别,m_ist=0, 表示鼠标左击点为圆心, //m_ist=1,表示鼠标左击点为圆周上的 //m_ist=1,表示鼠标左击点为圆周上的 点 操作方法如下图所示,分别添加上述三个成员变量。
第五步:在视图类的OnDraw()函数中加入下列代码,实 第五步:在视图类的OnDraw()函数中加入下列代码,实 现视图绘图。 void CMouseSpringView::OnDraw(CDC* pDC) { CMouseSpringDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDCpDC->SelectStockObject(NULL_BRUSH);//选择预定义对象 DrawCircle(pDC,m_bO,m_bR); //调用自定义的成员函数画圆 //调用自定义的成员函数画圆 }
mfc编程cstringlist实例
mfc编程cstringlist实例MFC编程中的CStringList实例在MFC(Microsoft Foundation Classes)编程中,CStringList是一个非常有用的类,用于管理字符串的链表。
它提供了许多方便的功能,使得操作字符串链表变得更加简单和高效。
在本文中,我们将逐步回答关于CStringList的问题,并给出一些实例代码来帮助读者更好地理解和使用这个类。
问题1:什么是CStringList?CStringList是MFC框架中的一个类,它是一个模板类,用于处理字符串的链表。
它使用的是C++的模板机制,可以在链表中存储任意类型的数据。
但在这里,我们主要关注它在处理字符串方面的应用。
问题2:如何创建一个CStringList对象?要创建一个CStringList对象,只需简单地声明一个新的实例即可:CStringList strList;这将创建一个名为strList的CStringList对象。
您可以根据需要创建多个实例,并在程序的任何地方使用它们。
问题3:如何向CStringList中添加字符串?要向CStringList中添加字符串,可以使用AddHead()或AddTail()成员函数。
AddHead()函数将字符串添加到链表的头部,而AddTail()函数则将字符串添加到链表的尾部。
下面是一些示例代码:CStringList strList;strList.AddHead("Hello");strList.AddTail("World");这将创建一个名为strList的CStringList对象,并向其头部添加字符串"Hello",在其尾部添加字符串"World"。
问题4:如何遍历并访问CStringList中的字符串?要遍历并访问CStringList中的字符串,可以使用CstringList的一个迭代器。
VC中MFC应用的若干个小例子2
int Str2Hex(CString str, UINT32* data)实现的功能是将str(16进制)->数字。
比如11转换成17。
21转换成33。
Visual C++通用范例开发金典\Visual C++通用范例开发金典ch011. IDC_STATIC1:void CCStatic2Dlg::OnStatic1(){// TODO: Add your control notification handler code hereCString str;GetDlgItem(IDC_STATIC1)->GetWindowText(str);if("Hello,World!"==str){GetDlgItem(IDC_STATIC1)->SetWindowText("Visual C++!");}if("Visual C++!"==str){GetDlgItem(IDC_STATIC1)->SetWindowText("I like C++");}if("I like C++"==str){GetDlgItem(IDC_STATIC1)->SetWindowText("Hello,World!");}}2.BOOL CRadio_Button1Dlg::OnInitDialog()中的代码:CheckRadioButton(IDC_RADIO1,IDC_RADIO3,IDC_RADIO1);3.BOOL CButton3Dlg::OnInitDialog()中的代码:CheckRadioButton(IDC_RADIO1,IDC_RADIO3,IDC_RADIO3);CButton *ptn=(CButton *)GetDlgItem(IDC_CHECK1);ptn->SetCheck(1);在void CButton3Dlg::OnOK(){// TODO: Add extra validation hereCString str,strCtrl;int i;str="您的年级:";UINT nID1=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3);GetDlgItemText(nID1,strCtrl);str=str+strCtrl;str=str+"\n你最喜欢的课程:";UINT nID2[4]={IDC_CHECK1,IDC_CHECK2,IDC_CHECK3,IDC_CHECK4};CButton *ptn;for(i=0;i<4;i++){ptn=(CButton *)GetDlgItem(nID2[i]);if(1==ptn->GetCheck()){ptn->GetWindowText(strCtrl);str=str+strCtrl;str=str+" ";}}MessageBox(str);// CDialog::OnOK();}4.void CCstatic1Dlg::OnOK(){if (static1.m_hWnd){static1.DestroyWindow();}else{static1.Create("生成的新的静态文本框",WS_CHILD|WS_VISIBLE,CRect(0,0,200,30),this,11);}// CDialog::OnOK();}5.void CCShrinkView::OnShrink(){// TODO: Add your command handler code hereCShrink_Dlg* pt1=new CShrink_Dlg;pt1->DoModal();}void CShrink_Dlg::OnButton1(){// TODO: Add your control notification handler code hereCString str;GetDlgItemText(IDC_BUTTON1,str);if("收缩<<"==str)SetDlgItemText(IDC_BUTTON1,"扩展>>");elseSetDlgItemText(IDC_BUTTON1,"收缩<<");static CRect rectLarge;static CRect rectSmall;if(rectLarge.IsRectNull()){CRect temp;GetWindowRect(&rectLarge);GetDlgItem(IDC_SHRINK)->GetWindowRect(&temp);rectSmall.left=rectLarge.left;rectSmall.top=rectLarge.top;rectSmall.right=rectLarge.right;rectSmall.bottom=temp.top;}if(str=="收缩<<"){SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE|SWP_NO ZORDER);}else{SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),SWP_NOMOVE|SWP_NO ZORDER);}}6.BOOL CCEdit_6Dlg::OnInitDialog()中的:CTime time;time=CTime::GetCurrentTime();m_time=time.Format("%x--%X");UpdateData(FALSE);void CCEdit_6Dlg::OnTimer(UINT nIDEvent){CTime time;time=CTime::GetCurrentTime();m_time=time.Format("%Y-%m-%d %H:%M:%S");UpdateData(FALSE);CDialog::OnTimer(nIDEvent);}7.只有一个例子,其它的仿照void CCEdit4Dlg::OnGreenRadio3(){colour = RGB(0,255,0);m_edit.SetFocus();}8.class CColorEdit : public CEdit自己新创了一个类HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor){// TODO: Change any attributes of the DC hereCDC* dc = GetDC(); //获取画布对象CRect rect;GetClientRect(rect); //获取客户区域rect.InflateRect(3,3,3,3);//将客户区域增大3个像素CBrush brush (m_color);//创建画刷dc->FrameRect(rect,&brush);//绘制边框// TODO: Return a non-NULL brush if the parent's handler should not be called return NULL;}void CColorEdit::SetColorEdit(COLORREF color){m_color=color;}//m_color是CColorEdit的一个成员函数BOOL CCEdit_5Dlg::OnInitDialog()中的m_edit1.SetColorEdit(RGB(255,0,0));m_edit2.SetColorEdit(RGB(0,0,255));9.void CCEdit_1Dlg::OnButton1(){// TODO: Add your control notification handler code hereCString str;UpdateData(TRUE);if((strcmp(m_name,"张三")==0)&&(strcmp(m_password,"1113")==0)) str="密码正确,登陆成功!";else if((strcmp(m_name,"")==0)||(strcmp(m_password,"")==0)) str="请输入用户名或密码:";elsestr="用户名或密码错误:";MessageBox(str);}10.void CCEdit_2Dlg::OnChangeEdit1(){UpdateData(TRUE);// m_write="d\nyyy";m_read=m_write;UpdateData(FALSE);}11.CSpinButtonCtrl m_spinage;BOOL CSpinButtonDlg::OnInitDialog()中的:m_spinage.SetRange(1,100);m_spinage.SetBase( 0 );void CSpinButtonDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) {NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;// TODO: Add your control notification handler code hereUpdateData(TRUE);m_age=m_age+(float)pNMUpDown->iDelta;if(m_age<0) m_age=0;if(m_age>10) m_age=10;UpdateData(FALSE);*pResult = 0;}void CSpinButtonDlg::OnOK(){// TODO: Add extra validation hereUpdateData(TRUE);CString str;char *temp=new char;itoa(m_age,temp,10);str="结果显示:\n姓名:";str+=m_name;str+="\n年龄:";str+=temp;str+="\n年级:";str+=m_class;str+="\n电话:";str+=m_phone;MessageBox(str);//CDialog::OnOK(); }。
MFC学习小范例(按钮控件的使用)
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,通力根1保过据护管生高线产中敷工资设艺料技高试术中卷0资不配料仅置试可技卷以术要解是求决指,吊机对顶组电层在气配进设置行备不继进规电行范保空高护载中高与资中带料资负试料荷卷试下问卷高题总中2体2资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况1卷中下安,与全要过,加度并强工且看作尽护下可1都关能可于地以管缩正路小常高故工中障作资高;料中对试资于卷料继连试电接卷保管破护口坏进处范行理围整高,核中或对资者定料对值试某,卷些审弯异核扁常与度高校固中对定资图盒料纸位试,置卷编.工保写况护复进层杂行防设自腐备动跨与处接装理地置,线高尤弯中其曲资要半料避径试免标卷错高调误等试高,方中要案资求,料技编试术写5、卷交重电保底要气护。设设装管备备置线4高、调动敷中电试作设资气高,技料课中并3术试、件资且中卷管中料拒包试路调试绝含验敷试卷动线方设技作槽案技术,、以术来管及避架系免等统不多启必项动要方高式案中,;资为对料解整试决套卷高启突中动然语过停文程机电中。气高因课中此件资,中料电管试力壁卷高薄电中、气资接设料口备试不进卷严行保等调护问试装题工置,作调合并试理且技利进术用行,管过要线关求敷运电设行力技高保术中护。资装线料置缆试做敷卷到设技准原术确则指灵:导活在。。分对பைடு நூலகம்线于于盒调差处试动,过保当程护不中装同高置电中高压资中回料资路试料交卷试叉技卷时术调,问试应题技采,术用作是金为指属调发隔试电板人机进员一行,变隔需压开要器处在组理事在;前发同掌生一握内线图部槽 纸故内资障,料时强、,电设需回备要路制进须造行同厂外时家部切出电断具源习高高题中中电资资源料料,试试线卷卷缆试切敷验除设报从完告而毕与采,相用要关高进技中行术资检资料查料试和,卷检并主测且要处了保理解护。现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
VC MFC 编程实例17
宏 ON_MESSAGE(WM_XXX,Handler) 例如: O N _ M E S S A G E ( W M _ C R E AT E , M y Handler) ON_MESSAGE(WM_PAINT,MyHan dler) ON_WM_XXX 例如: ON_WM_CREATE() ON_WM_DESTROY() 可每一个标准窗口消息都有属于它 自己的宏,它没有参数,并且它的 名字和使用基于它的 WM_XXX设计 OnXxx(message specific)(因为参数是 特定的消息,最好让 Class Wi z a r d添 加这些宏到消息映像中 ) 说 明 消息处理函数调用参数 可 L R E S U LT Handler (WP A R A M wParam,LPARAM lParam) 可
本文由sdhexu贡献
pdf文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。
下载
附录B 消息,控件通知和消息映像宏
B.1 一些通用窗口消息
WM命令 WM_CREATE 描 述 参数说明 发lParam指向CREATESTRUCT,它包含 C r e a t e Window ( ) 参数;初始化成功时 应返回0 WM_INITDIALOG 发发送此消息,告诉对话框初始化自己; 在WM_CREATE消息之后以及在所有对 话框中的控件被创建后发送 WM_GETMINMAXINFO WM_SIZE 发发送此消息,告诉窗口即将被重调到窗 口必须保持的最大或最小尺寸 发发送此消息,告诉一个窗口已被重调大小 发wParam是接收初始焦点的控件窗口的 句柄,lParam是被CreateDialogParam ( ) 传递的可选参数 发lParam指向一个MINMAXINFO结构, 它允许窗口设置它的最小和最大尺寸 发wParam是一个标志,用以区分窗口被 最大化,最小化还是只是被重调大小. lParam告诉新窗口的大小 WM_PAINT WM_DESTROY WM_NCCREATE WM_NCDESTROY WM_NCPAINT WM_ERASEBKGND WM_SHOWWINDOW WM_ENABLE WM_INITMENUPOPUP 发发送此消息,告诉窗口绘制它的客户区 发发送此消息,告诉一个窗口重新分配全 局堆上的任何内容 发发送此消息,告诉一个窗口正初始化非 客户区 发发送此消息,告诉一个窗口非客户区已 被销毁 发发送此消息,告诉一个窗口绘制它的非 客户区 发发送此消息,告诉一个窗口擦除背景 发发送此消息,告诉窗口显示或隐藏自己 发发送此消息,告诉一个窗口启用或禁用 自己 发发送此消息,告诉窗口它的系统菜单或 主菜单将被打开 WM_HELP 发发送此消息, 告诉一个窗口F1键已被按下 发wParam拥有菜单对象的句柄,lParam的 低位字表示子菜单位置,如果 lParam的 高位字非0,则系统菜单将打开 发lParam包含一个HELPINFO结构的指针, 结构包含处理上下文相关的帮助所需要 的信息 WM_MOUSEMOVE 发当鼠标移到它的客户区时被寄送到一个 窗口 WM_LBUTTONDOWN WM_LBUTTONUP 发鼠标的左键在客户区被按下时,被寄送 到该窗口 发当鼠标左键在窗口的客户区被松开时, 被寄送到该窗口 发与WM_MOUSEMOVE相同 发wParam指示是否有键盘的Shift-Ctrl-Alt 键被按下, l P a r a m指示相对于客户区的 新的鼠标光标位置 发与WM_MOUSEMOVE相同 发w P a r a m拥有绘制区域的句柄,区域 在第4章中描述 发wParam指定进行擦除的设备环境(一个 绘制的和被填充的矩形 ) 发如果wParam非0,则窗口被显示 发如果wParam非0,则窗口已被启用 发l P a r a m指向 W M _ C R E AT E使用的相 同的CREATESTRUCT结构 发wParam和lParam未被使用 发wParam是进行绘制的设备环境 发wParam和lParam未被使用
MFC实例
MFC实例教程何礼富(安徽理工大学)实例1 最简单的对话框程序实例2 鼠标测试程序实例3 点鼠标游戏实例4 为程序添加图标1.新建一个MFC AppWizard(exe)工程,工程名为IconTest2.在MFC AppWizard的Step 1步骤,选择“Dialog based”,其余的步骤全部选择默认。
3.切换到ResourceView视图,右键点击Icon,选择“import”,导入三个图标(.ico)文件,如下图:4.找到CIconTestDlg类的构造函数,找到下面的语句:m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);将其修改为:m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);5.运行程序,可以看到程序的图标已被修改成我们自己定义的图标。
6.继续回到Resource View视图,打开IDD_ICONTEST_DIALOG的设计界面,删除之前生成的文字框和按钮,重新添加一个文字框和一个按钮,如下图:7.将按钮控件的Style中的Icon选项选中8.找到CIconTestDlg类的OnInitDialog()函数,在其中添加下图中的语句:9.执行程序,图标就被显示在界面上了。
实例5 三国游戏之选择武将1.建立一个基于MFC对话框的项目“ComposedDialog”。
2.切换到Resource View视图,在左边的资源树上点右键,选择“insert”,弹出“Insert Resource”对话框,选择“Bitmap”,点“import”,导入事先准备好的位图文件。
3.设计界面:4.右键点性别组合框,选择“property”,添加以下数据:5.打开Class Wizard,添加以下变量:。
mfc学习小范例(按钮控件的利用)
咱们通常知道按钮控件是分两种的,一种是多选按钮(即复选按钮),另一种是单选按钮,要实现这些并非难,你只需要知道相应控件的利用规则和C++的基础即可。
请看实现程序的截图年龄选项固然是单选的,是圆形按钮,而爱好可以有多个,所以是复选按钮,在MFC中的控件格式是方块,此程序实现的功能是选择相应的年龄和爱好后点击肯定按钮即可出现所选选项,如图所示:我选择的年龄是15到30岁之间,爱好是聊天交友和查阅资料,此时我点击肯定按钮后出现如下图示:实现源代码如下:按钮空间的利用.cpppp : 概念应用程序的类行为。
"#include "按钮控件的利用"#ifdef _DEBUG#define new DEBUG_NEW#endif"#include "按钮控件的利用"#ifdef _DEBUG#define new DEBUG_NEW#endif.”菜单项添加到系统菜单中。
pppp : 概念应用程序的类行为。
"#include "吹泡泡"#ifdef _DEBUG#define new DEBUG_NEW#endif"#include "吹泡泡"#ifdef _DEBUG#define new DEBUG_NEW#endifCRect m_rectBubble[MAX_BUBBLE]; COLORREF m_colorBubble[MAX_BUBBLE]; int m_nBubbleCount;CRect m_rectClient;COLORREF m_colorCurrent;.”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必需在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) ==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL){CString strAboutMenu;(IDS_ABOUTBOX);if (!()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。
MFC编程例子
例程1. MFChello步骤1.选择新建-项目,打开后出现如果1所示对话框。
选择VC++中的智能设备,在右边选择MFC 智能设备应用程序。
在下方的名称中输入MFChello,点击确定。
步骤2.步骤3.步骤4.步骤5.步骤6在BOOL CMFChelloApp::InitInstance()添加如下代码AfxEnableControlContainer(); //调用此函数的目的是为了使程序支持包含OLE控件MessageBox(NULL,_T("一个简单的MFC程序"),_T("你好"),MB_OK); //谈出对话框例程2.鼠标测试程序同例程1一样,建立一个基于对话框的MouseTest程序。
在右边的对话框编辑器中选择Static Text,添加到对话框中一个静态文本,然后更改右下角的静态文本的属性,Caption改为提示:点一下鼠标右键或左键,ID改为IDC_STATIC点击对话框,在右下角点击消息按钮,出现下图。
找到WM_LBUTTONDOWN消息,添加OnLButtonDown函数。
在函数中添加代码如下MessageBox(NULL,_T("你点的是左键"),_T("The first Dialog"),MB_OK);同样操作在WM_RBUTTONDOWN消息,添加OnRButtonDown函数。
在函数中添加代码如下MessageBox(NULL,_T("你点的是右键"),_T("The first Dialog"),MB_OK);进行仿真即可。
例程3.添加图标创建一个基于对话框的IconTest程序。
切换到资源视图。
右键点击Icon,选择添加资源,弹出下图。
选择导入,导入一个图标文件(.ico)文件,如下图。
点击CIconTestDlg类,找到CIconTestDlg函数。
VC++MFC编程实例
第10章 Visual C++编程实例
另外,也可以选择应用程序静态链接到MFC。静 态链接意味着,应用程序不依赖于MFC库文件的存在 (但仍然可能需要Msvcrt.dll文件)。静态链接的代价是 可执行文件更大,而且MFC内存的利用可能不够充分。
在菜单中选择“工程”中的“设置”对话框,在 对 话 框 右 方 的 “ General” 选 项 卡 中 通 过 组 合 框 “Microsoft Foundation Classes”选择使用MFC类库的方 法。可选项有三种,分别为“Not Using MFC(不使用 MFC)","Use MFC in a Shared DLL(以动态链接库方式使 用MFC)”和“Use MFC in a Static Library(以静态库方 式使用MFC)”。
penNew.CreatePen(PS_SOLID,1,RGB(255,0,0)); dc.SelectObject(&brushNew); dc.SelectObject(&penNew);
第10章 Visual C++编程实例
for(int i=0;i<m_nBubbleCount;i++) dc.Ellipse(m_rectBubble[i]);
MFC编程入门之二十三(常用控件:按钮控件的编程实例)
MFC编程⼊门之⼆⼗三(常⽤控件:按钮控件的编程实例) 上⼀节讲了按钮控件Button、Radio Button和Check Box的基本⽤法,本节继续讲按钮控件的内容,通过⼀个实例让⼤家更清楚按钮控件在实际的软件开发中如何使⽤。
因为Button控件在前⾯的例⼦中涉及到了,⽐较简单,本⽂就不作深⼊分析了,⽽是重点讲解单选按钮Radio Button、复选框Check Box的使⽤。
按钮控件实例的功能 ⾸先介绍此实例实现的功能。
此实例⽤来根据⽹站类型选择⽹站,并将选择的⽹站的名称显⽰到编辑框中。
⽹站类型有“门户”、“论坛”和“博客”三种,为单选按钮。
⽹站有六个:博客园、新浪、天涯论坛、韩寒博客、⽹易和凤凰⽹论坛,均为复选框。
当选中某种⽹站类型即点了某个单选按钮时,其对应的⽹站的复选框就激活,其他则禁⽤,不允许选择,且为⾮选中状态。
例如,如果选中了“门户”单选按钮,则“新浪”、“⽹易”复选框激活,允许⽤户选择,⽽其他复选框则禁⽤。
按钮控件实例的实现 下⾯为⼤家详细阐述此实例的编写步骤。
1、创建⼀个基于对话框的MFC⼯程,名称设为“MFCButtonDemo”。
2、在⾃动⽣成的主对话框IDD_MFCBUTTONDEMO_DIALOG的模板中,删除"TODO:Place dialog controls here".静态⽂本框,添加两个Group Box,属性Caption分别改为“⽹站类型”、“⽹站”。
3、在Group Box“⽹站类型”中加⼊三个Radio Button,Caption分别设为“门户”、“论坛”和“博客”,ID分别设为IDC_PORTAL_RADIO、IDC_FORUM_RADIO和IDC_BLOG_RADIO。
4、在Group Box“⽹站”中加⼊六个Check Box,Caption分别设为“博客园”、“新浪”、“天涯论坛”、“韩寒博客”、“⽹易”和“凤凰⽹论坛”,ID 分别设置为IDC_CHECK1、IDC_CHECK2、IDC_CHECK3、IDC_CHECK4、IDC_CHECK5和IDC_CHECK6。
MFC编程入门之二十四(常用控件:列表框控件ListBox)
MFC编程⼊门之⼆⼗四(常⽤控件:列表框控件ListBox) 前⾯两节讲了⽐较常⽤的按钮控件,并通过按钮控件实例说明了具体⽤法。
本⽂要讲的是列表框控件(ListBox)及其使⽤实例。
列表框控件简介 列表框给出了⼀个选项清单,允许⽤户从中进⾏单项或多项选择,被选中的项会⾼亮显⽰。
列表框可分为单选列表框和多选列表框,顾名思义,单选列表框中⼀次只能选择⼀个列表项,⽽多选列表框可以同时选择多个列表项。
列表框也会向⽗窗⼝发送通知消息。
这些通知消息含义如下: LBN_DBLCLK:⽤户⽤⿏标双击了⼀列表项,只有具有LBS_NOTIFY的列表才能发送该消息。
LBN_ERRSPACE:列表框不能申请⾜够的动态内存来满⾜需要。
LBN_KILLFOCUS:列表框失去焦点。
LBN_SELCANCEL:当前的选择被取消,只有具有LBS_NOTIFY的列表框才能发送该消息。
LBN_SETFOCUS:列表框获得输⼊焦点。
WM_CHARTOITEM:当列表框收到WM_CHAR消息后,向⽗窗⼝发送该消息,只有具有LBS_WANTKEYBOARDINPUT风格的列表框才会发送该消息。
WM_VKEYTOITEM:当列表框收到WM_KEYDOWN消息后,向⽗窗⼝发送该消息,只有具有LBS_WANTKEYBOARDINPUT风格的列表框才会发送该消息。
列表框控件的创建 MFC将列表框控件的所有操作都封装到了CListBox类中。
创建列表框控件时,可以在对话框模板中直接拖⼊列表框控件ListBox,然后添加控件变量使⽤。
但如果需要动态创建列表框,就要⽤到CListBox类的Create成员函数了。
Create成员函数的原型如下: virtual BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); 参数rect指定了列表框控件的位置和尺⼨,pParentWnd为⽗窗⼝的指针,nID⽤于指定列表框控件的ID。
VCMFC编程实例1
VCMFC编程实例1本文由sdhexu贡献pdf文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
下载第一部分基础知识用 V i s u a l C++ 和 M F C 创建的应用程序大多会自动生成窗口 , 并且可以处理消息 , 进行绘图. M i c r o s o f t 在这方面做了大量的工作 , 隐藏了内部工作 , 使我们能够更轻松地创建一个一般的应用程序.然而,当用户不能实现他们想要实现的功能时,适当地了解内部工作机制,对于消除编程上的困惑会有好处.更重要的是,知道怎样执行任务(诸如把窗口放置到什么地方,从什么地方获得一个消息和在任意地方绘图) ,有助于分清用户的应用程序和由Visual C++ 和 M F C 自动提供的限于窗口 , 消息和绘图的应用程序. Visual C++ 应用程序有四项主要基本知识:创建一个窗口,了解其他的M F C类,把消息发送到一个窗口和在一个窗口内绘图.当然还有其他一些基本知识,我们也将在涉及时适当地进行讨论.不过本部分将讨论以下四项基本知识.窗口在第1章中,我们首先讨论在使用和不使用MFC的情况下创建一个窗口,以便清楚地了解 M F C是如何工作的. M F C窗口既可以由属于 M F C的C + +类创建,也可以由一个早于并存在于 M F C之外的非C + +窗口类创建.我们将进一步观看窗口类并讨论那些由 Wi n d o w s操作系统提供的窗口类.最后,再看看 MFC应用程序中都有什么.类在第2章中,我们将全面地讨论M F C提供的强大的功能.大多数M F C类是从三个 M F C基类( C O b j e c t,C W n d和C C m d Ta rg e t )派生来的.并讨论构成一个应用程序的 M F C类,支持窗口界面的M F C 类,用来绘图的类,访问文件的类,维护数据和数据库的类和访问因特网 (Internet)的MFC类.消息处理在第3章中, 我们将讨论一个MFC应用程序是怎样通过消息与外界及应用程序进行通信的. 还将讨论四种消息类型,并跟踪一个消息通过接收消息的类.最后将探讨该路径上的重定向消息.绘图在第4章中,我们将讨论在窗口中绘图的方法,包括绘图工具,绘图用的颜色,在屏幕或打印机上绘图,绘制位图和图标,绘制矩形和圆,绘制动画.下载第1章窗口在本章中,我们将讨论M F C用户界面的基本要素:窗口.在此基础上比较 A P I 窗口和 M F C窗口的异同,描述如何创建一个窗口,销毁一个窗口和控制 Wi n d o w s操作系统与窗口的通信问题.1.1 窗口和API环境窗口是屏幕上的一个矩形区域,应用程序在该区域中显示数据并等待鼠标点击. Wi n d o w s应用系统的用户界面可以包含许多窗口,每个窗口都有不同的特点,但都是互相联系的,如图 1-1所示.窗口应用程序的主窗口窗口窗口窗口图1-1 Windows应用程序用户界面包括的窗口1.1.1 三种类型窗口在这么多窗口中,基本类型只有三种:重叠(Overlapped)窗口,弹出 (Popup)窗口和子窗口 ( C h i l d ).在它们之间并没有太多内在的差异,但是使用不同的窗口风格,它们的外观是不同的(见图1-2). 重叠窗口窗口. 弹出窗口通常以对话框和消息框的形式与用户对话. 子窗口通常用在视图(View)中,如在文本编辑器中的文本显示,也用在控件中,如在对话框中的OK按钮.而对那些看起来像按钮或控件的子窗口,也称为"控件"窗口. 重叠窗口和弹出窗口的主要区别是弹出窗口出现时可以没有标题 (也称为标题栏 ).子窗口与重叠窗口或弹出窗口的主要区别是子窗口只能出现在另一个窗口中,并且子窗口的任何多余部分都被该窗口移去或剪切掉.另外,子窗口是唯一不能有菜单条的窗口. 参见图1-3中的Windows 应用程序,其中包括重叠窗口,弹出窗口和子窗口. 通常用于建立应用程序主窗口.事实上,有时也叫做"主"窗口或者"框架"下载重叠窗口最基本的窗体第1章窗口3弹出窗口注意:在它的最基本的窗体中,系统不进行任何绘制. 窗口都是客户区子窗口注意:在它的最基本的窗体中,系统不进行任何绘制. 窗口都是客户区典型的外观注意:这都是客户区.子窗口通常自己进行绘制共同的设置注意:子窗口不能有子菜单图1-2 窗口风格可以用来区分三种不同类型的窗口不是一个窗口—显示在子窗口中, 并由子窗口绘制属于桌面的重叠窗口,也称为主窗口属于主窗口的弹出窗口属于主窗口的子窗口属于弹出窗口的子窗口,它位于弹出窗口之中图1-3 由重叠窗口,弹出窗口和子窗口组成的窗口应用程序1.1.2 客户区和非客户区每个窗口都有由系统绘制的"非客户区"和由应用程序绘制的"客户区" .系统可以绘制图1-4显示的其中一个或者全部特征,当然也可以把所有的特征留给你去绘制.任务栏应用程序图标最小化按钮最大化按钮菜单条关闭按钮垂直滚动条水平滚动条系统菜单(单击应用程序图标时,显示虚线框)客户区图1-4 窗口的非客户区可以由系统选择绘制每个窗口代表内存中的一个窗口对象,并由该窗口对象告诉 Wi n d o w s操作系统将窗口绘制在何处,以及在对鼠标单击,键盘按下(假设该窗口拥有输入焦点 )和时钟终止等事件作出响4图1-5).第一部分基础知识下载应时应调用什么应用程序.窗口对象自身是窗口类的一个实例,它不是Visual C++的类,而是存在于Visual C++之外,并早于Visual C++的Microsoft Windows所属的类.然而,就像C++的类一样,窗口类为每个基于它创建的窗口定义了若干特征,如背景色和往何处发送消息等(见窗口对象窗口类窗口①使用RegisterClass( ) 函数创建窗口类②窗口对象由CreateWindow( ) ③窗口管理器保持一个窗口对函数创建,作为它的变量传象列表,并告诉每个对象在输窗口类屏幕上绘制自己图1-5 Microsoft Windows所属的窗口类创建的窗口对象Wi n d o w s操作系统提供了一个扩展的应用程序接口 ( A P I ),可以用来创建和维护这些窗口对象.调用 C r e a t e Window( )函数可以创建一个窗口对象;调用 S e t WindowLong( )函数可以改变由窗口类定义的特征;调用MoveWindow( )函数可以移动窗口;调用DestroyWindow( )可以退出窗口.如此说来, MFC又能做些什么呢?1.2 窗口和MFC环境M F C窗口是 C + +和Windows API 调用的综合.事实上, M F C 窗口提供了许多 (但不是全部) Windows API的C + +封装,从而减轻了编写 Wi n d o w s应用程序时一些乏味的工作,并提供了一些新的服务. M F C窗口不对窗口对象进行直接控制,而在 A P I环境中却是可以的.如果不能在 A P I环境中实现某项功能,那么肯定也不能在 M F C环境中实现.举例来说, M F C库的C W n d可以创建一个窗口,但它只是过去在API环境中使用的API调用的封装. 微软已经把在 M F C库中创建和维护一个窗口的逻辑作为真正的 C + +封装和控制.然而, 这种方法虽使得MFC库万能,但却是不方便的,并导致了严重的冗余和更多的错误. 创建M F C窗口是复杂的,首先,创建类 C W n d的一个实例,然后调用类 C W n d的一个成员函数,该成员函数调用API中的CreatWindow( )函数.返回的窗口句柄 (这只是指向窗口对象的非直接指针 )保存在类CWnd的成员变量 m_hWnd中. 注意因为窗口在内存中创建,而内存经常发生变化,窗口地址可能是经常变化的.因此,窗口句柄并非直接指向窗口对象,而是指向跟踪窗口对象地址的另一个指针. 销毁窗口同样也是复杂的,必须确保销毁了该窗口对象,以及封装该窗口对象的 CWnd实例.虽然CWnd对象知道窗口对象,但是窗口对象并不知道 CWnd对象(见图1-6).下载窗口对象窗口类 CWnd类对象第1章窗口5窗口①首先,用 AfxRegister Class( ) 函数创建一个窗口类②然后,在堆栈上或堆中创建一个 CWnd类对象③调用 CWnd的成员函数 Create(),该函数自身调用图 1 - 4中看到的 ::Create Window()函数④ ::Create Window ⑤窗口管理器告知再次创建窗口; 每个窗口对象在窗口句柄保存到屏幕上绘制自己 CWnd中图1-6 应用两个对象创建MFC窗口尽管窗口应用程序的用户界面可以由几十个,甚至几百个窗口构成,但是大多数窗口还是由不到十个的窗口类创建的.即使在应用程序中有一千个窗口,每个窗口也只能是三种基本类型之一:重叠窗口,弹出窗口或子窗口.1.3 怎样应用MFC创建一个窗口可以用MFC的CWnd类创建一个窗口:CWnd wnd; BOOL b=wnd.CreateEx (ExStyle, ClassName, WindowName, Style, x, y, Width, Height, Parent, Menu, Param);第一行代码创建了一个CWnd类的对象,第二行通过调用Windows API函数CreateWindowEx( ) 创建了真正的窗口.HWND hwnd=::CreateWindowEx (ExStyle, ClassName, WindowName, Style, x, y, Width, Height, Parent, Menu, Instance, Param);因为C W n d类只是封装了用于创建窗口的 Windows API函数( C r e a t e WindowEx( )),因此, 从本质上讲,创建窗口所必须的参数在API环境和MFC环境中是相同的:■ ■ ■ ■ ■ ■参数Style和ExStyle决定窗口的"外观"和类型 (重叠,弹出,子窗口 ). 参数ClassName决定在创建窗口时使用的窗口类. 参数WindowName决定窗口标题内容(如果窗口标题有内容). 参数x, y, Width和Height决定窗口的位置和大小. 参数Parent指向拥有该窗口的窗口指针 (如果有这样的窗口 ). 参数M e n u指向内存中的一个对象,作为它的菜单使用—除非创建一个子窗口,如果是这样的话,那么该参数是帮助父窗口识别子窗口的IDnumber. 参数Instance识别该窗口属于哪个应用程序,以便发送到该窗口的消息能被发送到正确的应用程序的消息队列中. CWnd类填入Instance参数. 参数Param是在创建窗口时由窗口类使用的指针,该指针是指向附加信息的非强制性结构的指针.■■返回的hwnd参数是指向创建的窗口对象的指针,但在未创建任何窗口时,该参数返回值为NULL.窗口句柄自动地保存在CWnd类的m_hWnd成员变量中,这在前面的图 1-6中可以看到.6规则. 规则第一部分基础知识下载现在既然已了解了有关创建窗口的基本知识,那么让我们进一步来看看填写这些参数的1. 窗口名称参数该参数是一个零结尾的文本串,用该串指明在窗口标题栏中显示的内容.如果窗口没有标题栏,该参数可以为零(0). 然而,某些通用控件也使用该参数.例如,按钮控件把该参数的内容放在按钮的表面. 在创建窗口标题栏后,可以用类CWnd的成员函数SetWindowText()来改变窗口标题栏的名称.2. 风格和扩展风格参数这两个是3 2位的参数,用来指定创建什么类型的窗口.可以选择多种类型,如下面的例子所示:,WS_CHILD|WS_VISIBLE,窗口风格参数的作用包括:■用于创建三种基本窗口类型的风格,用 W M _ C H I L D创建一个子窗口;用 W M _ P O P U P 创建一个弹出窗口. W M _ O V E R L A P P E D创建一个重叠窗口.如果不为窗口指定任何一种风格,那么窗口风格默认为WM_OVERLAPPED. 用以增添窗口的非客户区特色的风格.例如,可以用 W S _ V S C R O L L为窗口添加一个垂直滚动条,如图 1-7所示其他非客户区窗口风格.■■若在CreateWindow( ) 中定义了菜单条,则菜单条出现, 它不是一个子窗口 (使窗口可视) (禁止窗口输入)如果选取了最小化或最大化按钮则关闭按钮出现图1-7 非客户窗口风格用来增添窗口的特色■由每个通用控件定义的风格.例如, B S _ F L AT按钮风格告诉按钮控件绘制一个二维按钮. 用来使窗口可视,可操作和 /或初始最大化的风格. 用来标识控件组起始控件的风格,或者当用户敲击 Tab键控制焦点在窗口中变化时,用来指示哪个控件有资格获得输入焦点的风格. 想了解更多的有关窗口风格的例子,请参阅附录 A.■ ■■在创建窗口以后,可以用C W n d的成员函数ModifyStyle( )和ModifyStyleEx( )改变窗口风格.某些风格可能要求重画窗口,这时,可以给 ModifyStyle( )函数添加第三个参数,自动激发类CWnd的成员函数SetWindowPos( )做重画窗口工作.下载CWnd wnd; wnd.ModifyStyle (0,WS_BORDER,SWP_NOZORDER);第1章窗口7事实上,给 M o d i f y S t y l e ( )或M o d i f y S t y l e E x ( )添加任何第三个参数,都需要添加下面的 S e t WindowPos( ) 选项: S W P _ N O Z O R D E R,S W P _ N O M O V E ,S W P _ N O A C T I VAT E和 SWP_SHOW. 注意有时候,甚至一个重画的窗口可能与新风格不相容,尤其对通用控件窗口来说更是这样.因为单个窗口决定重画窗口时使用什么风格.在这种情况下,唯一的办法是: 在事先存储已有窗口的风格和其他参数后,销毁和重建该窗口. 3. X 和Y位置参数这是两个 3 2位的参数,用于以像素为单位指定窗口的位置.创建重叠窗口和弹出窗口时,X和Y是相对于桌面窗口左上角的位置.而创建子窗口时, X和Y是相对于父窗口客户区的左上角位置.如果把 X和Y参数都设置为 C W _ U S E D E FA U LT,那么系统将自动为窗口选定一个位置.系统层叠排列这些新窗口 (见图1-8).第一窗口下一个窗口第三个窗口图1-8 CW_USEDEFAULT允许系统自动设定窗口位置然而,如果 X和Y参数都设置为 C W _ U S E D E FA U LT,那么子窗口在创建的时候,总被创建在(0, 0)的位置. 创建窗口以后,可以用类CWnd的成员函数MoveWindow( )移动窗口. 4. 宽度和高度参数这是两个 3 2位的参数,用于以像素为单位指定窗口的大小.如果将参数 Wi d t h和H e i g h t都设置为CW_USEDEFAULT,则系统将根据桌面窗口的大小,自动选定窗口的大小.然而,对于一个子窗口来说,系统将创建一个长和宽均为 0的窗口.如果窗口的风格是 W S _ M I N I M I Z E 或WS_MAXIMIZE,那么系统将忽视用户为 Width和Height设置的任何值. 创建窗口以后,可以用类CWnd的成员函数MoveWindow( )重新设置窗口的大小. 5. Z-Order 当几个窗口占据屏幕上同一区域时, Z - O r d e r决定哪个窗口显示在哪个窗口之上. Z O r d e r ( Z顺序)中的Z来源于坐标X-Y-Z轴的Z轴,其中Z轴垂直屏幕,并由屏幕指向外面.当窗口最初被创建或选中时,则窗口将出现在 Z - O r d e r的顶层.然而,该窗口永远不可能出现在一个最顶层窗口的上面,除非该窗口也是最顶层的窗口. "最顶层"窗口用 W S _ E X _ TO P M O S T 窗口风格创建,并显示在所有非最顶层窗口的上面,而与该窗口是不是当前选中的窗口无关. 创建窗口后,可以用 CWnd的成员函数 SetWindowPos()改变窗口的Z顺序. 6. 父窗口或物主窗口参数该参数是指向类 CW n d对象的指针,根据创建的窗口类型标识是父窗口还是物主窗口8■第一部分基础知识下载(Owner): 如果创建的是一个子窗口,那么用该参数来标识它的父窗口 (该子窗口所放置的并为之所截断的窗口 ).该值不能为 N U L L.子窗口只能出现在它的父窗口里面,当父窗口被销毁时它们也被销毁,并且当父窗口被隐藏或最小化时它们也被隐藏.■如果创建的是重叠窗口或弹出窗口,用该参数来标识物主窗口.如果该值为N U L L,则桌面窗口成为物主窗口.从属窗口总是显示在它们的主窗口上面,并且随着物主窗口的销毁而被销毁;物主窗口最小化时,则从属窗口被隐藏;但当物主窗口被隐藏时, 从属窗口并不被隐藏. 一个子窗口可能是另一个子窗口的父窗口,但绝不可能是一个物主窗口.如果试图使一个子窗口成为一个物主窗口,那么系统只能使那个子窗口的最顶层窗口作为物主窗口.图 1 - 9 是这些关系的概述.②子窗口对象被创建, 并显示在父窗口中①重叠或弹出窗口对象被创建,并显示在屏幕上③ 弹出或重叠窗口对象被创建,并显示在父窗口中图1-9 物主,父,子窗口的层次关系可以用 C W n d的成员函数 SetOwner( ) 改变已有窗口的物主窗口,用 C W n d的成员函数 SetParent( )改变父窗口. 7. 菜单或控件 ID 参数该参数用来标识菜单 ( M e n u )句柄或控件 (Control )ID,这要依赖于创建的窗口是子窗口, 重叠窗口,还是弹出窗口.■如果创建的是一个子窗口,用该参数标识控件 I D,控件I D通常用来帮助父窗口识别子窗口.因为该参数寻求一个 H M E N U变量,因此,需要用 H M E N U类型重载变量定义控件ID.例如,如果子窗口的控件 ID 是102,应该用如下方法定义它:…, (HMENU) 102,… ■如果创建的是一个重叠窗口或弹出窗口,用该参数定义窗口的菜单.若该值为 N U L L, 则菜单默认为在该窗口的窗口类中定义的任何菜单;如果窗口类也没有指定的菜单, 则该窗口在创建时没有菜单.可以用下面的方法为该参数加载一个菜单:HMENU hMenu=::LoadMenu (AfxGetInstanceHandle( ), MAKEINTRESOURCE (xx));下载这里的xx是应用程序资源里面的菜单 ID(Menu ID).第1章窗口9可以用CWnd的SetDlgCtrlID( )改变已有子窗口的 ID.用类CWnd 的成员函数 SetMenu( )改变一个重叠窗口或弹出窗口的菜单. 8. 实例前面已提到,CWnd类将填入该参数. CWnd通过调用AfxGetInstanceHandle( )获得该实例 (Instance).一个应用程序的实例从本质上标识了哪个程序在内存里. AfxGetInstanceHandle( ) 是由MFC库提供的静态函数. 9. 参数该3 2位参数 ( P a r a m e t e r )是可选的.它通常是指向一个结构或者类对象的指针,而该结构或者类对象是创建某种类型的窗口时需要提供的.例如,当用MDICLIENT窗口类创建窗口时, 需要该参数提供一个CLIENTCREATESTRUCT结构的指针.10. 类名参数类名(Class Name)参数是一个零结尾字符串,当创建一个窗口时,用来标识使用那个窗口类.关于窗口类和窗口处理,将在本章后面的内容中详细讨论.该参数不能为NULL,在创建一个非常一般的MFC窗口时,使用AfxRegisterWndClass (0)填入该参数.1.4 怎样使用MFC销毁一个窗口如前面所提到的一样,删除一个 M F C窗口可能有些烦琐,必须按下面的顺序删除两个对象:pWnd->DestroyWindow( ); //destroys Window Object delete pWnd; //destroys Cwnd Object也可以只删除 C W n d对象,因为 D e s t r o y Window( )是从CW n d的析构函数中调用的,但不提倡使用这种方法.销毁一个窗口而不先调用DestroyWindow( )函数,将使某些析构消息不能被任何从CWnd派生的类处理.你几乎不需自己销毁一个窗口,用户或系统通常会做这项工作. 如果需要在销毁窗口的同时销毁 C W n d对象,则应该在C W n d的派生类中添加下面的重载函数:CYourWnd::PostNcDestroy( ) { delete this; }PostNcDestroy( )是销毁窗口前调用的最后一个成员函数.但是,几乎不需对该函数进行重载,因为CWnd和派生类一般是嵌在另一个类中或建立在堆栈中的. 1.4.1 捆绑到一个已有的窗口如果一个窗口是用Windows API在应用程序建立之前或外面创建的,并且需要把它封装到CWnd类中,可以用下面的语句实现:CWnd wnd; wnd.Attach (hwnd);这里的hwnd是已有窗口的句柄. Attach( )只是把CWnd的成员变量 m_hWnd赋给hwnd. 也可以使用CWnd::FromHandle (hwnd),它查看是否有 C W n d对象已经封装了该窗口句柄并返回该 C W n d 对象的指针.如果不存在这样的 C W n d对象,将创建一个临时对象.如果是临10第一部分基础知识下载时对象,则不要使用该指针,因为在应用程序空闲的时候,该指针指向的对象将被删除. 1.4.2 窗口类前面已提及,一个窗口类不是一个 C + +类,而是早于并存在于 C + +之外的窗口专有的类. 窗口类的作用就像一个模板,可以由此创建其他窗口,并可共享某些特征,包括下面所示的特征: 类风格包括能给予窗口的一些微小的特征. 类图标类菜单如果窗口有图标,用它来指定在窗口的左上角处所画的图标. 如果窗口有菜单,用它来指定窗口中显示的菜单.类光标当光标通过窗口的客户区时,用它来指定显示哪种鼠标形状. 背景色定义用什么颜色来擦除窗口的背景色.窗口的客户区将显示该颜色. 窗口进程定义处理任何发送到该窗口的消息时应该调用的函数.定义窗口进程可能是窗口类唯一最重要的前提. 1.4.3 窗口进程窗口与环境的交互是通过发送和接收消息来实现的.如果系统要求窗口自己进行绘制, 系统给它发送一个 W M _ PA I N T 消息; 如果系统要求窗口销毁自己 , 则发送一个 W M _ D E S T R O Y消息.这些消息都由窗口的窗口进程处理,该窗口进程的地址在窗口类中定义.对于发送到由相同的窗口类创建的窗口的消息,系统采用完全相同的窗口进程进行处理. 相同的窗口进程是怎样跟踪所有的窗口的呢?它是怎么知道窗口A 画在( 1 0 , 3 4 ),而窗口 B画在 (56,21)呢?所有这些工作的完成只需使用窗口的窗口对象. 例如,所有用按钮窗口类创建的窗口,都使用相同的按钮窗口进程.如果一个WM_PAINT消息发送到其中任何一个窗口,则按钮窗口进程根据每个窗口的窗口对象指定的大小,位置和风格画出确切的按钮 (见图1-10).窗口对象③" BUTTON"的窗口进程搜索窗口对象,以查明绘制什么类型的按钮,如果风格是 "Check Box" ,则绘制一个复选框父窗口①用"BUTTON"窗口类创建的窗口②通过发送一个WM_PAINT 消息到窗口进程,窗口管理器告诉每个窗口绘制自己④如果风格是" Push Button",则窗口进程绘制一个按钮⑤ 窗口进程也搜索窗口对象以查明在哪里绘制这些控件窗口图1-10 按钮窗口进程使用窗口对象指定对哪个窗口进行操纵下载1.5 怎样使用MFC创建一个窗口类第1章窗口11当用户创建一个窗口类时,实际上只是在三个操作系统列表之一中注册一个 W N D C L A S S 结构.系统为每个窗口类类型维护一个列表: 系统全局类(System Global Class) 有效. 应用程序全局类(Application Global Class) 的线程有效. 应用程序局部类(Application Local Class) 由应用程序注册,并只对注册它们的应用程序或DLL有效. 当系统搜索一个窗口类时,从应用程序局部类开始,然后搜索应用程序全局类,最后搜索系统全局类. 要创建一个窗口类,可以先创建WNDCLASS结构的实例,然后用 MFC类库的AfxRegister Class( ) 注册它.也可以用 M F C类库的AfxRegisterWndClass( ) 来创建一个基于调用参数的WNDCLASS对象. 1.5.1 使用AfxRegisterWndClass( )函数注册一个窗口类 AfxRegisterWndClass( )函数在使用上是非常自动化的,一些通常需要你提供的参数都能自己填入,甚至连新的窗口类的名字也能自动产生.LPCTSTR lpszClassName=AfxRegisterWndClass(UINT nClassStyle, HCURSOR hCursor=0,HBRUSH hbrBackground=0, HICON hIcon=0);在系统启动时注册,且必须注册,对所有应用程序都由应用程序注册,只对应用程序及应用程序这些参数的使用规则如下: 1. 类名根据传给该函数的参数,为新的窗口类产生名字.如果传输的参数完全相同,那么创建的窗口类也将完全相同.如果需要创建新的窗口类,可以用 AfxRegisterClass( ). 2. 风格窗口类风格由下面选项列表中一系列标记的或 (OR)运算提供: 类风格CS_OWNDC CS_PARENTDC CS_CLASSDC CS_SAVEBITS CS_BYTEALIGNCLIENT CS_BYTEALIGNWINDOW CS_GLOBALCLASS CS_VREDRAW CS_HREDRAW CS_NOCLOSE CS_DBLCLKS 描述为为该窗口类创建的每个窗口分配唯一的设备环境.有关设备环境的更详尽资料见第4章为从系统高速缓存中检索设备环境,然后设置该设备环境的剪裁区,以组合到父窗口中,以便子窗口能画在父窗口上为分配一个设备环境给所有由该窗口类创建的窗口使用为由该类创建的任何窗口的视频存储区将被保存,以便窗口移动或关闭时,不需要重画基础窗口—这对快速机器来说作用不大为当计算机的显示卡和 C P U速度较慢时,这两种风格有用.添加这些风格后,当窗口在字节边缘时,显示卡更容易移动窗口为如果设置该风格,则该类是应用程序的全局类,否则它是一个应用程序局部类为如果设置了垂直风格,并且窗口的垂直大小发生了变化,则整个窗口被重画. 水平风格也这样为禁用系统菜单中的关闭命令为如果未设置该参数,并且双击由该窗口类创建的窗口,则传送给应用程序的将不是双击事件,而是两个相继完成的单击事件12第一部分基础知识下载3. 图标(Icon) 该参数是显示在窗口左上角的图标的句柄,但只适用于使用 W S _ S Y S M E N U的窗口风格. 应用程序主窗口的图标也显示在任务栏上.如果将该参数设置为理过,用CWnd的SetIcon()可改变已有的图标.4. 光标(Cursor) 该参数是鼠标移经应用程序窗口的客户区时,将要显示的鼠标光标句柄.如果将该参数设置为NULL,则显示的是箭头光标.可以用下面的语句装载一个光标:HICON hIcon=AfxGetApp( )->LoadCursor (xx);N U L L ,并且设置了W S _ S Y S M E N U风格,则系统将提供一个默认的图标.在 M F C环境中,绝大部分图标已被处这里的xx是应用程序资源中光标的名字或ID. 这里指定的光标意味着是该窗口的默认光标.如果想动态地改变光标形状,则应该处理该窗口的WM_SETCURSOR消息,并用 SetCursor( )来改变光标形状 (见第8章例33). 5. 背景色当系统创建窗口时,先在显示窗口的地方画一个矩形区域,以擦除该区域的背景色.该参数指定填充该矩形域时所用画刷的句柄 (参见第 4章有关画刷的详细内容 ).为窗口类创建的画刷对象在该类退出注册时被自动释放. 在指定背景色时,也可以不创建画刷对象,而指定下面所列系统颜色之一:COLOR_ACTIVEBORDER COLOR_ACTIVECAPTION COLOR_APPWORKSPACE COLOR_BACKGROUND COLOR_BTNFACE COLOR_BTNSHADOW COLOR_BTNTEXT COLOR_CAPTIONTEXT COLOR_GRAYTEXT COLOR_HIGHLIGHT。
MFC入门系列ClistCtrl列表控件操作
InsertColumn 插入新列列表视图控件,函数原型如下
int InsertColumn( int nCol,//列从 0 开始 LPCTSTR lpszColumnHeading,//显示的字符串指针 int nFormat = LVCFMT_LEFT,//对齐方式可选 LVCFMT_LEFT、 LVCFMT_RIGHT 或 LVCFMT_CENTER,第一列必须左对齐 int nWidth = -1,//列宽,-1 表示未设置 int nSubItem = -1 );
10、列表排序
11、将关于添加到菜单栏目。
二、项目创建和主页面的布局
1、点击文件>新建>项目
2、选择 MFC 应用程序>修改名称>存储位置
3、选择基于对话框,后面一直下一步或者完成。
4、选择资源视图>My.rc>Dialog>IDD_XXX_DIALOG,双击,弹出右边的对话框
5、选择默认的三个控件,右键删除或者 delete 删除。
11、给列表添加控件名称 在列表控件中右键>添加变量>填入控件名称(我命名为 m_List) ,这样就可以在 程序中引用这个控件了
12、显示第一行的标题这个可以在窗口初始化的过程中实现(图片有误)
还是像 2.10 中一样,在 XXXDlg.cpp>CXXXDlg>OnInitDialog()下,添加程序如下 CRect rect;//实例化 CRect 类 m_List.GetClientRect(rect);//获取列表的工作区间 m_List.InsertColumn(0, L"比赛时间", LVCFMT_LEFT, rect.Width() / 5); m_List.InsertColumn(1, L"主队", LVCFMT_LEFT, rect.Width() / 5);
mfc项目开发实例85个
mfc项目开发实例85个标题:MFC项目开发实例85个引言概述:MFC(Microsoft Foundation Classes)是微软公司开发的一套用于Windows操作系统的C++类库,用于快速开发Windows应用程序。
本文将介绍85个MFC项目开发实例,涵盖了各种常见的应用场景和功能需求。
正文内容:一、图形界面开发1.1 绘制基本图形- 绘制直线- 绘制矩形- 绘制椭圆- 绘制多边形1.2 图像处理- 图像的加载与显示- 图像的缩放与旋转- 图像的滤波处理- 图像的边缘检测1.3 用户交互界面- 按钮控件的使用- 文本框控件的使用- 列表框控件的使用- 树形控件的使用二、文件操作2.1 文件的读取与写入- 文本文件的读取与写入- 二进制文件的读取与写入- CSV文件的读取与写入- XML文件的读取与写入2.2 文件的拷贝与移动- 文件的复制与粘贴- 文件的剪切与粘贴- 文件的重命名- 文件的删除与恢复2.3 文件的压缩与解压- ZIP文件的压缩与解压- RAR文件的压缩与解压- GZIP文件的压缩与解压- 7z文件的压缩与解压三、数据库操作3.1 数据库连接与断开- SQL Server数据库的连接与断开- MySQL数据库的连接与断开- Oracle数据库的连接与断开- SQLite数据库的连接与断开3.2 数据库查询与更新- 数据库表的创建与删除- 数据库表的查询与筛选- 数据库表的插入与更新- 数据库表的删除与修改3.3 数据库事务处理- 数据库事务的开启与提交- 数据库事务的回滚与撤销- 数据库事务的锁定与解锁- 数据库事务的并发控制四、网络通信4.1 TCP/IP通信- TCP客户端的创建与连接- TCP服务器的创建与监听- TCP数据的发送与接收- TCP连接的关闭与断开4.2 UDP通信- UDP客户端的创建与连接- UDP服务器的创建与监听- UDP数据的发送与接收- UDP连接的关闭与断开4.3 HTTP通信- HTTP请求的发送与接收- HTTP响应的处理与解析- HTTP连接的保持与断开- HTTP代理的设置与使用五、多线程编程5.1 线程的创建与销毁- 线程的创建与启动- 线程的暂停与恢复- 线程的结束与销毁- 线程的优先级设置与调整5.2 线程同步与互斥- 互斥锁的使用- 信号量的使用- 事件的使用- 临界区的使用5.3 线程通信与消息传递- 线程间的数据传递- 线程间的消息传递- 线程间的事件通知- 线程间的同步与异步处理总结:综上所述,本文介绍了85个MFC项目开发实例,涵盖了图形界面开发、文件操作、数据库操作、网络通信和多线程编程等多个方面。
VC MFC 编程实例19
D.1.1 激活其他应用程序 Developer Studio可在Tools菜单中添加定制菜单命令,在环境内运行其他应用程序,方法 如下: 1) 单击Tools/Customize菜单命令,以打开 Customize属性表. 2) 选择To o l s选项卡,并滚动到菜单列表的底部 (Developer Studio应该已经在该菜单中预 装了几个命令). 3) 选中底部的空白焦点矩形,并输入需要在菜单中显示的名字;按回车键将打开三个编 辑框,分别是Command,Arguments和Initial Directory. 4) 在Command中,输入要运行的执行文件的路径名. 5) 在Arguments中,输入传递给执行文件的参数. 6) 在Initial Directory中,输入运行该命令前 Developer Studio应该改变的目录. 可把下面的命令添加到 Tools菜单: Explorer命令 使Windows Explorers最初在工程目录中打开.菜单名字输入到 Explorer中. 命令输入 C : \ Wi n d o w s \ e x p l o r e r. e x e或C : \ Wi n n t \ e x p l o r e r. e x e (根据操作系统而定 ),参数输入 / e, 并使初始目录(Initial Directory)为空白. DOS命令 打开一个初始在工程目录下 MS-DOS窗口.菜单命令输入 MS-DOS,命令输入
必须改用printf ( ),还可以用下面即将讨论的AfxMessageBox ( ). D.2.2 AfxMessageBox ( ) 如果问题只出现在没有安装 Developer Studio的操作系统上的应用程序中,或只出现在应 用程序的发行版中时,除了在软件中用 printf ( )外,还可以考虑使用 AfxMessageBox ( );可以 格式化一个消息或创建一个静态消息,用以指示应用程序通过一个关键部位时的过程,并用 AfxMessageBox ( )显示这些消息; AfxMessageBox ( )甚至可以不必在一个控件窗口的类中, 或者根本不必在一个类中. D.2.3 ASSERT ( )和VERIFY ( ) 另外两个用来检查工作的全局函数是 A S S E RT ( ) 和VERIFY ( ),这些宏通常用来检查传 送到一个函数的参数是否合法.如果这些参数来自用户的输入,可能还要用 AfxMessageBox ( )显示某种错误消息;但是,如果该参数源于应用程序的其他部分,则可以使用具有更小系统 开销的ASSERT ( )和VERIFY ( ),MFC库用ASSERT ( )和VERIFY ( )防止任何愚蠢的错误导 致奇异的结果. 在应用程序的调试版中, ASSERT ( )和VERIFY ( )核查一个合法的 C或C++表达式,如果 不是TRUE,则显示一个错误消息并退出应用程序;在应用程序的发行版中, ASSERT ( )不做 任何事情 — 甚至不核查括弧内的表达式, VERIFY ( )虽然核查表达式,但如果发现错误,还 是不能停止应用程序的发行版.这两个宏的例子如下:
VISUAL_C++MFC扩展编程实例
VISUAL_C++MFC扩展编程实例目录译者序前言第一部分基础第1章概述 11.1 Windows基础 11.1.1 窗口类结构 21.1.2 消息 21.1.3 客户区和非客户区 21.1.4 重叠窗口、弹出窗口和子窗口 21.1.5 父窗口和宿主窗口 31.2 Windows消息 31.2.1 发送或寄送消息 41.2.2 消息类型 41.2.3 接收消息 41.2.4 窗口处理函数的子类化 51.3 窗口绘图 51.3.1 设备环境 51.3.2 绘图工具 61.3.3 映射模式 61.3.4 窗口视和视口视 61.3.5 逻辑单位和设备单位 71.3.6 绘图函数 71.3.7 抖动和非抖动颜色 71.3.8 设备无关位图 81.3.9 元文件 81.3.10 何时绘图 81.4 MFC基础 81.5 Developer Studio基础 9 1.6 Windows和MFC总结 10 1.7 基本类 101.8 应用类 111.8.1 文档视 111.8.2 CWinApp(OC) 111.8.3 文档模板 121.8.4 线程 121.8.5 CFrameWnd(OCW) 12 1.8.6 CDocument(OC) 12 1.8.7 CView(OCW) 131.8.8 对话框应用程序 131.8.9 SDI应用程序 131.8.10 MDI应用程序 131.9 其余用户界面类 131.9.1 通用控件类 131.9.2 菜单类(O) 141.9.3 对话框类 151.9.4 通用对话框MFC类 15 1.9.5 控件条类 (OCW) 15 1.9.6 属性类 151.10 绘图类 161.11 其他MFC类 161.11.1 文件类 161.11.2 CArchive和序列化 16 1.11.3 数据库类 171.11.4 ODBC类 171.11.5 DAO类 171.11.6 数据集合类 171.11.7 通信类 181.12 类的消息机制 181.12.1 MFC如何接收一个寄送消息 181.12.2 MFC如何处理接收的消息 181.12.3 UI对象 201.13 小结 20第2章控制条 212.1 通用控制条 212.2 用API创建控制条 222.3 用MFC创建控制条 242.3.1 CToolBarCtrl和CStatusBarCtrl 242.3.2 CToolBar和CStatusBar 242.3.3 CControlBar 262.4 停靠栏 272.4.1 设置停靠功能 282.4.2 自动改变大小和移动 302.4.3 停靠栏小结 302.5 浮动条 312.6 MFC的高级控制条类小结 322.7 视和控制条如何共享客户区 322.7.1 CFrameWnd::RecalcLayout() 322.7.2 CWnd::RepositionBars() 332.7.3 CControlBar::OnSizeParent() 332.7.4 CalcDynamicLayout()和CalcFixedLayout () 342.7.5 CToolBar::CalcFixedLayout()和CTool Bar:: CalcDynamicLayout() 352.7.6 工具栏布局 352.7.7 CStatusBar::CalcFixedLayout() 362.7.8 CDockBar::CalcFixedLayout() 362.7.9 共享客户区小结 362.8 对话条 372.9 伸缩条 382.9.1 CReBar和CReBarCtrl 392.9.2 CReBar::CalcFixedLayout() 392.10 命令条 392.11 控制条窗口小部件风格 402.11.1 工具栏按钮风格 402.11.2 状态栏窗格风格 402.11.3 伸缩条段风格 402.12 设计自己的控制条 412.12.1 重载CControlBar::CalcDynamic-Layout() 41 2.12.2 增加WM_SIZEPARENT消息处理器 412.12.3 重载CMainFrame::RecalcLayout() 412.12.4 从CDockBar派生 422.13 实例 422.14 总结 42第3章通信 433.1 进程间通信 433.1.1 通信策略 433.1.2 同步和异步通信 443.2 窗口消息 443.2.1 打开和关闭 443.2.2 读与写 453.2.3 回顾 453.3 动态数据交换 463.3.1 客户/服务器 463.3.2 打开和关闭 463.3.3 读和写 473.3.4 其他DDE函数 483.3.5 MFC支持 483.3.6 回顾 493.4 消息管道 493.4.1 打开和关闭 493.4.2 读和写 503.4.3 回顾 513.5 Windows套接字 513.5.1 打开和关闭 523.5.2 读和写 523.5.2 通过Windows套接字序列化 53 3.5.3 数据流和数据报 533.5.4 回顾 543.6 串行/并行通信 543.6.1 打开和关闭 543.6.2 读和写 543.6.3 配置端口 553.6.4 回顾 553.7 Internet通信 563.7.1 打开和关闭文件 563.7.2 读文件 563.7.3 打开和关闭连接 563.7.4 其他Internet类 573.8 通信方式小结 573.9 共享数据 583.10 共享内存文件 583.10.1 创建和销毁 583.10.2 读和写 583.10.3 回顾 593.11 文件映射 593.11.1 打开和关闭 593.11.2 读和写 603.11.3 数据同步 603.11.4 回顾 603.12 客户/服务器 613.12.1 传递调用参数 613.12.2 远程过程调用 623.13 小结 62第二部分用户界面实例第4章应用程序和环境 644.1 实例1:在工具栏中添加静态标识符 64 4.2 实例2:在工具栏中添加动态标识符 71 4.3 实例3:只启动一个实例 754.4 实例4:创建对话框/MDI混合式应用程序 774.5 实例5:在系统托盘中添加图标 794.6 实例6:主菜单状态栏中的标记 81第5章菜单、控件条和状态栏 855.1 实例7:在菜单中添加图标 855.2 实例8:调整命令条外观 975.3 实例9:可编程工具栏 1025.4 实例10:在对话框中添加工具栏、菜单和状态栏 1275.5 实例11:在弹出菜单中增加位图标记 129 5.6 实例12:工具栏上的下拉按钮 1315.7 实例13:在状态栏中添加图标 1365.8 实例14:使用伸缩条 141第6章视 1436.1 实例15:创建标签窗体视 1436.2 实例16:创建具有通用控件的视 1506.3 实例17 :打印报表 1566.4 实例18:打印视 1676.5 实例19:绘制MDI客户视 1746.6 实例20:拖放文件到视 177第7章对话框和对话条 1797.1 实例21:动态改变对话框的尺寸 179 7.2 实例22:自定义数据交换并验证 184 7.3 实例23:重载通用文件对话框 187 7.4 实例24:重载通用颜色对话框 190 7.5 实例25:获得目录名 1927.6 实例26:子对话框 1977.7 实例27:子属性表 198第8章控件窗口 2008.1 实例28:自己绘制的控件 2008.2 实例29:在窗口标题中添加按钮 204 8.3 实例30:添加热键控件 211第9章绘图 2139.1 实例31:使用非散射颜色 2139.2 实例32:伸展位图 2279.3 实例33:抓取屏幕 2319.4 实例34:输出DIB位图文件 236第10章帮助 24310.1 实例35:添加帮助菜单项 243 10.2 实例36:添加上下文相关帮助 245 10.3 实例37:添加气泡帮助 247第11章普通窗口 25411.1 实例38:创建普通窗口 25411.2 实例39:创建短调用形式窗口类 256 11.3 实例40:创建长调用形式窗口类 258第12章特定的应用程序 26112.1 实例41:创建简单的文本编辑器 261 12.2 实例42:生成简单的RTF编辑器 262 12.3 实例43:创建资源管理器界面 265 12.4 实例44:创建简单的ODBC数据库编辑器 28412.5 实例45:创建简单的DAO数据库编辑器 28712.6 实例46:创建简单的向导 289第三部分内部处理实例第13章消息和通信 29513.1 实例47:等待消息 29613.2 实例48:清除消息 29713.3 实例49:向其他应用程序发送消息 298 13.4 实例50:与其他应用程序共享数据 300 13.5 实例51:使用套接字与任意的应用程序通信 30113.6 实例52:使用串行或并行I/O 321第14章多任务 33114.1 实例53:后台处理 33114.2 实例54:运行其他应用程序 332 14.3 实例55:改变优先级 33414.4 实例56:应用程序内部的多任务工作者线程 33614.5 实例57:应用程序内部的多任务—用户界面线程 33914.6 实例58:向用户界面线程发送消息 342 14.7 实例59:线程间的数据共享 343第15章其他 34715.1 实例60:创建定时器 34715.2 实例61:播放声音 34915.3 实例62:创建VC++宏 350 15.4 实例63:使用函数地址 351 15.5 实例64:二进制字符串 352 15.6 实例65:重新启动计算机 356 15.7 实例66:获得可用磁盘空间 357 15.8 实例67:闪烁窗口和文本 358 第四部分附录附录A 消息和重载顺序 361附录B 绘图结构 385。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void CMy122Dlg::OnButton1open() {m_OPEN.EnableWindow(false ); //EnableWindow()方法可以使按钮失效MessageBox("已打开");m_CLOSE.EnableWindow(true );}void CComboboxDlg::Onmony(){UpdateData(TRUE);CString str,strmoy;strmoy.Format("%d",m_money);str="你确定要将";str+=strmoy;str+="元打入对方账户?";if (IDOK==MessageBox(str,"提示",MB_ICONQUESTION|MB_OKCANCEL)){MessageBox("付款成功","提示",MB_ICONASTERISK);}}控制显示的文本利用成员函数SetWindowText/GetWindowText 用于设置/得到当前显示的文本。
通过GetLimitText/SetLimitText 可以得到/设置在输入框中输入的字符数量。
输入框几种常用的消息映射宏:ON_EN_CHANGE 输入框中文字更新后产生ON_EN_ERRSPACE 输入框无法分配内存时产生ON_EN_KILLFOCUS / ON_EN_SETFOCUS 在输入框失去/得到输入焦点时产生在创建滚动条后需要调用void SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE )设置滚动范围, int GetScrollPos( )/int SetScrollPos( )用来得到和设置当前滚动条的位置。
void ShowScrollBar( BOOL bShow = TRUE );用来显示/隐藏滚动条。
BOOL EnableScrollBar( UINT nArrowFlags = ESB_ENABLE_BOTH )用来设置滚动条上箭头是否为允许状态。
nArrowFlags 可取以下值:ESB_ENABLE_BOTH 两个箭头都为允许状态ES_DISABLE_LTUP 上/左箭头为禁止状态MessageBox("这个是自定义的消息!!!" ,"自定义消息对话框!!!",MB_ICONINFORMATION); MB_ABORTRETRYIGNORE 显示终止重试或忽然按钮 MB_OK 显示确定按钮 MB_RETRYCANCEL 显示确定或取消按钮 MB_YESNO 显示重试或取消按钮 MB_YESNOCANCEL 显示是或否按钮 MB_ICONQUESTION 带问号图标 MB_ICONHAND 、MB_ICONSTOP 、MB_ICONERROR 三种都是带叉号图标 MB_ICONEXCLAMA TION 、MB_ICONW ARNING 两种都是带感叹号图标 MB_ICONASTERISK MB_ICONINFORMA TION 带信息号图标 AfxMessageBox()函数缺点就无法设置消息对话框的标,提示消息框的标题与工程名称相同, 优点:就是在动态链接库工程或其它工程中,可以直接用它来显示消息提示对话框。
MessageBox()函数必须用于一个窗口对象,没有窗口对象,就无法调用MessageBox()函数ESB_DISABLE_BOTH 两个箭头都为禁止状态SB_TOP/SB_BOTTOM 已滚动到顶/底部SB_LINEUP/SB_LINEDOWN 向上/下滚动一行SB_PAGEDOWN/SB_PAGEUP 向上/下滚动一页SB_THUMBPOSITION/SB_THUMBTRACK 滚动条拖动到某一位置,参数nPos指明当前位置(参数nPos在其它的情况下是无效的)SB_ENDSCROLL 滚动条拖动完成(用户松开鼠标)注意:如果出现以上功能不好使的情况,可以关闭当前的工程,然后在工程目录下删除扩展名为“.ncb”的文件,然后重新打开工程,Visual C++会重建一个“.ncb”文件,此时完全取词功能将恢复正常。
void C_bj::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){// TODO: Add your message handler code here and/or call defaultvoid C_bj::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar){SCROLLINFO scrollinfo;SetScrollRange (SB_VERT, 0, 850, TRUE);//这个就是设置你的滚动条的范围GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);switch (nSBCode){case SB_BOTTOM:ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMax));scrollinfo.nPos = scrollinfo.nMax;SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);break;case SB_TOP:ScrollWindow(0,(scrollinfo.nPos-scrollinfo.nMin));scrollinfo.nPos = scrollinfo.nMin;SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);break;case SB_LINEUP:scrollinfo.nPos -= 20;if (scrollinfo.nPos<scrollinfo.nMin){scrollinfo.nPos = scrollinfo.nMin;break;}SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);ScrollWindow(0,20);break;case SB_LINEDOWN:scrollinfo.nPos += 20;if (scrollinfo.nPos>scrollinfo.nMax){scrollinfo.nPos = scrollinfo.nMax;break;}ScrollWindow(0,-20);break;case SB_PAGEUP:scrollinfo.nPos -= 20;if (scrollinfo.nPos<scrollinfo.nMin){scrollinfo.nPos = scrollinfo.nMin;break;}SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);ScrollWindow(0,20);break;case SB_PAGEDOWN:scrollinfo.nPos += 20;if (scrollinfo.nPos>scrollinfo.nMax){scrollinfo.nPos = scrollinfo.nMax;break;}SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);ScrollWindow(0,-20);break;case SB_ENDSCROLL:// MessageBox("SB_ENDSCROLL");break;case SB_THUMBPOSITION:// ScrollWindow(0,(scrollinfo.nPos-nPos));// scrollinfo.nPos = nPos;// SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);break;case SB_THUMBTRACK:ScrollWindow(0,(scrollinfo.nPos-nPos));scrollinfo.nPos = nPos;SetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);break;}CDialog::OnVScroll(nSBCode, nPos, pScrollBar);}void CTestScrollDlg::OnSize(UINT nType, int cx, int cy){SCROLLINFO scrollinfo;SetScrollRange (SB_VERT, 0, 600, TRUE);//这个就是设置你的滚动条的范围GetScrollInfo(SB_VERT,&scrollinfo,SIF_ALL);scrollinfo.nPage=400;//页的大小,SetScrollInfo(SB_VERT,&scrollinfo,SIF_PAGE);CDialog::OnSize(nType, cx, cy);// TODO: Add your message handler code here}void CFirstProjectDlg::OnOK(){if (!IsWindow(m_Book.m_hWnd)) //是否关联了对话框{m_Book.Create(IDD_BOOKDLG, NULL); //创建对话框}m_Book.ShowWindow(SW_SHOW); //显示对话框}void CMy122Dlg::OnButton2close(){m_CLOSE.EnableWindow(false);MessageBox("已关闭");m_OPEN.EnableWindow(true);}void CFirstProjectDlg::OnOK(){if (!IsWindow(m_Book.m_hWnd)) //是否关联了对话框{m_Book.Create(IDD_BOOKDLG, NULL); //创建对话框}m_Book.ShowWindow(SW_SHOW); //显示对话框}1.自定义一个消息;------>2.申明一个涵数---------------->3.把函数设成消息响应函数--------------->4.发送消息处理函数#define MESSAGE1 WM_USER+1 //windows定义好从下一个开始如有多个+1或+2 前面都是大写。