MFC-67个技巧

合集下载

MFC文件操作大全

MFC文件操作大全

1.创建文件夹CreateDirectory(%%1,NULL);2.创建文件CFile f ile;file.Open(%%1,CFile::modeCreate|CFile::modeWrite);3.删除文件DeleteFile(%%1);4.删除文件夹RemoveDirectory(%%1);5.删除一个目录下所有的文件夹CFileFind f inder;BOOL b Working =f inder.FindFile(%%1+"\\*.*"); while (bWorking){bWorking =f inder.FindNextFile();if (finder.IsDirectory()){dir.Delete(finder.GetFilePath());}}6.清空文件夹RemoveDirectory(%%1);CreateDirectory(%%1,NULL)7.读取文件char s Read[1024];CFile m File(_T(%%1),CFile::modeRead);while (sRead!=null){mFile.Read(sRead,1024);CString %%2=CString(sRead);%%3}e lse {//找不到下一个文件r eturn;}}}FindClose(hSearch);14.复制一个文件夹下所有的文件夹到另一个文件夹下WIN32_FIND_DATA F ileData;HANDLE h Search;DWORD d wAttrs;char s zDirPath[] =%%2;char s zNewPath[MAX_PATH];char s zHome[MAX_PATH];BOOL f Finished =F ALSE;if (!CreateDirectory(szDirPath,NULL)){//不能创建新的目录return;}BOOL b Working =f inder.FindFile(%%1+"\\*.*");while (bWorking){bWorking =f inder.FindNextFile();if(finder.IsDirectory()){hSearch =F indFirstFile(finder.GetFilePath()+"\\*.*", &FileData); if (hSearch == I NVALID_HANDLE_VALUE){return;}while (!fFinished){lstrcpy(szNewPath, s zDirPath);lstrcat(szNewPath, F ileData.cFileName);if (CopyFile(FileData.cFileName, s zNewPath, F ALSE)){dwAttrs =G etFileAttributes(FileData.cFileName);DWORD d wAttrs;char s zDirPath[] =%%2;char s zNewPath[MAX_PATH];char s zHome[MAX_PATH];BOOL f Finished =F ALSE;if (!CreateDirectory(szDirPath, N ULL)){//不能创建新的目录return;}hSearch =F indFirstFile(%%1+"\\*.*", &FileData);if (hSearch == I NVALID_HANDLE_VALUE){return;}while (!fFinished){lstrcpy(szNewPath, s zDirPath);lstrcat(szNewPath, F ileData.cFileName);if (CopyFile(FileData.cFileName, s zNewPath, F ALSE)) {dwAttrs =G etFileAttributes(FileData.cFileName);if (!(dwAttrs &F ILE_ATTRIBUTE_READONLY)) {SetFileAttributes(szNewPath,dwAttrs |F ILE_ATTRIBUTE_READONLY);}}else{//不能复制文件return;}if (!FindNextFile(hSearch, &FileData)){if (GetLastError() == E RROR_NO_MORE_FILES) {//遍历文件夹完成return;}while (!fFinished){lstrcpy(szNewPath, s zDirPath);lstrcat(szNewPath, F ileData.cFileName);if (CopyFile(FileData.cFileName, s zNewPath, F ALSE)) {dwAttrs =G etFileAttributes(FileData.cFileName);if (!(dwAttrs &F ILE_ATTRIBUTE_READONLY)) {SetFileAttributes(szNewPath,dwAttrs |F ILE_ATTRIBUTE_READONLY);}}else{//不能复制文件return;}if (!FindNextFile(hSearch, &FileData)){if (GetLastError() == E RROR_NO_MORE_FILES) {//遍历文件夹完成fFinished =T RUE;}else{//找不到下一个文件return;}}}FindClose(hSearch);RemoveDirectory(finder.GetFilePath().GetBuffer(0)); }17.以一个文件夹的框架在另一个目录创建文件夹和空文件WIN32_FIND_DATA F ileData;HANDLE h Search;DWORD d wAttrs;char s zDirPath[] =%%2;char s zNewPath[MAX_PATH];char s zHome[MAX_PATH];BOOL f Finished =F ALSE;if (!CreateDirectory(szDirPath, N ULL)){//不能创建新的目录return;}hSearch =F indFirstFile(%%1+"\\*.*", &FileData);if (hSearch == I NVALID_HANDLE_VALUE){return;}while (!fFinished){lstrcpy(szNewPath, s zDirPath);lstrcat(szNewPath, F ileData.cFileName);HANDLE h File=CreateFileHandle h File=CreateFile(szNewPath,GENERIC_REA D,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORM AL|FILE_FLAG_SEQUENTIAL_SCAN,NULL);if(!hFile){//不能创建文件return;}if (!FindNextFile(hSearch, &FileData)){if (GetLastError() == E RROR_NO_MORE_FILES){//遍历文件夹完成fFinished =T RUE;targetfile=%%2+"//"+targetfile/;CopyFile(sourcefile.GetBuffer(0),targetfile.GetBuffer(0),true); }}}20.提取扩展名//#include <string>using s td::string;string s(%%1);size_t i=s.rfind('.',s.length());if(i!=string::npos)CString %%2(s.substr(i+1,s.length()-i));elseCString %%2="";21.提取文件名//#include <string>using s td::string;string s(%%1);char s ep='/';#ifdef _WIN32sep='\\';#endifsize_t i=s.rfind(sep,s.length());if(i!=string::npos)CString %%2(s.substr(i+1,s.length()-i));elseCString %%2="";/*CString p ath(%%1);CString %%2=path.Mid(path.ReverseFind('\\')+1);*/22.提取文件路径//#include <string>using s td::string;string s(%%1);using n amespace b oost::filesystem;try {path p1=complete(path(%%2,native),path(%%1,native));path p2=system_complete(path(%%2,native));CString %%3(p3);}catch(exception& e){//e.what();}25.移动文件MoveFile(%%1,%%2);26.移动一个文件夹下所有文件到另一个目录//#include <string>using s td::string;char s ep='/';#ifdef _WIN32sep='\\';#endifCFileFind f inder;BOOL b Working =f inder.FindFile(%%1+"\\*.*");while (bWorking){bWorking =f inder.FindNextFile();if(!finder.IsDirectory() || f inder.IsDots()){string s(finder.GetFileName());CString s ourcefile(%%1);if(s.rfind(sep,s.length())!=string::npos){sourcefile=sourcefile+"//"+s.substr(i+1,s.length()-i);CString t argetfile(s.substr(i+1,s.length()-i));targetfile=%%2+"//"+targetfile/;MoveFile(sourcefile.GetBuffer(0),targetfile.GetBuffer(0),true); }}}#ifdef _WIN32sep='\\';#endifsize_t s z=s.rfind(sep,s.length());if(sz!=string::npos){CFile O ut;CString s trFilename(s.substr(i+1,s.length()-i));if(Out.Open(%%2+"//"+strfilename,cfile::modewrite%7ccfile::modecreate)){ for(int i=1;i<=2;i++){String F ilename=%%%2+"//"+strfilename+atoi(i);CFile I n;if(In.Open(Filename,CFile::modeRead)){char c bBuffer[4096];int n Filesize=In.GetLength();while(nFilesize>0){int n Size=sizeof(cbBuffer);if(nSize>nFilesize)nSize=nFilesize;try{In.Read(cbBuffer,nSize);}catch(CFileException *e){char *lpMsgBuf;if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM,NULL,e->m_lOsError,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPSTR)&lpMsgBuf,0,NULL)>0){AfxMessageBox(lpMsgBuf);LocalFree(lpMsgBuf);}e->Delete();return;}using s td::string;string s(%%1);char s ep='/';#ifdef _WIN32sep='\\';#endifsize_t s z=s.rfind(sep,s.length());if(sz!=string::npos){CFile O ut,In;int n FIlesize;char *lpMsgBuf;CString s trFilename(s.substr(i+1,s.length()-i));if(!in.Open(%%1,CFile::modeRead)){//不能打开输入文件return;}if(!Out.Open(%%2+"//enc_%22+strfilename,cfile::modewrite/ |C File::modeCrea te)){//不能打开输出文件return;}nFilesize=In.GetLength();lpBuffer=new c har[nFilesize];if(lpBuffer==NULL){//不能分配复制缓存return;}CFileStatus r Status;In.GetStatus(%%1,rStatus);try{In.Read(cbBuffer,nFilesize);}catch(CFileException *e){char *lpMsgBuf;if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM,NULL,e->m_lOsError,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPSTR)&lpMsgBuf,0,NULL)>0){ AfxMessageBox(lpMsgBuf);LocalFree(lpMsgBuf);}e->Delete();return;}for(int i=0;i<nFilesize;i++){int i bt=lpBuffer[i];ibt+=100;ibt%=256;bpBuffer[i]=(char)ibt;}try{Out.Write(cbBuffer,nFilesize);}catch(CFileException *e){char *lpMsgBuf;if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,NULL,e->m_lOsError,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPSTR)&lpMsgBuf,0,NULL)>0){ AfxMessageBox(lpMsgBuf);LocalFree(lpMsgBuf);}e->Delete();return;}Out.Close();//In.Close();CFile::SetStatus(%%2+"//enc_%22+strfilename,rstatus);d elete[] l pBuffer;}32.文件简单解密//#include <string>using s td::string;string s(%%1);char s ep='/';#ifdef _WIN32sep='\\';#endifsize_t s z=s.rfind(sep,s.length());if(sz!=string::npos){CFile O ut,In;int n FIlesize;char *lpMsgBuf;CString s trFilename(s.substr(i+1,s.length()-i));if(!in.Open(%%2+"//enc_%22+strfilename,cfile::moderead)){ //不能打开输入文件return;}if(!Out.Open(%%1,CFile::modeWrite |C File::modeCreate)){ //不能打开输出文件return;}nFilesize=In.GetLength();lpBuffer=new c har[nFilesize];if(lpBuffer==NULL){//不能分配复制缓存return;}CFileStatus r Status;In.GetStatus(%%2+"//enc_%22+strfilename,rstatus);t ry{In.Read(cbBuffer,nFilesize);}catch(CFileException *e){char *lpMsgBuf;if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |F ORMAT_MESSAGE_FROM _SYSTEM,NULL,e->m_lOsError,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPSTR)&lpMsgBuf,0,NULL)>0){AfxMessageBox(lpMsgBuf);LocalFree(lpMsgBuf);}e->Delete();return;}for(int i=0;i<nFilesize;i++){int i bt=lpBuffer[i];ibt-=100;ibt+=256;ibt%=256;bpBuffer[i]=(char)ibt;}try{Out.Write(cbBuffer,nFilesize);}catch(CFileException *e){char *lpMsgBuf;if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |F ORMAT_MESSAGE_FROM _SYSTEM,NULL,e->m_lOsError,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPSTR)&lpMsgBuf,0,NULL)>0){AfxMessageBox(lpMsgBuf);LocalFree(lpMsgBuf);}e->Delete();return;char c bBuffer[4096];int n FIlesize=In.GetLength();while(nFIlesize>0){{int n Size=sizeof(cbBuffer);if(nSize>nFilesize)nSize=nFilesize;try {In.Read(cbBuffer,nSize);}catch(CFileException *e){char *lpMsgBuf;if(FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM, NULL,e->m_lOsError,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPSTR)&lpMsgBuf,0,NULL)>0){AfxMessageBox(lpMsgBuf);LocalFree(lpMsgBuf);}e->Delete();return;}try {Out.Write(cbBuffer,nSize);}catch(CFileException *e){char *lpMsgBuf;if(FormatMessage(*/WritePrivateProfileString(%%2,%%3,%%4,path);36.获得当前路径TCHAR s zDir[MAX_PATH];GetCurrentDirectory(szDir,MAX_PATH];CString %%1(szDir);37.读取XML数据库//#include <string>//using n amespace s td;char s Read[5192];CFile m File(_T(%%1),CFile::modeRead);mFile.Read(sRead,5192);if(sRead!=null){string t mp;while(sRead!=null){tmp.append(sRead);mFile.Read(sRead,5192);}//%%2="Logs" //%%4="ID" //%%6="Content"//%%3="Log" //%%5="Time"//%%7 c ode %%8 t ime %%9 c ontentstring t arget(%%7),globalTag("<"+%%2+">");string p ropTag1("<"+%%5+">",endTag1("</"+%%5+">"); string p ropTag2("<"+%%6+">",endTag1("</"+%%6+">");int o ffset=tmp.find_first_of(globalTag);while(offset){offset=tmp.find_first_of(globalTag);string d escription;tmp.copy(description.begin(),tmp.find_first_of("\"",offset+1)-offset);if(pare(description)==0){#include "zconf.h"*/HANDLE h File, h FileToWrite;CString s trFilePath;m_ctrEdit.GetWindowText(strFilePath);//打开要进行解压缩的文件hFile =C reateFile(strFilePath, // f ile n ameGENERIC_READ, // o pen f or r eadingFILE_SHARE_READ, // s hare f or r eadingNULL, // n o s ecurityOPEN_EXISTING, // e xisting f ile o nlyFILE_ATTRIBUTE_NORMAL, // n ormal f ileNULL); // n o a ttr. t emplateif (hFile == I NVALID_HANDLE_VALUE){AfxMessageBox("Could n ot o pen f ile t o r ead"); // p rocess e rror return;}HANDLE h MapFile, h MapFileToWrite;//创建一个文件映射hMapFile =C reateFileMapping(hFile, // C urrent f ile h andle. NULL, // D efault s ecurity.PAGE_READONLY, // R ead/write p ermission.0, // M ax. o bject s ize.0, // S ize o f h File. "ZipTestMappingObjectForRead"); // N ame o f m apping o bject. if (hMapFile == N ULL){AfxMessageBox("Could n ot c reate f ile m apping o bject"); return;}LPVOID l pMapAddress, l pMapAddressToWrite;//创建一个文件映射的视图用来作为source lpMapAddress =M apViewOfFile(hMapFile, // H andle t o m apping object.FILE_MAP_READ, // R ead/write p ermission0, // M ax. o bject s ize.0, // S ize o f h File.0); // M ap e ntire f ile.PAGE_READWRITE, // R ead/write p ermission.0, // M ax. o bject s ize.dwFileLengthToWrite, // S ize o f h File. "ZipTestMappingObjectForWrite"); // N ame o f m apping o bject.if (hMapFileToWrite == N ULL){AfxMessageBox("Could n ot c reate f ile m apping o bject f or w rite");return;}lpMapAddressToWrite =M apViewOfFile(hMapFileToWrite, //Handle t o m apping object.FILE_MAP_WRITE, // R ead/write p ermission0, // M ax. o bject s ize.0, // S ize o f h File.0); // M ap e ntire f ile.if (lpMapAddressToWrite == N ULL){AfxMessageBox("Could n ot m ap v iew o f f ile");return;}//这里是将压缩前的大小保存在文件的第一个DWORD里面LPVOID p Buf =l pMapAddressToWrite;//这里就是最重要的,zlib里面提供的一个方法,将源缓存的数据压缩至目的缓存//原形如下://int c ompress (Bytef *dest, u Longf *destLen, c onst B ytef *source, u Long s ourceLen); //参数destLen返回实际压缩后的文件大小。

mfc要点(自己总结的)

mfc要点(自己总结的)

将按钮置为选中状态(IDC_RADIO1为按钮ID):
((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);
编辑框控件(IDC_RESULT)显示数据(UINT rs):
SetDlgItemInt(IDC_RESULT,rs,FALSE);
添加控件(其ID不能为默认状态,否则无法关联)与其变量关联(在CDialog::DoDataExchange(CDataExchange* pDX)中):
DDX_Control(pDX, IDC_SHOWBMP(控件ID), pStatic(控件变量名,类型为CStatic));
控件显示图片(pStatic为图片控件变量):
if(hDll!=NULL)
{
lpFun pShowDlg=(lpFun)GetProcAddress(hDll,"ShowDlg"); //ShowDlg为导出的函数,pShowDlg为获得的此函数的指针
if(pShowDlg!=NULL)
pShowDlg(); //执行即可
暂停(挂起)线程(pFront为指向线程的指针):
pFront->SuspendThread();
恢复(唤醒)线程:
pFront->ResumeThread();
令窗口无效(程序重绘窗口,即调用OnDraw):
Invalidate();
InvalidateControl(); //用于控件
//此处添加导出函数的代码
}
dll导出类接口(位于头文件中,CRichStaticText为导出的函数):
class AFX_EXT_CLASS CRichStaticText : public CStatic /ec(dllexport))即可

mfc 教程

mfc 教程

mfc 教程MFC(Microsoft Foundation Classes)是一种用于开发Windows应用程序的C++框架,由Microsoft推出。

它提供了一系列的类和函数,简化了Windows编程的复杂性,使开发人员可以更轻松地创建各种功能强大且交互性良好的应用程序。

MFC教程的目的是帮助初学者了解MFC的基本概念和使用方法,以便能够利用MFC框架开发自己的Windows应用程序。

本教程将介绍MFC的主要组成部分、常用类以及一些常见的编程技巧,帮助读者快速上手。

第一部分将介绍MFC的基本概念和架构。

我们将了解MFC是如何工作的,包括应用程序对象、文档/视图体系结构和消息映射等主要概念。

我们还将学习如何创建一个简单的MFC应用程序,并进行窗口的创建和管理。

第二部分将深入介绍MFC的常用类。

我们将重点介绍窗口类和控件类,包括CWnd、CFrameWnd、CDialog、CButton等。

我们将学习如何使用这些类创建窗口、控件,并处理用户输入事件。

我们还将讨论一些常见的绘图和动画技术,如GDI绘图和使用定时器实现动画效果。

第三部分将介绍MFC的高级特性和编程技巧。

我们将学习如何使用MFC的文档/视图体系结构创建多文档应用程序,并进行文档的管理和视图的同步更新。

我们还将介绍如何通过自定义类和重载消息处理函数来实现定制化的功能。

此外,我们还将讨论一些高级主题,如线程编程和网络编程。

最后,本教程还将介绍一些常见的MFC开发工具和资源。

我们将介绍MFC的IDE(集成开发环境)和调试工具,并提供一些常用的网站和论坛供读者进一步学习和交流。

总结起来,本教程将帮助读者掌握MFC的基本概念和编程技巧,并能够利用MFC框架开发自己的Windows应用程序。

我们将通过实例和演示代码来讲解,帮助读者理解和应用所学知识。

阅读本教程后,读者将具备一定的MFC编程基础,并能够进一步深入研究和应用MFC框架。

希望本教程能够对MFC初学者有所帮助,让他们更加轻松地学习和掌握MFC编程。

MFC控件使用详细教程

MFC控件使用详细教程

MFC控件使用详细教程MFC(Microsoft Foundation Class)是微软推出的一套用于开发Windows应用程序的类库。

它提供了许多方便易用的控件,可以快速创建用户界面。

本教程将详细介绍如何使用MFC控件来创建Windows应用程序。

第一步:创建一个MFC应用程序项目要使用MFC控件,首先需要创建一个MFC应用程序项目。

在Visual Studio中,选择"文件"->"新建"->"项目",然后选择"MFC应用程序"模板。

在项目设置中,可以选择使用对话框或视图来作为应用程序的主界面。

第二步:设置控件属性第三步:添加控件消息处理程序控件不仅仅可以显示在界面上,还可以响应用户的操作。

例如,当用户点击按钮时,可以执行一些特定的操作。

要实现这个功能,需要添加控件消息处理程序。

可以通过右键单击控件,选择"添加事件处理程序"来添加控件消息处理程序。

在生成事件处理程序的对话框中,可以选择控件的事件(如点击事件、鼠标移动事件等)和消息的处理函数。

在消息处理函数中,可以编写代码来实现特定的功能。

第四步:编写控件的功能代码在控件的消息处理函数中,可以使用MFC类库提供的函数来实现控件的功能。

例如,如果用户点击了按钮控件,可以使用CButton类的GetWindowText函数来获取按钮的文本,并使用CMessageBox类的MessageBox函数来显示一个消息框。

可以使用类似的方式来处理其他控件的事件。

例如,当用户选择了一个列表框中的项时,可以使用CListBox类的GetCurSel函数来获取选择的项的索引,并根据索引来执行特定的操作。

第五步:编译和运行应用程序完成了控件的添加和功能编写后,可以使用Visual Studio的编译和运行功能来编译和运行应用程序。

在编译过程中,会生成可执行文件和相关的依赖文件。

MFC编程小技巧

MFC编程小技巧
11、 多线程 1) 在头文件中添加声明:
static UINT Thread1在源文件中定义 UINT CDemoDlg::Thread1(void *param) {
CDemoDlg *dlg = (CDemoDlg*)param; CEdit *randBox = (CEdit*)dlg->GetDlgItem(IDC_Random); CString str; while (dlg->flag) {
MFC 编程小技巧
1、 如何处理对话框按下 enter 或 esc 后自动退出的问题? 在类向导中添加 PreTranslateMessage 函数,重写函数如下:
BOOL CCopleymotorcontrolDlg::PreTranslateMessage(MSG* pMsg) {
// TODO: 在此添加专用代码和/或调用基类 switch (pMsg->wParam) { case VK_RETURN: case VK_ESCAPE:
8、 固定对话框大小,将属性 Border 改为 Dialog Frame
9、 软件自启动 void CDemoDlg::OnBnClickedAutostart() {
// TODO: 在此添加控件通知处理程序代码 HKEY hKey; CString strRegPath = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); //找到系统的启动项 if (m_autoStart.GetCheck()) {
RegDeleteValue(hKey, _T("Demo")); RegCloseKey(hKey); } } }

MFC 技巧90例

MFC   技巧90例

MFC 技巧90例1."属性页的添加:创建对话框的类,该类要从CpropertyPage继承;然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch;最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码:m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0);"//使选项卡的按钮在下面"if(m_tabsheet.m_hWnd)"m_tabsheet.ShowWindow(SW_MAXIMIZE);//显示选项卡//加入标签,标签名由各个子对话框的标题栏决定"m_tabsheet.AddPage(&m_skatch);"//用Create来创建一个属性页"m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);"RECT rect;"m_tabsheet.GetWindowRect(&rect);"int width = rect.right - rect.left;"int height = rect.bottom - rect.top;""//调整属性页的大小和位置"m_tabsheet.SetWindowPos(NULL, 225, 225, width-82, height,SWP_NOACTIV ATE);属性页的添加完成。

如果要添加多个属性页,则只需要增加多个对象,如下:m_tabsheet.AddPage(&m_skatch1);m_tabsheet.AddPage(&m_skatch2);. . . . . .2."List Control中标题栏(Column)的添加:创建一个List Control,其ID为IDC_LIST,在其Styles属性项下的View项里选择Report、Align项里选择Top、Sort项里选择None.然后在该List所在对话框的类(头文件)里创建ClistCtrl的一个对象m_list然后在.cpp文件的OnInitDialog()之类的函数里实现如下代码:CString strname[3];strname[0]="Screen Name";strname[1]="Form ID";strname[2]="Category Path";for(int i=0;i<3;i++){m_List.InsertColumn(i,strname[i],LVCFMT_LEFT,130);}在这之前也要将List Control的ID与ClistCtrl的对象m_list在DoDataExchange(CDataExchange* pDX)函数里绑定,如下:DDX_Control(pDX, IDC_LIST, m_List);3."ToolBar和StatusBar中控件的添加:方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上).其次,新创建一个类CMainToolBar,要从CToolBar继承(创建过程大概如下:选择工程/增加到工程/新的类;也可以选择工程的根,然后点击右键,选择新的类;或者CTL+W,选择增加类/新的类--- 然后在class type里选择Generic Class,在Name栏里输入新类的名字,Base class里输入CToolBar),创建成功后在该类里创建要增加的控件的对象,如:CComboBox""m_wndMyCombo;CStatic""m_wndCategory, m_wndCategoryPath;CButton""m_wndOpenButton;Cedit"""m_wndEdit;然后在构造函数里初始化如:m_wndMyCombo.m_hWnd = NULL;m_wndCategory.m_hWnd = NULL;m_wndCategoryPath.m_hWnd = NULL;m_wndOpenButton.m_hWnd = NULL;m_wndEdit.m_hWnd = NULL;接着在CMainframe的头文件里创建CMainToolBar的一个对象m_wndToolBar,最后在.cpp 文件的OnCreate函数的最后实现如下:"int index = 0;"CRect rect;// 可定义在头文件当中"//ComboBox"{""//找到指定的工具项""while(m_wndToolBar.GetItemID(index)!=ID_TOOL_COMBO)"""index++;""//设置指定工具项的宽度并获取新的区域120是宽度""m_wndToolBar.SetButtonInfo(index, ID_TOOL_COMBO, TBBS_SEPARATOR, 120);""m_wndToolBar.GetItemRect(index, &rect);""""//设置位置""rect.top+=1;""rect.bottom += 200;""""// 创建并显示控件""if(!m_wndToolBar.m_wndMyCombo.Create(WS_CHILD|WS_VISIBLE|CBS_AUTOHSCROLL|"""CBS_DROPDOWNLIST | CBS_HASSTRINGS , rect, &m_wndToolBar, ID_TOOL_COMBO))""{"""TRACE0("Failed to create combo-box\n");"""return FALSE;""}""m_wndToolBar.m_wndMyCombo.ShowWindow(SW_SHOW);""""//填充内容"""m_wndToolBar.m_wndMyCombo.AddString("25%");""m_wndToolBar.m_wndMyCombo.AddString("50%");""m_wndToolBar.m_wndMyCombo.AddString("75%");"""//选择默认项""m_wndToolBar.m_wndMyCombo.SetCurSel(0);""""//获取到内容并MSGBOX显示出来""CString strContent;""m_wndToolBar.m_wndMyCombo.GetWindowText(strContent);""index = 0;"}其他控件都类似创建(只需要注意一下各自的Create函数的参数即可)。

mfc使用教程

mfc使用教程

mfc使用教程MFC使用教程不要标题MFC是Microsoft Foundation Class的缩写,是一套C++的库,用于开发Windows平台的应用程序。

以下是一个简单的MFC使用教程,帮助你了解如何创建一个基本的MFC应用程序。

首先,打开Visual Studio并选择创建新项目。

在项目模板中,选择"MFC应用程序"。

在下一步中,选择"对话框"作为应用程序类型。

接下来,选择项目的名称和位置,然后点击"完成"按钮。

Visual Studio将自动生成一个MFC应用程序的基本框架。

应用程序的主要代码位于"MainFrm.cpp"和"MainFrm.h"文件中。

打开"MainFrm.cpp"文件,你将看到一个名为"Create"的函数。

在这个函数中,可以创建应用程序的主窗口。

在"Create"函数的内部,使用"MFC应用程序向导"提供的函数来创建一个对话框。

例如,可以使用"CDialogEx"类来创建一个简单的对话框。

在"Create"函数的最后,需要调用"ShowWindow"函数显示主窗口,并调用"UpdateWindow"函数来更新窗口。

在"MainFrm.h"文件中,你可以定义应用程序的主窗口类。

例如,可以继承自"CFrameWnd"类,并添加自定义的成员变量和函数。

在"MainFrm.cpp"文件的"Create"函数中,还可以添加一些自定义的代码,例如设置窗口的标题和大小,添加菜单和工具栏等。

最后,编译并运行应用程序。

你应该能够看到一个简单的MFC应用程序的窗口。

MFC使用教程范文

MFC使用教程范文

MFC使用教程范文MFC(Microsoft Foundation Classes)是微软开发的一种用于Windows操作系统的C++类库,可用于开发图形用户界面(GUI)应用程序。

MFC使用教程将指导您如何使用MFC库来创建基于Windows的应用程序。

第一部分:基本概念和环境设置(200字)在开始使用MFC之前,您需要了解一些基本概念和环境设置。

首先,MFC是一个C++类库,包含了各种用于构建Windows应用程序的类和函数。

它提供了处理窗口、控件、消息等等的功能。

其次,您需要一个C++编译器和开发环境,如Visual Studio。

确保您已经安装了Visual Studio以及所需的MFC组件。

第二部分:创建一个MFC应用程序(300字)步骤1:打开Visual Studio并选择创建“新项目”。

步骤2:选择MFC应用程序向导,并输入项目名称和位置。

步骤3:选择应用程序类型(单文档/多文档/对话框)。

步骤4:在向导的下一步中,选择所需的特性和选项。

步骤5:在应用程序向导中完成剩余设置,并单击“完成”来创建项目。

步骤6:Visual Studio将自动生成与所选应用程序类型相对应的源代码和资源文件。

第三部分:了解主要概念(300字)在了解如何使用MFC库之前,您需要了解一些主要概念。

首先是对话框,它是一个用于显示和与用户交互的窗口。

其次是框架窗口,用于包含和管理窗口的集合。

控件是用于接收和显示用户输入的界面元素,如按钮、文本框等。

消息是在窗口间传递的信息,用于处理用户输入和应用程序的操作。

第四部分:使用MFC库创建控件和处理消息(400字)步骤1:在资源视图中选择对应的对话框或窗口。

步骤2:在工具箱中选择所需的控件,并将其拖放到对话框或窗口上。

步骤3:在类视图中选择对应的对话框或窗口类。

步骤4:在类向导中选择“消息映射”选项,并添加所需的消息处理函数。

步骤5:在消息处理函数中编写代码来处理控件的事件或用户输入。

MFC 小技巧(更换皮肤,背景,标题栏,透明)

MFC 小技巧(更换皮肤,背景,标题栏,透明)

1.背景透明在MainFrame.Cpp中找到int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函数添加代码SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE)^0x80000);// 添加库HINSTANCE hInst = LoadLibrary("User32.DLL");if(hInst){typedef BOOL (WINAPI *ShowLayer)(HWND,COLORREF,BYTE,DWORD);ShowLayer fun = NULL;// 读取函数指针fun = (ShowLayer)GetProcAddress(hInst, "SetLayeredWindowAttributes");if (fun)fun(this->GetSafeHwnd(), 0, 230, 2);FreeLibrary(hInst);}HBITMAP startpic;CStaticstartPics;startpic=(HBITMAP) ::LoadImage(NULL,"snakeNet.bmp",IMAGE_BITMAP,110,50,LR_LOADFROMF ILE|LR_DEFAULTSIZE);startPics.Create(NULL,WS_CHILD|WS_VISIBLE|SS_BITMAP|SS_CENTERIMAGE,CRect(200,457,20 0+110,457+50),this,NULL);startPics.SetBitmap(startpic);GetSafeHwnd(), 0, 230, 2);里面的参数230是改变透明度对话框的函数好像不一样2.更换背景图片首先先找一张图片将其格式转换成.Bmp格式然后在VC中ctrl+R 新建一个bitmap资源然后在资源栏中右击选择引入然后选择你的那张BMP格式图片出现这个不用理然后在View类中添加CBrush类型的m_brushBackground变量然后在View的构造函数中添加代码CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2); ///加载位图m_brushBackground.CreatePatternBrush(&bmp); ///创建位图画刷其中IDB_BITMAP2是你图片的ID号然后在OnDraw(CDC* pDC)函数中添加代码CRectrect;GetClientRect(rect);///取得客户区域pDC->FillRect(rect,&m_brushBackground); ///用背景画刷填充区域然后调试就发现背景好看多了3.标题栏标题栏图标找一个IOC格式的图片直接把名字改成工程文件夹中rs文件夹中的ico格式图片的名字直接替换就行了标题栏名字在App。

mfc教程

mfc教程

mfc教程
MFC(Microsoft Foundation Classes)是微软公司开发的一套
用于开发Windows应用程序的C++框架。

MFC提供了一系列
的类和函数,简化了Windows应用程序的开发过程,使程序
员能够更加专注于业务逻辑的实现。

MFC教程是帮助初学者理解和学习MFC框架的材料。

它可以
包括对MFC的基本概念和架构的介绍,以及如何创建和设计MFC应用程序的详细指导。

在MFC教程中,首先会对MFC框架进行简单的介绍,解释MFC的基本概念,如应用程序对象、主窗口类等。

然后会详
细介绍如何创建一个MFC应用程序,包括创建工程、设计界
面等步骤。

在创建应用程序的过程中,会介绍如何添加控件、设计菜单,并为控件和菜单添加相应的功能。

接下来,教程会介绍如何处理MFC应用程序中的事件和消息。

MFC应用程序是事件驱动的,当用户进行操作时,会触发相
应的事件,程序需要对这些事件进行处理。

教程会详细介绍如何注册和处理事件,以及如何发送和接收消息。

此外,教程还会介绍MFC的一些常用功能和技巧,如文件操作、数据库连接、绘图操作等。

这些内容可以帮助程序员更好地利用MFC框架完成复杂的任务。

最后,教程会提供一些实例代码和练习题,供学习者进行练习和巩固所学的知识。

总之,MFC教程是帮助初学者理解和学习MFC框架的教材。

通过教程的学习,初学者可以掌握MFC框架的基本概念和使用方法,能够独立地开发Windows应用程序。

MFC控件使用大全

MFC控件使用大全

MFC控件使用大全Static Text1. 透明背景、改变文本的字体颜色最好做法当然是继承CStatic然后重载OnPaint(),完全自己来画,这样能够获得最大的灵活性,但是比较麻烦。

可以使用以下方便的方法:同样创建一个CStatic的派生类,处理父窗口的反射消息WM_CTLCOLOR,即添加HBRUSH CtlColor(CDC *pDC, UINT nCtlColor)这个消息映射函数。

注意,不是HBRUSH OnCtlColor(CDC *pDC, CWnd *pWnd, UINTnCtlColor)!其实还有一个方法,就是处理父窗口的OnCtlColor(),更简单一点,但是不符合封装的原则。

HBRUSH CStatic_bg_color_sizeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: 在此更改 DC 的任何特性if (nCtlColor == CTLCOLOR_STATIC){pDC->SetBkMode(TRANSPARENT); // 设置透明背景pDC->SetT extColor(RGB(0, 0, 255)); // 设置文本颜色return (HBRUSH)GetStockObject(HOLLOW_BRUSH); // 返回透明画刷}return hbr;}-------------------------------------------------------------------------------------------------通过上述代码,就可以得到彩色的文本以及透明的背景,但是,还存在一个问题,当该Static控件的文本内容或者属性,在运行过程中发生变化的时候,由于背景一直没有擦除(为了实现透明),会出现重影,导致文本模糊成一团。

mfc 教程

mfc  教程

mfc 教程MFC(Microsoft Foundation Classes)是一种用于开发Microsoft Windows应用程序的C++库。

它提供了一组类和函数,用于处理窗口、对话框、控件、消息传递等常见的Windows编程任务。

下面是一个简单的MFC教程,介绍如何创建一个基本的窗口应用程序。

首先,打开Visual Studio并创建一个新的MFC应用程序项目。

选择MFC Application(对话框)模板,并为项目命名。

项目创建后,你会看到一个默认的对话框。

我们需要对其进行一些修改。

打开资源视图,找到IDD_DIALOG1对话框资源。

双击它,会弹出一个对话框设计器。

在对话框设计器中,你可以添加控件并调整它们的位置和大小。

我们先添加一个按钮控件。

在工具箱中选择按钮工具,然后在对话框上绘制一个按钮。

接下来,需要为按钮添加一个响应函数。

首先,在类视图中找到对话框类(通常命名为CMainDlg)。

右键单击类,选择“添加->消息处理程序”菜单。

在弹出的对话框中,选择按钮的点击事件(一般是BN_CLICKED)。

点击“确定”后,会自动生成一个响应函数。

在响应函数中,你可以编写你想要执行的代码。

例如,你可以在点击按钮时显示一个消息框。

使用AfxMessageBox函数可以很方便地实现这个功能。

完成了对话框的设计和按钮的添加后,可以进行编译和运行了。

编译后,点击运行按钮,一个窗口应用程序将会弹出。

当你点击按钮时,会显示一个消息框。

这只是MFC的入门教程,介绍了如何创建一个简单的窗口应用程序并添加一个按钮。

MFC还提供了更多功能和控件,可以用于开发更复杂和功能丰富的应用程序。

你可以继续学习MFC的其他教程,深入了解这个强大的框架的更多特性和用法。

MFC学习总结 (67个技巧) dlg 上建立View

MFC学习总结 (67个技巧) dlg 上建立View

MFC学习总结(67个技巧) dlg 上建立View1."属性页的添加:创建对话框的类,该类要从CpropertyPage继承;然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch;最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码:m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0);"//使选项卡的按钮在下面"if(m_tabsheet.m_hWnd)"m_tabsheet.ShowWindow(SW_MAXIMIZE);//显示选项卡//加入标签,标签名由各个子对话框的标题栏决定"m_tabsheet.AddPage(&m_skatch);"//用Create来创建一个属性页"m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);"RECT rect;"m_tabsheet.GetWindowRect(&rect);"int width = rect.right - rect.left;"int height = rect.bottom - rect.top;""//调整属性页的大小和位置"m_tabsheet.SetWindowPos(NULL, 225, 225, width-82, height,SWP_NOACTIVATE);属性页的添加完成。

如果要添加多个属性页,则只需要增加多个对象,如下:m_tabsheet.AddPage(&m_skatch1);m_tabsheet.AddPage(&m_skatch2);. . . . . .2."List Control中标题栏(Column)的添加:创建一个List Control,其ID为IDC_LIST,在其Styles属性项下的View项里选择Report、Align 项里选择Top、Sort项里选择None.然后在该List所在对话框的类(头文件)里创建ClistCtrl的一个对象m_list然后在.cpp文件的OnInitDialog()之类的函数里实现如下代码:CString strname[3];strname[0]="Screen Name";strname[1]="Form ID";strname[2]="Category Path";for(int i=0;i<3;i++){m_List.InsertColumn(i,strname[i],LVCFMT_LEFT,130);}在这之前也要将List Control的ID与ClistCtrl的对象m_list在DoDataExchange(CDataExchange* pDX)函数里绑定,如下:DDX_Control(pDX, IDC_LIST, m_List);3."ToolBar和StatusBar中控件的添加:方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上).其次,新创建一个类CMainToolBar,要从CToolBar继承(创建过程大概如下:选择工程/增加到工程/新的类;也可以选择工程的根,然后点击右键,选择新的类;或者CTL+W,选择增加类/新的类--- 然后在class type里选择Generic Class,在Name栏里输入新类的名字,Base class 里输入CToolBar),创建成功后在该类里创建要增加的控件的对象,如:CComboBox""m_wndMyCombo;CStatic""m_wndCategory, m_wndCategoryPath;CButton""m_wndOpenButton;Cedit"""m_wndEdit;然后在构造函数里初始化如:m_wndMyCombo.m_hWnd = NULL;m_wndCategory.m_hWnd = NULL;m_wndCategoryPath.m_hWnd = NULL;m_wndOpenButton.m_hWnd = NULL;m_wndEdit.m_hWnd = NULL;接着在CMainframe的头文件里创建CMainToolBar的一个对象m_wndToolBar,最后在.cpp 文件的OnCreate函数的最后实现如下:"int index = 0;"CRect rect;// 可定义在头文件当中"//ComboBox"{""//找到指定的工具项""while(m_wndToolBar.GetItemID(index)!=ID_TOOL_COMBO)"""index++;""//设置指定工具项的宽度并获取新的区域120是宽度""m_wndToolBar.SetButtonInfo(index, ID_TOOL_COMBO, TBBS_SEPARATOR, 120); ""m_wndToolBar.GetItemRect(index, &rect);""""//设置位置""rect.top+=1;""rect.bottom += 200;""""// 创建并显示控件""if(!m_wndToolBar.m_wndMyCombo.Create(WS_CHILD|WS_VISIBLE|CBS_AUTOHSCROLL|"""CBS_DROPDOWNLIST | CBS_HASSTRINGS , rect, &m_wndToolBar,ID_TOOL_COMBO))""{"""TRACE0("Failed to create combo-box\n");"""return FALSE;""m_wndToolBar.m_wndMyCombo.ShowWindow(SW_SHOW);""""//填充内容"""m_wndToolBar.m_wndMyCombo.AddString("25%");""m_wndToolBar.m_wndMyCombo.AddString("50%");""m_wndToolBar.m_wndMyCombo.AddString("75%");"""//选择默认项""m_wndToolBar.m_wndMyCombo.SetCurSel(0);""""//获取到内容并MSGBOX显示出来""CString strContent;""m_wndToolBar.m_wndMyCombo.GetWindowText(strContent);""index = 0;"}其他控件都类似创建(只需要注意一下各自的Create函数的参数即可)。

MFC使用教程

MFC使用教程

为事件,也把系统操作如更新屏幕定义为事件。 在比较低级的编程方法中,如用 C 直接编写 Windows API 应用程序,代码量是非常大的,因为你所要 照顾的细节太多了。例如,你用某种类型的结构来接收单击鼠标事件。你的事件循环中的代码会查看结构 中不同域,以确定哪个用户界面对象受到了影响,然后会完成相应的操作。当屏幕上有很多对象时,应用 程序会变得很大。只是简单地处理哪个对象被单击和对它需要做些什么要花费大量的代码。 幸运的是,你可以在比较高级的方法来进行编程,这就是使用 MFC。在 MFC 中,几乎所有的低级的 细节处理都为你代办了。如果你把某一用户界面对象放在屏幕上,你只需要两行代码来建立它。如果用户 单击一个按钮,则按钮自己会完成一切必要的操作,从更新屏幕上的外观到调用你程序中的预处理函数。 该函数包含有对该按钮作出相应操作的代码。 MFC 为你处理所有的细节: 你建立按钮并告知它特定的处理 函数,则当它被按下时,它就会调用相应的函数。第四部分介绍了怎样使用消息映射来处理事件。 例子: 理解一个典型的 MFC 程序的结构和样式的最好方法是输入一段小程序,然后编译和运行它。下面的 程序是一段简单的"hello world"程序。这对很多 C 程序员都是很熟悉了,让我们看一下如何用 MFC 方法来 实现。如果你是第一次看到这类程序,也许比较难理解。这没关系,我们后面会详细介绍。现在你只要用 Visual C++ 环境中建立、编译和运行它就可以了。 //hello.cpp #include <afxwin.h> // 说明应用程序类 class CHelloApp : public CWinApp { public: virtual BOOL InitInstance(); }; // 建立应用程序类的实例 CHelloApp HelloApp; // 说明主窗口类 class CHelloWindow : public CFrameWnd { CStatic* cs; public: CHelloWindow(); }; // 每当应用程序首次执行时都要调用的初始化函数 BOOL CHelloApp::InitInstance() { m_pMainWnd = new CHelloWindow(); m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; } // 窗口类的构造函数 CHelloWindow::CHelloWindow() {

MFC 90条技巧

MFC  90条技巧

MFC 90条技巧-带目录(转自网上)1."属性页的添加:2."List Control中标题栏(Column)的添加:3."ToolBar和StatusBar中控件的添加:4."通过Control创建的控件,对其属性的动态控制:5."窗口的分割与停靠:6.①怎样在程序开始的时候让它最大化?②vc++做出来的exe文件在窗体的右上方是没有最大化和最小化按钮的,怎样实现这一功能?③如何在显示窗口时,使最大化按钮变灰?7. 更改属性页标题8. 创建动态菜单9.关于打印11. 修改主窗口风格12. 控制滚动条13. 属性页处理通知消息14.使工具条上的按钮点击一次为按下,再点击才弹起15. VC中基于Windows 的精确定时16. 为对话框中的控件增加提示的简单方法17.删除文件夹18.消息映射19.给从CWnd派生的窗口添加滚动条20. SetWindowPos21. 介绍函数过程中一种任意键退出同时能处理消息的实现方法22. 如何隐藏工具栏23. 如何动态获取工具条指针并给工具条加标题?24. 在状态条中显示鼠标的设备坐标与逻辑坐标25. 如何用VC++ 动态修改应用程序菜单26. VC++中的3D按钮的编程27. 如何正确的得到ComBox的指针28. 如何让对话框中的CEdit控件类接收对话框的消息29.利用WM_CTLCOLOR消息实现编辑控制(Edit Control)的文本与背景色的改变30. 如何防止密码被非法获取?31. 如何在编辑控件中以追加的方式添入字符?32.属性页标题改名33. 怎样去掉属性页的Apply与Help按钮?34. 如何给树控件加入工具提示35. 如何在TreeList中加图标?36. 如何双击列表框项启动一个与文件关联的程序?37. 如何防止在listbox中添加很多数据出现不停的刷新?38. 如何得到CListBox所选择项的String?39. 用鼠标移动基于对话框的无标题栏程序的简单方法40. 如何改变框对话或窗体视窗的背景颜色41.如何禁止对话框关闭按钮和浮动工具条上的系统菜单42.如何拷贝一个工程的对话框资源到另一个工程中?42.如何拷贝一个工程的对话框资源到另一个工程中?43.如何实现点一下对话框外面的区域,自动隐藏对话框?44. 初始化应用程序的大小45. 如何得到视图指针?46. 如何使我的程序在启动时不创建一个新文档?47. 如何将标题栏上的右键菜单屏蔽掉?48.如何全屏显示(没有标题,没有菜单,没有工具条)49.如何设置有背景颜色的文本50.串太长时往让其末尾显示一个省略号(在SDI或MDI的View中)51. 如何获得其他程序的图标,并显示在View中52 .RichEdit53. 如何使FormView中显示dialog时,不是凹的?54. 如何改变窗口标题?55.图标透明56. 将RADIO控件初始状态设置成为选中57.获得视图58.如何得到屏幕的真实尺寸59. 修改标题栏高度60. 如何实现“气球式”工具提示。

mfc用法 -回复

mfc用法 -回复

mfc用法-回复问题:MFC是什么?它的用法是什么?MFC(Microsoft Foundation Class)是微软公司开发的一套C++类库,用于Windows操作系统下的图形用户界面(GUI)应用程序的开发。

MFC 为开发者提供了一系列的类和函数,用于创建窗口、处理消息、绘制界面元素等操作,大大简化了Windows应用程序的开发过程。

下面将以步骤的方式来回答MFC的用法问题:第一步:创建MFC应用程序在开始使用MFC之前,需要安装Visual Studio开发环境。

打开Visual Studio后,选择“新建项目”,在弹出的对话框中选择“Visual C++”->“MFC应用程序”。

在下一步中,可以选择创建一个对话框应用程序或者基于文档的应用程序。

根据自己的需求进行选择,并为应用程序命名和指定保存位置。

完成这一步后,会自动生成一个基本的MFC应用程序的框架。

第二步:设计用户界面接下来,需要设计用户界面。

MFC提供了许多控件,如按钮、文本框、列表框等,可以通过拖拽的方式将这些控件添加到窗口中。

通过属性窗口可以对控件进行属性设置,如大小、位置、文本内容等。

使用这些控件和属性设置,可以设计出符合自己需求的用户界面。

第三步:处理消息在MFC中,用户操作会触发消息的产生,如点击按钮、改变文本框内容等。

MFC提供了一套消息映射机制,可以将用户操作映射到相应的处理函数上。

打开应用程序的主窗口类(通常是CMainFrame类)的头文件,可以看到一系列的消息映射函数声明。

在这些函数中,可以编写相应的代码来处理用户操作产生的消息。

第四步:编写功能代码除了处理消息外,还需要编写其他功能代码来实现应用程序的具体功能。

比如,可以在按钮的点击处理函数中编写代码,实现某个文件的读写操作;或者在文本框的改变处理函数中编写代码,实现数据的验证和保存等。

根据应用程序的需求,编写相应的功能代码。

第五步:调试和测试在程序编写完毕后,需要进行调试和测试,确保应用程序的正确性和稳定性。

MFC网络编程技巧

MFC网络编程技巧

MFC网络编程技巧MFC(Microsoft Foundation Classes)是一套用于Windows操作系统上的C++编程框架,它提供了一系列的类和函数,简化了Windows程序的开发。

MFC网络编程则是在MFC框架下进行网络通信的技巧,下面将介绍一些MFC网络编程的重要技巧。

1. 理解TCP/IP和Socket编程:网络编程的核心是理解TCP/IP协议和Socket编程。

TCP/IP协议是Internet上最常用的通信协议,Socket 是对TCP/IP协议的封装,提供了一些类和函数来实现网络通信。

学习TCP/IP协议的基本原理和Socket编程的相关知识是进行MFC网络编程的基础。

2. 使用CAsyncSocket类:MFC框架提供了CAsyncSocket类来简化Socket编程。

CAsyncSocket类封装了Socket编程的各种方法,提供了一些异步操作的函数,比如异步连接、异步发送和异步接收等。

通过使用CAsyncSocket类,可以方便地实现网络通信功能。

3. 处理Socket消息:在MFC应用程序中,Socket的消息处理是通过重载CAsyncSocket类的多个虚函数来实现的。

比如,通过重载OnAccept、OnConnect、OnReceive和OnClose等函数,可以处理Socket 的连接、接收和关闭等事件。

在处理Socket消息时,需要注意及时释放资源,防止内存泄漏。

4. 使用CAsyncSocket的派生类:在实际的网络编程中,通常会创建一个继承自CAsyncSocket的派生类来处理具体的网络通信任务。

通过继承CAsyncSocket类,可以在派生类中实现一些特定的功能,比如客户端的连接、服务器端的接收等。

通过派生类来管理Socket对象,可以更好地组织代码和处理逻辑。

5. 异步发送和接收数据:MFC框架的CAsyncSocket类提供了异步发送和接收数据的函数。

MFC网络编程技巧

MFC网络编程技巧

MFC网络编程技巧MFC(Microsoft Foundation Classes)是一种应用程序框架,用于开发Windows图形用户界面(GUI)应用程序。

网络编程指的是在MFC应用程序中实现与网络通信相关的功能,例如网络套接字的创建和管理、数据的传输、与服务器进行通信等。

在进行MFC网络编程时,有一些技巧可以帮助我们更好地实现所需的功能,并提高程序的性能和稳定性。

以下是一些关键技巧:1. 充分利用MFC提供的网络类:MFC提供了一些用于网络编程的类,例如CSocket、CAsyncSocket、CSocketFile等。

这些类封装了底层的套接字操作,简化了网络编程的实现。

我们可以充分利用这些类来加快开发速度和减少错误。

2. 使用非阻塞的套接字:默认情况下,使用MFC的CSocket类创建的套接字是阻塞的,也就是说,当套接字执行一些操作时,程序会一直等待直到该操作完成。

这可能导致程序的响应性变差。

为了避免这个问题,我们可以将套接字设置为非阻塞模式,这样套接字操作将不再阻塞程序的执行。

3. 使用消息机制进行异步处理:当我们需要在网络编程中执行一些耗时的操作时,例如等待服务器响应、等待数据传输等,使用异步处理可以避免阻塞用户界面,提高程序的响应性。

可以使用MFC的消息机制(例如PostMessage和SendMessage)来实现异步处理。

4. 错误处理和异常处理:在网络编程中,可能会出现各种错误,例如连接超时、网络中断等。

为了保证程序的健壮性,我们需要进行合适的错误处理和异常处理。

可以使用try-catch语句来捕捉和处理异常,确保程序能够正常处理错误情况。

5. 使用多线程进行并发处理:当需要同时处理多个连接或实现并发功能时,可以使用多线程来提高程序的并发能力。

可以使用MFC提供的CWinThread类来创建和管理线程,实现多线程编程。

6.优化性能:在进行网络编程时,性能是一个非常重要的因素。

可以通过一些优化措施来提高程序的性能,例如减少网络传输的数据量、使用缓冲区减少网络读写的次数、使用合适的数据结构等。

mfc常用技巧

mfc常用技巧

mfc常用技巧一、打开CD-ROMmciSendString("Set cdAudio door open wait",NULL,0,NULL);二、关闭CD_ROMmciSendString("Set cdAudio door closed wait",NULL,0,NULL);三、关闭计算机OSVERSIONINFO OsVersionInfo; //包含操作系统版本信息的数据结构OsVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);GetVersionEx(&OsVersionInfo); //获取操作系统版本信息if(OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS){//Windows98,调用ExitWindowsEx()函数重新启动计算机DWORD dwReserved;ExitWindowsEx(EWX_REBOOT,dwReserved); //可以改变第一个参数,实现注销用户、//关机、关闭电源等操作// 退出前的一些处理程序}四、重启计算机typedef int (CALLBACK *SHUTDOWNDLG)(int); //显示关机对话框函数的指针HINSTANCE hInst = LoadLibrary("shell32.dll"); //装入shell32.dllSHUTDOWNDLG ShutDownDialog; //指向shell32.dll库中显示关机对话框函数的指针if(hInst != NULL){//获得函数的地址并调用之ShutDownDialog = (SHUTDOWNDLG)GetProcAddress(hInst,(LPSTR)60);(*ShutDownDialog)(0);}五、枚举所有字体LOGFONT lf;lf.lfCharSet = DEFAULT_CHARSET; // Initialize the LOGFONT structurestrcpy(lf.lfFaceName,"");CClientDC dc (this);// Enumerate the font families::EnumFontFamiliesEx((HDC) dc,&lf, (FONTENUMPROC) EnumFontFamProc,(LPARAM) this,0);//枚举函数int CALLBACK EnumFontFamProc(LPENUMLOGFONT lpelf, LPNEWTEXTMETRIC lpntm,DWORD nFontType,long lparam) {// Create a pointer to the dialog windowCDay7Dlg* pWnd = (CDay7Dlg*) lparam;// add the font name to the list boxpWnd ->m_ctlFontList.AddString(lpelf ->elfLogFont.lfFaceName);// Return 1 to continue font enumerationreturn 1;}其中m_ctlFontList是一个列表控件变量六、一次只运行一个程序实例,如果已运行则退出if( FindWindow(NULL,"程序标题")) exit(0);七、得到当前鼠标所在位置CPoint pt;GetCursorPos(&pt); //得到位置八、上下文菜单事件触发事件:OnContextMenu事件九、显示和隐藏程序菜单CWnd *pWnd=AfxGetMainWnd();if(b_m) //隐藏菜单{pWnd->SetMenu(NULL);pWnd->DrawMenuBar();b_m=false;}else{CMenu menu;menu.LoadMenu(IDR_MAINFRAME); ////显示菜单也可改变菜单项pWnd->SetMenu(&menu);pWnd->DrawMenuBar();b_m=true;menu.Detach();}十、获取可执行文件的图标HICONhIcon=::ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0);if (hIcon &&hIcon!=(HICON)-1){pDC->DrawIcon(10,10,hIcon);}DestroyIcon(hIcon);十一、窗口自动靠边程序演示BOOL AdjustPos(CRect* lpRect){//自动靠边int iSX=GetSystemMetrics(SM_CXFULLSCREEN);int iSY=GetSystemMetrics(SM_CYFULLSCREEN);RECT rWorkArea;BOOL bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), &rWorkArea, 0);CRect rcWA;if(!bResult){//如果调用不成功就利用GetSystemMetrics获取屏幕面积rcWA=CRect(0,0,iSX,iSY);}elsercWA=rWorkArea;int iX=lpRect->left;int iY=lpRect->top;if(iX < rcW A.left + DETASTEP && iX!=rcW A.left){//调整左//pWnd->SetWindowPos(NULL,rcWA.left,iY,0,0,SWP_NOSIZ E);lpRect->OffsetRect(rcWA.left-iX,0);AdjustPos(lpRect);return TRUE;}if(iY < rcW A.top + DETASTEP && iY!=rcW A.top){//调整上//pWnd->SetWindowPos(NULL ,iX,rcWA.top,0,0,SWP_NOSI ZE);lpRect->OffsetRect(0,rcW A.top-iY);AdjustPos(lpRect);return TRUE;}if(iX + lpRect->Width() > rcWA.right - DETASTEP && iX !=rcW A.right-lpRect->Width()){//调整右//pWnd->SetWindowPos(NULL ,rcWA.right-rcW.Width(),iY,0,0,SWP_NOSIZE); lpRect->OffsetRect(rcWA.right-lpRect->right,0);AdjustPos(lpRect);return TRUE;}if(iY + lpRect->Height() > rcWA.bottom - DETASTEP && iY !=rcW A.bottom-lpRect ->Height()){//调整下//pWnd->SetWindowPos(NULL ,iX,rcWA.bottom-rcW.Height(),0,0,SWP_NOSIZE); lpRect->OffsetRect(0,rcW A.bottom-lpRect->bottom);return TRUE;}return FALSE;}//然后在ONMOVEING事件中使用所下过程调用CRect r=*pRect;AdjustPos(&r);*pRect=(RECT)r;十二、给系统菜单添加一个菜单项给系统菜单添加一个菜单项需要进行下述三个步骤:首先,使用Resource Symbols对话(在View菜单中选择Resource Symbols...可以显示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd:: Appendmenu将菜单项添加到菜单中。

MFC常用函数以及值得注意的地方(第1篇)

MFC常用函数以及值得注意的地方(第1篇)

目录:1.DrawText()2.取高字节,低字节3.如果字符串太长了,一行写不尽怎么办?4.CString::Format函数使用要注意的问题!1.DrawText()该函数在指定的矩形里写入格式化的正文,根据指定的方法对正文格式化(扩展的制表符,字符对齐、折行等)。

int DrawText(HDC hDC, // 设备描述表句柄LPCTSTR lpString, // 将要绘制的字符串int nCount, // 字符串的长度LPRECT lpRect, // 指向矩形结构RECT的指针UINT uFormat // 正文的绘制选项);hdc:输入设备环境句柄。

lpString:[输入]指向将被写入的字符串的指针,如果参数nCount 是-1,则字符串必须是以\0结束的。

如果uFormat包含DT_MODIFYSTRING,则函数可为此字符串增加4个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符。

nCount:[输入]指向字符串中的字符数。

如果nCount为-1,则lpString指向的字符串被认为是以\0结束的,DrawText会自动计算字符数。

lpRect:[输入/输出]指向结构RECT的指针,其中包含文本将被置于其中的矩形的信息(按逻辑坐标)。

uFormat:[输入]指定格式化文本的方法。

它可以下列值的任意组合,各值描述如下:值说明DT_BOTTOM将正文调整到矩形底部。

此值必须和DT_SINGLELINE组合。

DT_CALCRECT 决定矩形的宽和高。

如果正文有多行,DrawText使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳正文的最后一行。

如果正文只有一行,则DrawText改变矩形的右边界,以容纳下正文行的最后一个字符。

出现上述任何一种情况,DrawText返回格式化正文的高度,而不是绘制正文。

DT_CENTER 使正文在矩形中水平居中。

DT_EDITCONTROL 复制多行编辑控制的正文显示特性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
m_wndCategory.m_hWnd = NULL;
m_wndCategoryPath.m_hWnd = NULL;
m_wndOpenButton.m_hWnd = NULL;
m_wndEdit.m_hWnd = NULL;
接着在CMainframe的头文件里创建CMainToolBar的一个对象m_wndToolBar,最后在.cpp文件的OnCreate函数的最后实现如下:
" // {{AFX_MSG_MAP(CMainFrame)
" ON_COMMAND(ID_VIEW_STATUS_BAR, OnViewStatusBar)
" ON_WM_CREATE()
" // }}AFX_MSG_MAP
END_MESSAGE_MAP()
然后Create函数的最后(返回值之前)实现如下代码:
for(int i=0;i<3;i++)
{
m_List.InsertColumn(i,strname[i],LVCFMT_LEFT,130);
}
在这之前也要将List Control的ID与ClistCtrl的对象m_list在DoDataExchange(CDataExchange* pDX)函数里绑定,如下:
其次,新创建一个类CMainToolBar,要从CToolBar继承(创建过程大概如下:选择工程/增加到工程/新的类;也可以选择工程的根,然后点击右键,选择新的类;或者CTL+W,选择增加类/新的类 --- 然后在class type里选择Generic Class,在Name栏里输入新类的名字,Base class里输入CToolBar),创建成功后在该类里创建要增加的控件的对象,如:
m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0);
"//使选项卡的按钮在下面
"if(m_tabsheet.m_hWnd)
"m_tabsheet.ShowWindow(SW_MAXIMIZE);//显示选项卡
//加入标签,标签名由各个子对话框的标题栏决定
CComboBox""m_wndMyCombo;
CStatic""m_wndCategory, m_wndCategoryPath;
CButton""m_wndOpenButton;
Cedit"""m_wndEdit;
然后在构造函数里初始化如:
m_wndMyCombo.m_hWnd = NULL;
"int width = rect.right - rect.left;
"int height = rect.bottom - rect.top;
"
"//调整属性页的大小和位置
"m_tabsheet.SetWindowPos(NULL, 225, 225, width-82, height,SWP_NOACTIVATE);
CRect rc;
"VERIFY(m_wndAboutButton.Create(_T("MyAbout"),
"" WS_VISIBLE,rc,this,ID_APP_ABOUT));
"// TODO: Remove this if you don't want tool tips or a resizeable toolbar
DDX_Control(pDX, IDC_LIST, m_List);
3."ToolBar和StatusBar中控件的添加:
方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上).
1."属性页的添加:
创建对话框的类,该类要从CpropertyPage继承;然后在要添加该对话框为属性页的类(头文件)里创建CpropertySheet类的一个对象m_tabsheet和新创建的对话框类的对象m_skatch;最后,在.cpp文件里的OnInitDialog()之类的函数里实现如下代码:
""m_button.EnableWindow(FALSE);
"""SWP_NOZORDER);
""rc.left = rc.right;
""rc.right += 50;
""m_wndAboutButton.SetWindowPos(NULL,rc.left,rc.top,rc.Width(),rc.Height(),
"""SWP_NOZORDER);
"}
最后在OnViewStatusBar()里实现:
BOOL bShow = m_wndStatusBar.GetStyle() & WS_VISIBLE;
"m_wndAboutButton.SetWindowPos(NULL, 0, 0, 0, 0,
SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|
//{{AFX_DATA_MAP(CPrintDlg)
""// NOTE: the ClassWizard will add DDX and DDV calls here
"DDX_Control(pDX, IDC_MyButton, m_button);
"//}}AFX_DATA_MAP
然后可以在该函数的最后进行初始化:
""{
"""TRACE0("Failed to create combo-box\n");
"""return FALSE;
""}
""m_wndToolBar.m_wndMyCombo.ShowWindow(SW_SHOW);
""
""//填充内容"
""m_wndToolBar.m_wndMyCombo.AddString("25%");
""m_button.EnableWindow(TRUE);
}
// RadioSelect Button的点击响应函数
void CPrintDlg::OnRadioSelect()
{
""// TODO: Add your control notification handler code here
(bShow ? SWP_SHOWWINDOW : SWP_HIDEWINDOW));
ToolBar中的创建与此相同,只需更改一下句柄即可。
4."通过Control创建的控件,对其属性的动态控制:
在对话框类的头文件里创建所要改变属性的控件的对象,如要改变一个Button(其ID为IDC_MyButton)的属性,则需创建Cbutton的对象m_button。然后在.cpp中的DoDataExchange函数里将Button的ID和创建的对象绑定在一起:
""
""// 创建并显示控件
""if(!m_wndToolBar.m_wndMyCombo.Create(WS_CHILD|WS_VISIBLE| CBS_AUTOHSCROLL|
"""CBS_DROPDOWNLIST | CBS_HASSTRINGS , rect, &m_wndToolBar, ID_TOOL_COMBO))
""CString strContent;
""m_wndToolBar.m_wndMyCombo.GetWindowText(strContent);
""index = 0;
"}
其他控件都类似创建(只需要注意一下各自的Create函数的参数即可)。
方法⑵.这种方法创建不太容易控制:直接在CMainframe的头文件中创建要增加的控件的对象,如CButton"的对象m_wndAboutButton,然后创建CToolBar或者CstatusBar的对象,如:CstatusBar的对象_wndStatusBar;再增加几个函数如下:
""m_wndToolBar.m_wndMyCombo.AddString("50%");
""m_wndToolBar.m_wndMyCombo.AddString("75%");
"
""//选择默认项
""m_wndToolBar.m_wndMyCombo.SetCurSel(0);
""
""//获取到内容并MSGBOX显示出来
""m_wndToolBar.SetButtonInfo(index, ID_TOOL_COMBO, TBBS_SEPARATOR, 120);
""m_wndToolBar.GetItemRect(index, &rect);
ห้องสมุดไป่ตู้""
相关文档
最新文档