vc++MFC
VCMFC临界区使用方法事例
VCMFC临界区使⽤⽅法事例临界区的作⽤:避免临界区内的数据(⼀般为共享的资源)被不同的线程同时访问,实现线程的同步操作。
保证只能由先进⼊临界区的⼀个线程访问结束后,其他线程才可以继续访问共享的资源。
以下为临界区的使⽤⽅法:*.h头⽂件:#include <winbase.h>CRITICAL_SECTION m_cs_test; ///< 定义⼀个临界区对象*.cpp源⽂件使⽤⽅法:在类的构造函数内初始化临界区对象//该函数必须在任何线程调⽤EnterCriticalSection函数之前被调⽤,否则结果将是很难预计的::InitializeCriticalSection(&m_cs_test);在类的虚构函数内释放临界区对象::DeleteCriticalSection(&m_cs_test);使⽤⽅法⼀:在所需要使⽤的函数中开始锁定:CCriticalSectionLock lock(m_cs_test);在函数⽣命期结束后会⾃动解锁。
使⽤⽅法⼆://进⼊开始锁定数据:保护共享资源只被⼀个线程调⽤EnterCriticalSection(&m_cs_test);...//do something you want to//离开锁定的数据:允许共享资源被其他的线程调⽤LeaveCriticalSection(&m_cs_test);可以使⽤下⾯这个函数来代替EnterCriticalSection:BOOL TryEnterCriticalSection(PCRITICAL_SECTION pcs);TryEnterCriticalSection函数决不允许调⽤线程进⼊等待状态。
相反,它的返回值能够指明调⽤线程是否能够获得对资源的访问权。
因此,如果TryEnterCriticalSection发现该资源已经被另⼀个线程访问,它就返回FALSE。
vc++MFC基础教程
1.2.3 编辑区
• 在Visual C++中,编写应用程序代码的位置就是编辑区。该编辑区的 功能十分强大,智能化程度也非常高。在编辑区内,除了能编写 C/C++语言外,还能编写SQL、HTML和VBScript等其他编程语言。 如下图所示。
1.2.4 联机帮助
• Visual C++6.0不像其他集成开发环境一样把帮助系统集成在开发环境 内部,而是提供了一个专门为Visual C++设计的MSDN类库。MSDN 虽然是一个独立的帮助系统,但却能很好地和Visual C++6.0集成在一 起。 • MSDN的使用方式有以下几种: • 单击【Help】|【Contents】命令; • 单击【Help】|【Search】命令; • 单击【Help】|【Index】命令; • 按下【F2】键。 • 通过上述几种命令方式,即可运行MSDN。
1.2.1 工作区窗口和输出窗口
• Find in Files 1和Find in Files 2:两个选项卡的作用相同,用于显示 从多个文件中查找字符串的结果。当用户想要查看某个函数或变量出 现在哪些文件中,单击【Edit】|【Find in Files】命令,弹出【Find in Files】对话框,如下图所示。在【Find in Files】对话框中的 【Find what】后的编辑框中,输入想要查找的内容,单击【Find】按 钮即可。查找到的内容会输出到Find in Files选项卡中。
第1章 Visual C++集成开发环境
• Visual C++是一个功能强大的可视化应用程序开发工具。其凭借强大 功能,受大了广大程序员的欢迎。当今流行的Visual C++的开发工具 是6.0版本。下面来介绍Visual C++ 6.0的一些基本情况。
VCMFC中的CComboBox控件使用详解
VCMFC中的CComboBox控件使用详解VC/MFC中的CComboBox控件使用详解CComboBox控件详解CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down list).CComboBox控件的常用设置属性说明:type属性:里面一共有三个选项.就是其三种形式, 我们常用的是后两种形态,其区别就是Dropdown的编辑区为可编辑控件,而droplist 为静态控件.Data属性:当程序初始化的时候,下拉列表将显示其属性里面的内容,内容用分号分隔.其属性只支持后2中形式,Sort 属性:对添加到下拉列表框中的数据自动进行排序,如果你不想他改变你的显示序列,把他设置成False.控件是一个窗口.其基类是为CWnd.所以CComboBox也可以使用CWnd的一些函数,它自己的函数有30几种.我写了一个示范程序,演示了一些常用的函数,你可以参考其代码看到其功能.注:m_cbox 为CComboBox控件的关联变量,m_end为EDIT控件的关联变量1.GetCount() 函数:用以获得列表框中的选项数目. int GetCount() const;(此乃函数原型,我会列在每条的后面) 下面的例子是程序中各个按钮里面的代码int i;CString str;i=m_cbox.GetCount();str.Format ("%d",i);m_end="一共有"+str+"个数据";UpdateData(FALSE);2.GetCurSel() 函数:用以得到用户选中下拉列表框中数据的索引值.返回的值是重0开始的,如果没有选择任何选项将会返回-1 Int GetCurSel() constint i;CString str;i=m_cbox.GetCurSel ();str.Format ("%d",i+1);if (i==-1) m_end="你什么都没有选";else m_end="你选的是第"+str+"项";UpdateData(FALSE);3.SetCurSel函数:选取列表框中的一个选项,索引从0开始,-1为什么都不选.当你需要把列表框中已经选取的内容清空时就可以使用这个函数;if(m_i<3) m_cbox.SetCurSel (m_i++);//m_i为int型变量用以计数else {m_cbox.SetCurSel (-1);m_i=0;}4.SetEditSel函数:设置编辑区中蓝色选中字段的长度, BOOL SetEditSel( intnStartChar,int nEndChar ); nStartChar是起始的位置,当设置为-1时为不选择任何字段,nEndChar是结束位置.还有一个对应的函数GetEditSel是取得其位置,在此不详解.m_cbox.SetEditSel (3,5);//在编辑框中打入一串数字在按此按钮就能看到效果//其作用就是选中第3到第5个字符作为热点5.Clear() Cut() Paste() Copy() 这四个函数我放在一起说,因为他们都是针对编辑框中选定的文字进行编辑的函数,很多初学者很不明白这4个函数,使用这些函数没有作用,其实不然,这些函数对于在编辑框中的内容不进行处理,他真正处理的是你用鼠标选中的内容,对于Clear()函数很多书中解释都是有误的,很多书中对他的解释是清除当前选中的文本,我认为这样的解释是有歧异的,真正的解释是把你刚选中的文本释放掉,也就是不选,而不是把选中的删除,真正的删除选中的文本的函数是Cut(),Copy()是复制选中的文本,Paste()是粘贴到光标处.其演示就不写在程序中,有兴趣的朋友可以自己试试.6.LimitText()函数.其作用是限制在编辑框中键入的文本长度,BOOL LimitText(int nMaxChars); 当nMaxChars为0时,不是不能输入,而是长度最大化为65535字节7.GetLBText()函数.其原型为void GetLBText( int nIndex, CString&rString ).nIndex为列表框中数据的索引值,rString 为字符串,其作用就是把索引号为nIndex的数据放到rString变量中.与其对应的GetLBTextLen(intnIndex)函数就是得到索引号为nIndex中数据的长度m_cbox.GetLBT ext (2,m_end); // GetLBText按钮UpdateData(0);CString str; //GetLBTextLen按钮int i=m_cbox.GetLBTextLen (2);str.Format ("%d",i);m_end=str;UpdateData(FALSE);8.AddString() DeleteString() InsertString() ResetContent() 四个函数放在一起,他们都是针对下拉列表框的处理函数, AddString(LPCTSTR lpszString) 是在列表框的尾巴添加一条数据,参数为字符串. DeleteString(UINT nIndex)为删除指定索引为nIndex的数据. InsertString(int nIndex, LPCTSTR lpszString)在索引nIndex处插入IpszString的内容. ResetContent()是清除列表框中所有的内容.9.SetDroppedWidth(UINT nWidth) 函数.用于设定下拉列表框的最小宽度,当下拉列表框中的数据很长不能完全显示时,我们可以使用这个函数把列表框的宽度设置的大些.同样GetDroppedWidth()是返回列表框的宽度.以下为总结了各大论坛中对CCombBox控件使用的问题.并给出了正解.1.关于CComboBox在对话框中没有下拉项目的问题答: 资源编辑器中对话框中CComboBox组件的垂直范围拉大了下,就看见字体了,看到那个向下的黑箭头了吗,点他下拉,嘿嘿就这么简单.2.请问怎样能让CCombobox记住用户的输入.下次使用时还有答: 要记住用户的输入必须用到文件读写,或者把内容添加到注册表中,我会在以后给出解决办法.3. CCOMBOBOX如何使它只读,不能编辑答: 看了本文的介绍也许你现在知道了, CCOMBOBOX有三种类型的,选择你需要的吧!4. 我要让界面一显示,就能在Combo框中显示默认的数据答: 你要在OnInitDialog里面加上我上面所提到的SetCurSel()函数就行了.5. 如何把选好的内容赋给变量答: 先给CCOMBOBOX设置一个CString关联变量,再添加事件处理函数CBN_ Selchange.使用UpdateData(FALSE)就行了.6. 在CComboBox组合框中,条目的对齐方式是左对齐,能设置为对中或者右对齐吗?答: 没有直接的方法,你必须自己对齐, 比如最大长度是10int i;String.Format("%10d", i);CComboBox->AddStringVC combobox 使用大全 ---------------------------------------------------一、如何添加/删除Combo Box内容1. 在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。
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); //调用自定义的成员函数画圆 //调用自定义的成员函数画圆 }
【免费下载】VC MFC试题复习题及答案
5、下列语句的运行结果为( ) #include <iostream.h> srtuct COMPLEX { int x; int y; } cNum[2]={1,3,2,7}; void main() { cout<< cNum[0].y*cNum[1] x<<endl; }
A、3
B、2
6、类 AB 的缺省构造函数和析构函数是( )
C、类中的函数成员在类体之外定义时必须要与类声明在同一文件中
D、在类体之外定义的函数成员不能操作该类的私有数据成员
10、以下不属于成员函数的是( )
A、静态成员函数
C、构造函数
B、友元函数
D、析构函数
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根通保据过护生管高产线中工敷资艺设料高技试中术卷资,配料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高与中带资负料荷试下卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并3中试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内 纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。
vcmfc编程各种窗口句柄获取函数详解
AfxGetMainWndAfxGetMainWnd获取自身窗口句柄HWND hWnd = AfxGetMainWnd()->m_hWnd;GetT opWindow函数功能:该函数检查与特定父窗口相联的子窗口z序(Z序:垂直屏幕的方向,即叠放次序),并返回在z序顶部的子窗口的句柄。
函数原型:HWND GetT opWindow(HWND hWnd);参数:hWnd:被查序的父窗口的句柄。
如果该参数为NULL,函数返回Z序顶部的窗口句柄。
返回值:如果函数成功,返回值为在Z序顶部的子窗口句柄。
如果指定的窗口无子窗口,返回值为NULL。
GetForegroundWindow函数功能:该函数返回当前系统的前台窗口的窗口句柄。
函数原型:HWND GetForegroundWindow(VOID)返回值:函数返回前台窗回的句柄。
GetActiveWindow函数功能:该函数可以获得与调用该方法的线程的消息队列相关的活动窗口的窗口句柄(就是取得当前进程的活动窗口的窗口句柄)。
函数原型:HWND GetActiveWindow(VOID)返回值:返回值是与调用线程的消息队列相关的活动窗口的句柄。
否则,返回值为NULL。
GetSafeHwnd函数功能:获取某个窗口对象(CWnd的派生对象)指针的句柄(H WND)时,最安全的方法是使用GetSafeHwnd()函数。
通过下面的例子来看其理由:CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器HWND hwnd = pwnd->m_hwnd; //得到它的H WND这样的代码当开始得到的pwnd为空的时候就会出现一个“General protection error”,并关闭应用程序,因为一般不能对一个NULL指针访问其成员,如果用下面的代码:CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器HWND hwnd = pwnd->GetSafeHwnd(); //得到它的HWND就不会出现问题,因为尽管当pwnd是NULL时,GetSafeHwnd仍然可以用,只是返回NULLIsWindowVisible函数功能:该函数获得给定窗口的可视状态。
VC MFC列表框(CListBox)控件
列表框控件简单应用重复性的过程我就不详细讲明了,只给出类里面函数的解释。
int CListBox::AddString( LPCTSTR lpszItem );//添加一个项,lpszItem是项文本内容int CListBox::InsertString( int nIndex, LPCTSTR lpszItem );//同上,只不过这个可以指定项位置(索引),由参数nIndex指定int CListBox::GetCurSel( ) const;//获取当前选中项的索引,函数返回索引值int CListBox::GetText( int nIndex,CString &rString ) const;//根据索引获得项文本int CListBox::GetCount( ) const;//获取项数量void CListBox::ResetContent( );//删除列表框所有的项int CListBox::DeleteString( UINT nIndex );//根据项索引从列表框删除一个项int CListBox::SetItemHeight( int nIndex, UINT cyItemHeight );//设置一个项的高度,注意:列表框具有//LBS_OWNERDRAWVARIABLE风格才可以单独设置一个项的高度,否则是所有项的高度自绘列表框这里自绘要达到的效果,就是简单模仿一下QQ界面里类似列表框控件的那种效果,先往对话框里添加列表框控件.然后再改一下列表框的属性,所有者绘制项选择固定,有字符串前面打上勾.接着准备两张位图,一张用于列表框的背景,一张用于项选中时的背景,ID号分别为:IDB_BK、IDB_SELECTED如下两张位图:再导入五张位图(QQ头像),ID号保持默认不变。
从CListBox派生出子类CNewListBox,往CNewListBox添加一个函数,用于画位图,函数如下:void CNewListBox::DrawBK(CDC *pDC, CRect rect, UINT uIDBK){CDC memDC;memDC.CreateCompatibleDC(pDC);//兼容DCCBitmap bmp;bmp.LoadBitmap(uIDBK);//加载位图BITMAP bmpInfo;bmp.GetBitmap(&bmpInfo);//获取位图信息memDC.SelectObject(&bmp);//选入位图pDC->StretchBlt(rect.left,rect.top,rect.Width(),rect.Height(),&memDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);bmp.DeleteObject();memDC.DeleteDC();}然后给CNewListBox添加WM_ERASEBKGND消息处理函数,这个消息是系统擦除背景时产生。
VC、MFC各前辈学习方法及感受整理
VC精华教程MFC入门系列
第一章一个简单的MFC程序该文章为学习了C和C++以及有SDK编程基础的,但还未学习MFC的人员使用,我们开始使用一个基本的内容开始全部的代码如下:你只需将以上代码拷贝下来,在VC++6.0编译器,建一个Window32工程,使用MFC链接库编译即可。
具体步骤:打开VC++6.0,点击主菜单File(文件)-〉New(新建)弹出一个对话框,我们选择win32 Application(win32应用程序),在工程文本框给它起一个名字MyMFC,点击确定。
在确认信息的对话框里选择空工程an empty project点确定。
这样我们就建了一个win32应用程序这样一个类型的工程。
下面我们在这个工程里建一个C++文件。
点击菜单File(文件)-〉New(新建)弹出一个对话框,选择C++ source文件(C++源文件),在文件文本框里给它起个名字MyMFC,点击确定,这时我们将上面的代码拷入,编译链接。
你会发现有3个错误。
nafxcwd.lib(thrdcore.obj):error LNK2001:unresolved external symbol_endthreadexnafxcwd.lib(thrdcore.obj):error LNK2001:unresolved external symbol_beginthreadexDebug/MyMFC.exe:fatal error LNK1120:2 unresolved externals那么,这是因为没有使用MFC类库。
我们现在导入,点击菜单(project)工程-〉setting设置,弹出一个对话框,有一个下拉列表框,里面是Not Using MFC,我们把她改为Using MFC in a Static Library,点击确定,再编译,运行,那么有这样一个窗体出现。
下面是该程序的解释。
在以上的程序中,只使用了两个类CFrameWnd和CWinApp,我们先看第一个类:第一个类sample继承了CFrameWnd类,CFrame类是MFC类库中的一个类,用它来代表窗体框架,我们先用sample类继承它,在构造函数调用了Create这个函数,在运行Create这个函数时调用的是CFrameWnd类中的函数,是MFC写好的函数,CFrameWnd中封装了CreateWindow这个API函数为它的成员函数Create(),它们的参数都是相似的。
VC MFC 删除文件,目录,文件夹
}
清空整个文件夹的内容(包括子文件夹),但保留该文件夹
void CRelCtrlDlg::DeleteDirectory(char* sDirName) { char sPath[200]; strcpy(sPath, sDirName);
CFileFind ff; BOOL bFound; char sTempFileFind[200]; strcpy(sTempFileFind, sPath); strcat(sTempFileFind, “\\*.*”);
bFound = ff.FindFile(sTempFileFind);
while(bFound) { bFound = ff.FindNextFile(); CString sFilePath =ቤተ መጻሕፍቲ ባይዱff.GetFilePath();
bool DeleteDirectory(char* sDirName) {
CFileFind tempFind; char sTempFileFind[200]; strcpy(sTempFileFind, sDirName); strcat(sTempFileFind, “\\*.*”);
BOOL IsFinded = tempFind.FindFile(sTempFileFind); while (IsFinded) { IsFinded = tempFind.FindNextFile();
if(ff.IsDirectory()) { if(!ff.IsDots())
VC++MFC基础教程
dcb.Parity=NOPARITY; //无奇偶校验位 dcb.StopBits=TWOSTOPBITS; //两个停止位 SetCommState(hCom,&dcb);
m_cComm.put_OutBufferSize(512); //设置输出缓冲区 m_cComm.put_Settings(TEXT("9600,n,8,1"));//波特率,无校验,个数
据位,个停止位
if(!m_cComm.get_PortOpen())
{
m_cComm.put_PortOpen(TRUE); //打开串口
B)修改控件属性
修改上面的示例编辑框属性: ID——IDC_EDIT_RECV;
Multiline——True; Want Return——True; Vertical Scroll——True; Auto VScroll——True;
修改下面的示例编辑框属性: ID——IDC_EDIT_SEND; Multiline——True; Vertical Scroll——True;
1.3、API 串口编程
按照步骤一新建 Serial 工程,这里不赘述了。
A)添加 API 串口初始化代码
1、在 SerialDlg.cpp 文件中添加全局变量:
HANDLE hCom; //全局变量,串口句柄 // CSerialDlg 对话框
2、在 SerialDlg.cpp 文件中的 OnInitDialog()函数添加如下代码:
AfxMessageBox("写串口失败!"); }
使用VC6编写一个计算器MFC
使用VC6编写一个计算器MFC回答如下:要使用VC6编写一个计算器MFC应用程序,首先需要创建一个新的MFC项目。
在VC6中,选择“创建一个新的工程”,然后选择“MFC应用程序”,并命名该项目为“Calculator”。
接下来,在“CalculatorDlg.h”文件中,可以编写计算器对话框类的代码。
在该类中,需要声明所有添加到对话框中的控件的成员变量。
例如,可以声明一个`CEdit`类型的指针变量来引用屏幕上的文本框控件。
此外,还可以声明其他成员变量来存储计算器的状态和当前操作数的值。
然后,在“CalculatorDlg.cpp”文件中,可以实现计算器对话框类的代码。
在该文件中,需要实现对话框的初始化、按钮单击事件的处理等功能。
例如,可以在对话框的`OnInitDialog`函数中初始化计算器的状态,并将其他控件的消息映射到对应的成员函数上。
然后,在对应的成员函数中,可以编写相应的代码来处理按钮单击事件,进行计算,并将结果显示在屏幕上。
在编写计算器的核心功能时,可以使用`+`、`-`、`*`和`/`等运算符来实现加法、减法、乘法和除法。
此外,还可以添加其他功能,如取余、开方等。
为了实现这些功能,可以在对话框类中添加成员函数,然后在相应的按钮单击事件中调用这些函数。
最后,在项目的构建选项中,将“字符集”设置为“使用Unicode字符集”,以支持使用中文。
然后,编译并运行该项目,就可以看到一个MFC计算器应用程序在屏幕上显示出来。
总结起来,在VC6中编写一个计算器MFC应用程序需要完成以下步骤:1.创建新的MFC项目,并添加所需的控件。
2.在对话框类中声明和实现计算器界面的成员变量和函数。
3.在对应的按钮单击事件处理函数中编写计算器的核心功能。
4. 在项目的构建选项中设置字符集为Unicode字符集。
5.编译并运行项目,测试计算器应用程序。
以上是一个简单的使用VC6编写一个计算器MFC的步骤。
当然,具体的实现还有很多细节需要注意和完成,如错误处理、界面美化等。
三维GIS开发工具VC-MFC在Windows应用程序中的封装
信 息科学 Jj l
三维 G s I 开发工具 VC MF - C在 Wid ws n o 应用程序中的封装
徐 磊
( 浙江师范大学旅 游与资源管理学院。 浙江 金 华 3 10 பைடு நூலகம் 2 0 4
摘 要: 微软 的 MF Mirsf F I】 o 是一套面向对象的应 用程序框架, C( coot ol出d n da l 它封装 了 Wi3 DK 中的 AP 接 口。vc+ n2S I +及 MF C是进
行三维 GS I开发的重要 工具 。以一个基于 MF C的单文档应 用程序 为例, 剖析 MF C的封装过程 , 点是程序 的初 始化和窗 口 建, 重 创 显示, 更新过程 中的封 装细节, 为读者揭示 MF C的封装机制。
关键词 : C; MF 封装 ; n 2A I应用程序框架 Wi P ; 3
1 概述 下 文件 WI MA NC P: N I .P ) cs hl om n 函数内部, e SeCm ad s l 可以看到其中有如 m X P x n i H N T n B NT M C F 是微软公司提供的一整套应用程序框 i AF A IAfWiMan {I S ANCE hl蛐 c HI S ANCE 下代码( M C 参见 F 源文件 A P ICD: P UZ P h Pmrn tn e ls e, a B O C n px r esh l o m n CC m n Ln l o O L W/ lPc s e C m a d A : m S [ o mad i n & ef 架, 它利用 c + + 语言全面封装 了微软的 Wi o s n w d L I T l m Ln, a n md hw P S R p d i ̄ h C S o) C t d AI P 接口, 在开发 Wi
VCMFC之ListCtrl控件使用经验总结
VCMFC之ListCtrl控件使用经验总结本文将从创建ListCtrl控件、数据的插入、删除和修改、列表项的选择和排序等方面,总结一些经验和注意事项。
一、创建ListCtrl控件创建ListCtrl控件的方法有很多,下面介绍两种常用的方法。
2. 动态创建ListCtrl控件:可以通过CListCtrl类的Create函数来动态创建ListCtrl控件。
例如:```cppCListCtrl m_listCtrl;m_listCtrl.Create(WS_CHILD , WS_VISIBLE , LVS_REPORT, CRect(0, 0, 500, 300), this, IDC_LIST_CTRL);```此外,还可以通过控件向导创建ListCtrl控件,控件向导在创建ListCtrl控件时会生成相关的代码。
二、数据的插入、删除和修改1.插入数据:可以使用InsertItem函数向ListCtrl控件中插入新的项。
例如:```cppm_listCtrl.InsertItem(0, _T("Item 1"));2.删除数据:可以使用DeleteItem函数删除ListCtrl控件中的其中一项。
例如:```cppm_listCtrl.DeleteItem(0);```3.修改数据:可以通过SetItemText函数修改ListCtrl控件中其中一项的文字。
例如:```cppm_listCtrl.SetItemText(0, 1, _T("Modified Item"));```三、列表项的选择和排序1.列表项的选择:可以使用GetNextItem函数和SetItemState函数来获取和设置ListCtrl控件中的选中项。
例如:```cppint nItem = m_listCtrl.GetNextItem(-1, LVNI_SELECTED);m_listCtrl.SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED);2.列表项的排序:可以使用SortItems函数对ListCtrl控件中的数据进行排序。
Visual_C++MFC入门教程(经典版)
Visual C++MFC入门教程目录+-- 第一章 VC入门|------ 1.1 如何学好VC|------ 1.2 理解Windows消息机制|------ 1.3 利用Visual C++/MFC开发Windows程序的优势|------ 1.4 利用MFC进行开发的通用方法介绍|------ 1.5 MFC中常用类,宏,函数介绍+-- 第二章图形输出|------ 2.1 和GUI有关的各种对象|------ 2.2 在窗口中输出文字|------ 2.3 使用点,刷子,笔进行绘图|------ 2.4 在窗口中绘制设备相关位图,图标,设备无关位图|------ 2.5 使用各种映射方式|------ 2.6 多边形和剪贴区域+-- 第三章文档视结构|------ 3.1 文档视图框架窗口间的关系和消息传送规律|------ 3.2 接收用户输入|------ 3.3 使用菜单|------ 3.4 文档,视,框架之间相互作用|------ 3.5 利用序列化进行文件读写|------ 3.6 MFC中所提供的各种视类介绍+-- 第四章窗口控件|------ 4.1 Button|------ 4.2 Static Box|------ 4.3 Edit Box|------ 4.4 Scroll Bar|------ 4.5 List Box/Check List Box|------ 4.6 Combo Box/Combo Box Ex|------ 4.7 Tree Ctrl|------ 4.8 List Ctrl|------ 4.9 Tab Ctrl|------ 4.A Tool Bar|------ 4.B Status Bar|------ 4.C Dialog Bar|------ 4.D 利用AppWizard创建并使用ToolBar StatusBar Dialog Bar |------ 4.E General Window|------ 4.F 关于WM_NOTIFY的使用方法+-- 第五章对话框|------ 5.1 使用资源编辑器编辑对话框|------ 5.2 创建有模式对话框|------ 5.3 创建无模式对话框|------ 5.4 在对话框中进行消息映射|------ 5.5 在对话框中进行数据交换和数据检查|------ 5.6 使用属性对话框|------ 5.7 使用通用对话框|------ 5.8 建立以对话框为基础的应用|------ 5.9 使用对话框作为子窗口+-- 第六章网络通信开发|------ 6.1 WinSock介绍|------ 6.2 利用WinSock进行无连接的通信+------ 6.3 利用WinSock建立有连接的通信《Visual C++开发指南》闻怡洋/文1.1 如何学好VC这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。
VC MFC简明教程
本文由jhsloi贡献 pdf1。
Visual C++ MFC 简明教程 原著:Marshall Brain 编译:张圣华 第一部分:MFC 导论 Visual C++ 不仅仅是一个编译器。
它是一个全面的应用程序开发环境,使用它你充分 利用具有面向对象特性的 C++ 来开发出专业级的 Windows 应用程序。
为了能充分利用这 些特性,你必须理解 C++ 程序设计语言。
掌握了 C++,你就必须掌握 Microsoft 基本类库 (MFC) 的层次结构。
该层次 结构包容了 Windows API 中的用户界面部分,并使你能够很 容易地以面向对象的方式建立 Windows 应用程序。
这种层次结构适用于所有版本的 Windows 并彼此兼容。
你用 MFC 所建立的代码是完全可移植的。
该教程将向你介绍 MFC 的基本概念和术语以及事件驱动程序设计方法。
在本节中,你 将会输入、编译和运行一个简单的 MFC 程序。
下一节中将向你详细解释这些代码。
第三部 分讨论了 MFC 控制和如何定制它们。
第四部分将介绍消息映射,你将会处理 MFC 的事件。
什么是 MFC? 如果你要建立一个 Windows 应用程序,应该如何下手? 好的开端是从设计用户界面开始。
首先, 你要决定什么样的用户能使用该程序并根据需 要来设置相应的用户界面对象。
Windows 用户界面有一些标准的控制,如按钮、菜单、滚 动条和列表等,这对那些 Windows 用户已经是很熟悉了。
要记住的是,作为程序员必须 选择一组控制并决定如何把它们安排到屏幕上。
传统上, 你需要在纸上做一下用户界面的草 图,直到对各元素感到满意为止。
这对于一些比较小的项目,以及一些大项目的早期原型阶 段是可以的。
下一步, 是要实现代码。
为任何 Windows 平台建立应用程序时, 程序员都有两种选择: C 或 C++。
使用 C,程序员是在 Windows 应用程序界面 ( API ) 的水平上编写代码。
vc和MFC的详细历史
本文由jbmdesmond贡献 doc1。
Visual C++ 1.0:C++编译器的终结者 唯技术”思想有时能使陷入一种困境,作为一种编程工具(也可以认为是一种技术),Visual C++经历了许多 风波和变革,但纵观目前几乎所以有书籍和文章,很少对这种技术进行“跳出圈外”的思考,这也使我写这 篇文章感到无源的苦恼。
细想之后,也颇为感慨,愿借此文以激众家之思! Visual C++的发展与 C/C++语言、Windows 的历程是分不开的。
在 C 语言推出之前,操作系统等系统软件主要是用汇编语言编写的(如 UNIX 操作系统)。
由于汇编语 言依赖于计算机硬件,因此程序的可移植性和可读性就比较差。
为了提高程序的可读性和可移植性,并能 实现汇编语言的某些功能(如汇编语言可以直接对硬件进行操作、对内存地址进行操作和位操作等)。
于是, C 语言便应运而生了。
最初的 C 语言只是为描述和实现 UNIX 操作系统而提供的一种程序设计语言。
1973 年, 贝尔实验室的 K.Thompson 和 D.M.Ritchie 两人合作把 UNIX 的 90%以上的代码用 C 语言改写(即 UNIX 第五版)。
后来 C 语言又作了多次改进,1978 年以后,C 语言已先后移植到大、中、小及微型机上,现在 C 语言已成为风 靡全球的计算机程序设计语言。
到了 80 年代,美国 AT&T 贝尔实验室的 Bjarne Stroustrup 在 C 语言的基础上推出了 C++程序设计语 言。
由于 C++提出了把数据和在数据之上的操作封装在一起的类、对象和方法的机制,并通过派生、继承、 重载和多态性等特征,实现了人们期待已久的软件复用和自动生成。
这使得软件,特别是大型复杂软件的 构造和维护变得更加有效和容易,并使软件开发能更自然地反映事物的本质,从而大大提高了软件的开发 效率和质量。
在 C/C++发展过程中,C/C++的开发工具也是发展迅速。
VCMFC单选框用法(RadioButtonControl)
VCMFC单选框⽤法(RadioButtonControl)先为对话框加上2个radio button,分别是Radio1和Radio2。
问题1:如何让Radio1或者Radio2默认选上?如何知道哪个被选上了?关键是选上,“默认”只要放在OnInitDialog()即可。
三种⽅法可以让它选上,第⼀种:((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//不选上((CButton *)GetDlgItem(IDC_RADIO1))->GetCheck();返回1表⽰选上,0表⽰没选上第⼆种:关联⼀个congtrol型变量(⼦类化),好ctrl+W(即打开classwizard),点开 Member Variables,咦?怎么没有IDC_RADIO1这个ID?原来是没有分组。
因为radio button通常都是成组使⽤的,在⼀组⾥⾯是互斥的。
取消,回到对话框资源⾯板,右键Radio1查看属性把Group选上,那么,Radio1和 Radio2就是⼀组了(怎么知道他们是⼀组的?后⾯说)。
此时,就可以为Radio1增加⼀congtrol型变量m_ctrlRadio1了。
如下:m_ctrlRadio1.SetCheck(TRUE);同样可以使⽤GetCheck()获取状态。
第三种:关联⼀个int型变量(同样需要先分组)m_nRadio1,打开对话框构造函数,你会发现有:m_nRadio1 = -1;m_nRadio1别赋值-1表⽰哪个都没有选上。
如果你把-1改成0,就会发现Radio1默认被选上了,依此类推,m_nRadio1的值为1 就是第⼆个被选上了(这⾥同样有问题,哪个是第⼀个?哪个是第⼆个?)。
获取状态很简单,UpdateData(TRUE)后判断m_nRadio1的值即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2011/7/11
7
Microsoft 也提供了 C++ 库,它位于任何 Windows API 之上,能够使程序员的工作更容易。 它就是Microsoft基本类库 (MFC),该库的主要优 点是效率高。它减少了大量在建立 Windows 程序 时必须编写的代码。同时它还提供了所有一般 C++ 编程的优点,例如继承和封装。MFC 是可移植的, 例如,在 Windows 3.1下编写的代码可以很容易地 移植到 Windows NT 或 Windows 95 上。因此, MFC 是很值得推荐的开发Windows 应用程序的方法 ,在本章自始至终使用的都是 MFC。
2011/7/11 4
本章将向你介绍MFC的基本概念和术语以及 事件驱动程序设计方法。在本节中,你将会输入 、编译和运行一个简单的MFC程序。下一节中将 向你详细解释这些代码。第三部分讨论了MFC控 制和如何定制它们。第四部分将介绍消息映射, 你将会处理MFC的事件。
2011/7/11
5Leabharlann 什么是MFC? 什么是MFC? 如果你要建立一个 Windows 应用程序,应该如 何下手? 好的开端是从设计用户界面开始。首先,你要 决定什么样的用户能使用该程序并根据需要来设置 相应的用户界面对象。Windows 用户界面有一些标 准的控制,如按钮、菜单、滚动条和列表等,这对 那些 Windows 用户已经是很熟悉了。 要记住的是 ,作为程序员必须选择一组控制并决定如何把它们 安排到屏幕上。传统上,你需要在纸上做一下用户 界面的草图,直到对各元素感到满意为止。这对于 一些比较小的项目,以及一些大项目的早期原型阶 段是可以的。
2011/7/11 16
如果你从未做过事件驱动程序设计,则所有 这些对你来说可能是很陌生的。但是,事件驱动程 序设计方式是很容易理解的。具体的细节对不同的 系统可能有些不同,但是其基本概念是类似的。在 一个事件驱动界面中,应用程序会在屏幕上绘制几 个界面对象,如按钮、文本区和菜单。应用程序通 常通过一段称为事件循环的的代码来响应用户的操 作。用户可以使用鼠标或键盘来任意操作屏幕上的 对象。例如,用户用鼠标单击一个按钮。用鼠标单 击就称为一个事件。事件驱动系统把用户的动作如 鼠标单击和键盘操作定义为事件,也把系统操作如 更新屏幕定义为事件。
2011/7/11 9
Windows词汇 Windows词汇 在 Windows 用户界面和软件开发中所要用到的 词汇都是基本和唯一的。对于新接触该环境的用户 ,下面复习几个定义以便使我们的讨论更加容易。 Windows应用程序使用几个标准的控制: • 静态文本标签 • 按钮 • 列表框 • 组合框(一种更高级的列表框) • 单选按钮 • 检查按钮 • 编辑框(单行和多行) • 滚动条
2011/7/11
8
当是使用 MFC 时,你编写的代码是用来建立 必要的用户界面控制并定制其外观。同时你还要编 写用来响应用户操作这些控制的代码。例如,如果 用户单击一个按钮时,你应该有代码来响应。这就 是事件驱动代码,它构成了所有应用程序。一旦应 用程序正确的响应了所有允许的控制,它的任务也 就完成了。 你可以看出,使用 MFC 进行 Windows 编程时是 一件比较容易的的过程。本章的目的是比较详细地 教你如何快速建立专业级的应用程序的技术。 Visual C++ 应用程序开发环境特别适合于使用 MFC (也有其它开发环境使用MFC),所以一起学习 MFC 和 Visual C++ 能够增强你的开发程序的能力 。
2011/7/11 19
例子 理解一个典型的 MFC 程序的结构和样式的最好 方法是输入一段小程序,然后编译和运行它。下面 的程序是一段简单的“hello world”程序。这对很 多C程序员都是很熟悉了,让我们看一下如何用MFC 方法来实现。如果你是第一次看到这类程序,也许 比较难理解。这没关系,我们后面会详细介绍。现 在你只要用Visual C++ 环境中建立、编译和运行 它就可以了。
2011/7/11 12
你所建立的每一个应用程序都会使用它自己 的一套控制、菜单结构以及对话框。应用程序界面 的好坏取决于你如何选择和组织这些界面对象。 Visual C++ 中的资源编辑器可以使你能容易的建 立和定制这些界面对象。
2011/7/11
13
事件驱动软件和词汇 所有基于窗口的 GUI 都包含相同的基本元素, 它们的操作方式都是相同的。在屏幕上,用户所看 到的是一组窗口,每个窗口都包含有控制、图标、 对象以及一些处理鼠标和键盘的元素。从用户角度 来看,各系统的界面对象都是相同的:按钮、滚动 条、图标、对话框以及下拉菜单等等。尽管这些界 面元素的“外观和感觉”可能有些不同,但这些界 面对象的工作方式都是相同的。例如,滚动条对于 Windows和Macintosh可能有些不同,但他们的作用 完全是一样的。
2011/7/11 14
从程序员的角度来看,这些系统在概念上是 相似的,尽管它们可能有很大的不同。为了建立 GUI 程序,程序员第一步要把所有需要的用户界面 控制都放到窗口上。例如,如果程序员要建立一个 从摄氏到华氏的转换的简单程序,则程序员要选择 用户界面对象来完成并在屏幕上把结果显示出来。 在这个简单的程序中,程序员可能需要用户在一个 可编辑的编辑框中输入温度值,在一个不可编辑的 编辑框中显示转换结果,然后让用户可以单击一个 标有“退出”的按钮来退出应用程序。
2011/7/11
20
//hello.cpp #include <afxwin.h> // 说明应用程序类 class CHelloApp : public CWinApp { public: virtual BOOL InitInstance(); }; // 建立应用程序类的实例 CHelloApp HelloApp; // 说明主窗口类 class CHelloWindow : public CFrameWnd { CStatic* cs; public: CHelloWindow(); };
2011/7/11 21
// 每当应用程序首次执行时都要调用的初始化函数 BOOL CHelloApp::InitInstance() { m_pMainWnd = new CHelloWindow(); m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd>UpdateWindow(); return TRUE; } // 窗口类的构造函数 CHelloWindow::CHelloWindow() { // 建立窗口本身 Create(NULL, "Hello World!", WS_OVERLAPPEDWINDOW, CRect(0,0,200,200)); // 建立静态标签 cs = new CStatic(); cs->Create("hello world", WS_CHILD|WS_VISIBLE|SS_CENTER, CRect(50,80,150,150), this); }
2011/7/11 6
下一步,是要实现代码。为任何 Windows 平台建立应用程序时,程序员都有两种选择:C 或 C++。 使用 C,程序员是在 Windows 应用程 序界面 ( API ) 的水平上编写代码。该界面是由 几百个 C 函数所组成,这些函数在Windows API 参考手册中都有介绍。对于Windows NT, API 被 称为 “Win32 API”,以区别于其用于Windows 3.1的16位 API。
2011/7/11 10
你可以通过代码或“资源编辑器”来建立这 些控制,在资源编辑器中可以建立对话框和这些控 制。在本章中,我们将使用代码来建立它们。 Windows支持几种类型的应用程序窗口。一个典 型的应用程序应该活动在称为“框架窗口”中。一 个框架窗口是一个全功能的主窗口,用户可以改变 尺寸、最小化、最大化等。Windows也支持两种类 型的对话框:模式和无模式对话框。模式对话框一 旦出现在屏幕上,只有当它退出时,屏幕上该应用 程序的其余部分才能响应。无模式对话框出现在屏 幕上时,程序的其余部分也可以作出响应,它就象 浮动在上面一样。
2011/7/11 3
第一部分
MFC导论 MFC导论
Visual C++ 不仅仅是一个编译器。它是一个全面的 应用程序开发环境,使用它你充分利用具有面向对象特 性的 C++ 来开发出专业级的 Windows 应用程序。为了 能充分利用这些特性,你必须理解 C++ 程序设计语言 。掌握了C++,你就必须掌握 Microsoft 基本类库 (MFC) 的层次结构。该层次 结构包容了 Windows API 中的用户界面部分,并使你能够很容易地以面向对象的 方式建立 Windows 应用程序。这种层次结构适用于所 有版本的 Windows 并彼此兼容。你用 MFC 所建立的代 码是完全可移植的。
2011/7/11
18
幸运的是,你可以用比较高级的方法来进行 编程,这就是使用MFC。在MFC中,几乎所有的低 级的细节处理都为你代办了。如果你把某一用户 界面对象放在屏幕上,你只需要两行代码来建立 它。如果用户单击一个按钮,则按钮自己会完成 一切必要的操作,从更新屏幕上的外观到调用你 程序中的预处理函数。该函数包含有对该按钮作 出相应操作的代码。MFC 为你处理所有的细节: 你建立按钮并告知它特定的处理函数,则当它被 按下时,它就会调用相应的函数。第四部分介绍 了怎样使用消息映射来处理事件。
2011/7/11 2
•第一部分 •第二部分 •第三部分 •第四部分
MFC导论 一个简单的MFC程序 MFC 样式 消息映射
• 本章不是教你如何使用 Visual C++ 编程环境的, 只是教你 MFC 编程的概念和方法。 • 使用环境是Visual C++ 6.0,Windows 95 或 WidnowsNT 4.0以上。