我的MFC/C++学习笔记 http://blog.bccn.net/CrystalFan/6909

2009.07.31 ------------------------------------------------------------------------------------ No.1 /*调用外部程序*/ ::ShellExecute(NULL,"open","NOTEPAD.EXE","E:\\学习\\计算机学习\\面向对象程序设计\\学习笔记\\MFC学习笔记.txt","E:\\学习\\计算机学习\\面向对象程序设计\\学习笔记\\MFC学习笔记.txt",SW_SHOWDEFAULT); 原型: WINSHELLAPI HINSTANCE APIENTRY ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd); ------------------------------------------------------------------------------------ No.2 /*以命令行方式调用外部程序*/ ::WinExec("NOTEPAD.EXE E:\\学习\\计算机学习\\面向对象程序设计\\学习笔记\\MFC学习笔记.txt",SW_SHOWDEFAULT); 原型: WINBASEAPI UINT WINAPI WinExec(LPCSTR lpCmdLine,UINT uCmdShow); ------------------------------------------------------------------------------------ No.3 /*SystemParametersInfo*/ //设置桌面壁纸 SystemParametersInfo(SPI_SETDESKWALLPAPER,0,lpPath,0); //屏蔽掉系统键 SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);  //可屏蔽 Ctrl+Alt+Del  //Alt+F4 在OnSysCommand()中可以取消  //另见No.42,in 3; SystemParametersInfo(SPI_SETSWITCHTASKDISABLE,true,&bOld,SPIF_UPDATEINIFILE); 原型: WINUSERAPI BOOL WINAPI SystemParametersInfo( UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni); 参数 uiAction 具体值参见文件: E:\学习\计算机学习\面向对象程序设计\学习笔记\相应文档\SystemParametersinfo.txt ------------------------------------------------------------------------------------ No.4 /*文件处理之浏览文件*/ 1.定义: OPENFILENAME file={0}; 2.为file.lpstrFile申请空间: char lpPath[260]={0}; file.lpstrFile=lpPath; 3.为file赋其他初值: file.lStructSize=sizeof(OPENFILENAME); file.lpstrFile=lpPath; file.nMaxFile=260; file.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files\0*.*\0\0"; file.nFilterIndex=1; 4.调用GetOpenFileName函数: if(GetOpenFileName(&file)!=0) {...}; 就可得到文件名,在lpPath所指字符串中。 ------------------------------------------------------------------------------------ No.5 /*文件处理之搜索文件*/

1.初始化,设置搜索条件(路径,后缀名等,例中由dir决定): CFileFind ff; CString dir("D:\\MyDir\\*.txt"); BOOL bfile=ff.FindFile(dir); 2.循环调用ff.FindNextFile函数进行搜索: while(bfile) { bfile=ff.FindNextFile(); if(!(ff.IsDots())&&!(ff.IsDirectory())) {...}; }; 3.搜索结果有三种: (1)Dots: "."表示本层目录,".."表示上一层目录,此时ff.IsDots()返回值为TRUE; (2)Directory: 子目录,此时ff.IsDirectory()返回值为TRUE; (3)文件 4.对每个查找到的文件可以查看文件信息: (1)BOOL GetCreationTime(CTime &); 或BOOL GetCreationTime(FILETIME*); BOOL GetLastAccessTime(CTime &); 或BOOL GetLastAccessTime(FILETIME*); BOOL GetLastWriteTime(CTime &); 或BOOL GetLastWriteTime(FILETIME*); (2)CString GetFileName(); //文件名.后缀名 (3)CString GetFilePath(); //全路径+文件名.后缀名 (4)CString GetFileTitle(); //只有文件名 (5)CString GetRoot(); (6)DWORD GetLength(); 或__int64 GetLength64(); (7)BOOL IsHidden(); BOOL IsNormal(); BOOL IsReadOnly(); BOOL IsSystem(); BOOL IsTemporary(); ------------------------------------------------------------------------------------ No.6 /*文件处理之一般处理*/ 1.进入文件夹(设置工作文件夹):     chdir(LPTSTR path);     SetCurrentDirectory(LPCTSTR lpPathName); 2.文件删除: BOOL DeleteFile(LPTSTR lpFileName); 3.文件复制: BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists);其中参数bFailIfExists告诉系统当目标文件存在时如何操作,当bFailIfExists为true时,如果目标文件存在,则函数执行失败;当bFailIfExists为false时,如果目标文件存在,则覆盖目标文件。 4.文件重命名: BOOL RenameFile(const AnsiString OldName, const AnsiString NewName); 5.返回文件的完整的路径名和文件名: AnsiString ExpandFileName(AnsiString FileName); 6.返回指定文件的文件名: AnsiString ExtractFileName(AnsiString FileName); 7.返回指定文件的扩展名: AnsiString ExtractFileExt(AnsiString FileName); 8.创建新文件夹: BOOL CreateDirectory( LPCTSTR lpPathName,LPSECURITY_ATTRIBUTES lpSecurityAttributes);lpSecurityAttributes为安全属性。 9.移动存在的文件或目录: BOOL MoveFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName); 10.创建文件(即打开文件): CreateFile(...); 11.关闭文件: CloseHandle(); ------------------------------------------------------------------------------------ No.7 /*获取用户名和计算机名:*/ GetUserName(LPTSTR lpName,LPDWORD lpSize); GetComputerName(LPTSTR lpName,LPDWORD lpSize); lpSize表示字符串长度的最大值。      /*获取程序的全路径名*/ DWORD WINAPI GetModuleFileName(HMODULE hModule,LPSTR lpFilename,DWORD nSize); 获得自己的全路径名时第一个参数用NULL,路径名保存在lpFilename中。 ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.8.1 ------------------------------------------------------------------------------------ No.8 /*动态链接库(dll文件)的生成*/ 1.非MFC动态链接库生成 (1)创建 Win32 Dynamic-Link Library 工程; (2)方法一:在H文件中要导出的函数前加上 extern "C" _decspec(dllexport),编译链接即可在Debug文件夹下产生dll文件和lib文件。 (3)方法二:函数前不加 extern "C" _decspec(dllexport),在工程中新建一个“工程名.DEF”的文件,输入: LIBRARY 工程名 DESCRIPTION "简要介绍,此行可以省略" EXPORTS //重要,不可省略 函数名1 @序号1 //@序号1 可以省略 ... 函数名n @序号n 2.扩展MFC动态链接库的生成(创建时类型选择第三个--MFC Extension DLL(using shared MFC DLL)) (1)导出普通函数:在H文件的函数声明前加上 “extern "C" AFX_EXT_API”即可(AFX_EXT_API表示_decspec(dllexport)或_decspec(dllimport),也可按第二种方法导出,在DEF文件中添加函数列表); (2)导出类:在H文件的类声明第一行改为“class AFX_EXT_CLASS 类名”即可; (3)资源导出:创建或导入资源过程与平时一样,只要最后将所创建资源ID号的定义代码(如“#define IDR_MENU_TEST 1000 ”)拷贝到H文件中即可; (4)完成上述操作,点击Build,则在Debug文件夹中生成dll文件和lib文件,注意保留H文件。 3.普通MFC动态链接库的生成(创建时类型选择第一个和第二个--Regular DLL ...) (1)只能用第二种方法导出函数,资源的导出与上面一样,不能导出MFC库类,但可以在内部使用任何MFC类和C++类。 (2)此方法导出的链接库可被其他 Win32 编程环境使用。 (3)两种Regular DLL类型开发步骤一样,只是生成的代码不一样,静态的将MFC库函数全都加载到 .dll文件中,而动态的(第二个)则只在.dll文件中提供一个入口地址。 ------------------------------------------------------------------------------------ No.9 /*使用动态链接库*/ 1.函数与类的导入使用(隐式链接) (1)包含原链接库文件对应的H文件; (2)将dll文件和相应lib文件复制到工程文件夹下; (3)在【Project】->【Settings】->【Link】选项卡中,【Object/Library modules】框中填入lib文件的文件名和后缀名; (4)若原H文件中有_decspec(dllexport),则改为_decspec(dllimport); 则动态链接库中的类和函数均可正常使用。 2.函数的导入使用(显式链接) (1)进行上面的步骤(1)(2); (2)定义函数指针类型:typedef (*PFUNC) (形参列表); (3)载入DLL库:HINSTANCE hdll=LoadLibrary("*.dll"); (4)获取函数指针:PFUNC pFunc=(PFUNC)GetProcAddress(hdll,"函数名"); (5)调用函数后,释放DLL:FreeLibrary(hdll); 3.资源的导入使用(显式链接,以菜单导入为例) (1)进行1中的步骤(1)(2); (2)载入DLL库:HINSTANCE hdll=LoadLibrary("*.dll"); (3)菜单加载与绘制: HMENU hmenu=LoadMenu(hdll,MAKEINTRESOURCE(资源ID)); ::SetMenu(this->GetSafeHwnd(),hmenu); ::DrawMenuBar(this->GetSafeHwnd()); //以上两行中this指针为对话框类指针 (4)释放DLL:FreeLibrary(hdll); (5)对于从动态链接库中导入的资源,MFC建立类向导无法自动生成消息响应函数,必须自己手动添加,共三处:消息响应类H文件中添加消息响应函数声明(前面要加afx_msg);消息响应类CPP文件中添加消息响应函数实现部分;消息响应类CPP文件中添加消息响应的命令映射,如在BEGIN_MESSAGE_MAP(CMyDialog,CDialog)和END_MESSAGE_MAP()之间添加ON_COMMAND(菜单ID,响应函数名)。 ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.8.2 ------------------------------------------------------------------------------------ No.10 /*资源符号ID前缀命名规则*/ '类型'   '前缀' 位图   IDB_ 光标   IDC_ 图标   IDI_ 菜单/加速键 IDR_ 串表   IDS_ 对话框   IDD_ 消息框   IDP_ 控件   IDC_ 命令   ID_ ------------------------------------------------------------------------------------ No.11 /*匈牙利命名法前缀命名规则*/ '数据类型'  '前缀' '示例' Boolean      b     bool bIsUpper;BOOL bGetEnd; char         c   char cLetter; string      str  string strName;CString strMajor; char*      sz   char* szAppName="WinApp"; //含所有以'\0'结束的字符串 int        n,i  int nCount,iNumber; short int   si   short siNumberOfStudent; long int   l   long lID_card; float      f   float fArea; double     d   double dArea; long double  ld   long double ldRate; 句柄(HXXX)   h   HINSTANCE hInstance; 文件输入流   if   ifstream ifDataInFile; 文件输出流   of   ofstream ofDataOutFile; 结构体(Struct)S   struct SAddress; 类(Class)   C   class CStudent; 无符号的     u   unsigned int uCard; 静态的      s   static int siInst; 类或结构体成员m_   CString m_strName; 指针/长指针  p/lp  int* piHead; 坐标        x,y  int x,y; ------------------------------------------------------------------------------------ No.12 /*用CCriticalSection和CSingleLock使线程同步*/ 在 stdafx.h 里加上 #include CCriticalSection cs; int nCount=0; CString mStr; UINT ThreadProc(LPVOID lpParam) {  LPSTR lpStr=(LPSTR)lpParam;  CSingleLock singlelock(&cs);  singlelock.Lock();  ::MessageBox(NULL,"Thread has access to the criticalsection",lpStr,MB_ICONINFORMATION);  return 0; }
void CUseThread3Dlg::OnThread() {  mStr.Format(_T("Thread%d"),nCount++);  AfxBeginThread(ThreadProc,(LPSTR)LPCTSTR(mStr)); } ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.8.10 ------------------------------------------------------------------------------------ No.13 /*多线程编程*/ 1.定义传递给线程的变量的结构体类型//在调用线程的类的H文件中 struct threadInfo { }; 注意:在线程中要改变的变量要传指针或引用,就如函数变量传递。 2.定义传递给线程的变量的结构体变量和线程函数//在调用线程的类的CPP文件中 threadInfo Info;                 //如果只有一个变量,则不用定义结构体,直接传指针 UINT ThreadProc(LPVOID lpParam) {     threadInfo* pInfo=(threadInfo*)lpParam;     ...     return 0; } 3.初始化并启动线程//在调用处 先给结构体变量各成员赋初值; 在H文件中定义:CWinThread* m_pThread;//非必要 在调用处:m_pThread=AfxBeginThread(ThreadProc,&Info); ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.8.11 ------------------------------------------------------------------------------------ No.14 /*声音文件播放*/ 1.导入声音头文件和文件库     在要播放声音文件的类的CPP文件中加入:         #include "mmsystem.h"//导入声音头文件         #pragma comment(lib,"winmm.lib")//导入声音头文件库 2.使用sndPlaySound函数播放声音:     BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound); 只能播放文件:  sndPlaySound("MYSOUND.WAV",SND_ASYNC); 3.使用PlaySound函数播放:     BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound); (1)播放指定路径的文件: PlaySound("c:\\win95\\media\\The Microsoft Sound.wav",NULL,SND_FILENAME|SND_ASYNC); (2)播放导入的声音资源: PlaySound((LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC); PlaySound(MAKEINTRESOURCE(IDR_WAVE2),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP); (3)播放系统声音: PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC); 4.播放标志以及含义:     SND_APPLICATION 用应用程序指定的关联来播放声音。     SND_ALIAS pszSound参数指定了注册表或WIN.INI中的系统事件的别名。     SND_ALIAS_ID pszSound参数指定了预定义的声音标识符。     SND_ASYNC 用异步方式播放声音,PlaySound函数在开始播放后立即返回。     SND_FILENAME pszSound参数指定了WAVE文件名。     SND_LOOP 重复播放声音,必须与SND_ASYNC标志一块使用。     SND_MEMORY 播放载入到内存中的声音,此时pszSound是指向声音数据的指针。     SND_NODEFAULT     不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。     SND_NOSTOP PlaySound不打断原来的声音播出并立即返回FALSE。     SND_NOWAIT 如果驱动程序正忙则函数就不播放声音并立即返回。     SND_PURGE 停止所有与调用任务有关的声音。     若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。     SND_RESOURCE pszSound参数是WAVE资源的标识符,这时要用到hmod参数。     SND_SYNC 同步播放声音,在播放完后PlaySound函数才返回。 ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.8.12 ------------------------------------------------------------------------------------ No.15 /*CFile类*/ CFile的成员函数实现了对Win32文件操作函数的封装,完成以下动作:打开、创建、关闭文件,文件指针定位,文件的锁定与解锁,文件状态的读取和修改,等等。其中,用到了m_hFile文件句柄的一般是虚拟函数,和此无关的一般是静态成员函数。 1.文件访问和共享模式: enum OpenFlags { //第一(从右,下同)至第二位,打开文件时访问模式,读/写/读写 modeRead = 0x0000, modeWrite = 0x0001, modeReadWrite = 0x0002, shareCompat = 0x0000, //32位MFC中没用 //第五到第七位,打开文件时的共享模式 shareExclusive = 0x0010,//独占方式,禁止其他进程读写 shareDenyWrite = 0x0020,//禁止其他进程写 shareDenyRead = 0x0030,//禁止其他进程读 shareDenyNone = 0x0040,//允许其他进程写 //第八位,打开文件时的文件继承方式 modeNoInherit = 0x0080,//不允许子进程继承 //第十三、十四位,是否创建新文件和创建方式 modeCreate = 0x1000,//创建新文件,文件长度0 modeNoTruncate = 0x2000,//创建新文件时如文件已存在则打开 //第十五、十六位,文件以二进制或者文本方式打开,在派生类CStdioFile中用 typeText = 0x4000, typeBinary = (int)0x8000 }; 2.文件属性:正常、只读、隐含、系统文件,文件或者目录 enum Attribute { normal = 0x00, readOnly = 0x01, hidden = 0x02, system = 0x04, volume = 0x08, directory = 0x10, archive = 0x20 }; 3.文件位置:头、尾、当前 enum SeekPosition{ begin = 0x0, current = 0x1, end = 0x2 }; 4.空文件句柄: enum { hFileNull = -1 }; 5.变量成员: 'UINT m_hFile;' 该成员变量是public访问属性,保存了CreateFile返回的操作系统的文件句柄。 MFC重载了运算符号HFILE来返回m_hFile,这样在使用HFILE类型变量的地方可以使用CFile对象。 'BOOL m_bCloseOnDelete;' 'CString m_strFileName;' 这两个成员变量是protected访问属性。 m_bCloseOnDelete用来指示是否在关闭文件时删除CFile对象;m_strFileName用来保存文件名。 6.成员函数: (1)构造函数: ①CFile(); //缺省构造函数,仅仅构造一个CFile对象,还必须使用Open成员函数来打开文件。 ②CFile(int hFile); //已经打开了一个文件hFile,在此基础上构造一个CFile对象来给它打包。 hFile将被赋值给CFile的成员变量m_hFile。 ③CFile(LPCTSTR lpszFileName, UINT nOpenFlags); //指定一个文件名和文件打开方式,构造CFile对象,调用Open打开/创建文件, 把文件句柄保存到m_hFile。 (2)打开/创建文件 ④BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags,CFileException* pException); //Open调用Win32函数::CreateFile打开文件,并把文件句柄保存到成员变量m_hFile中。 CreateFile函数的原型如下: HANDLE CreateFile(     LPCTSTR lpFileName,// pointer to name of the file     DWORD dwDesiredAccess,// access (read-write) mode     DWORD dwShareMode,// share mode     LPSECURITY_ATTRIBUTES lpSecurityAttributes, //pointer to security descriptor     DWORD dwCreationDistribution,// how to create     DWORD dwFlagsAndAttributes,// file attributes     HANDLE hTemplateFile// handle to file with attributes to copy     ); ------------------------------------------------------------------------------------ No.16 /*MFC中获取各种类指针*/ 1、获取应用程序指针   CMyApp* pApp=(CMyApp*)AfxGetApp(); 2、获取主框架指针   CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针。   CMainFrame* pMainFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd);   或者   CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd(); 3、获取菜单指针   CMenu* pMenu = AfxGetMainWnd()->GetMenu(); 4、获取工具栏、状态栏指针   主框架中可以直接使用m_wndToolBar、m_wndStatusBar。   其他:   CToolBar* pToolBar = (CToolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);   CStatusBar* pStatusBar = (CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR); 5、获取控件指针   先用 GetDlgItem() 再转换,如:   CButton* pButton = (CButton*)GetDlgItem(IDC_MYBUTTON); 6、获取文档、视图指针 SDI: CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd(); CYourDoc* pDoc = (CYourDoc*)pMainFrame->GetActiveDocument(); CYourView* pView = (CYourView*)pMainFrame->GetActiveView();
MDI: CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd(); CChildFrame* pChildFrame = (CChildFrame*)pMainFrame->GetActiveFrame(); CYourDoc* pDoc = (CYourDoc*)pChildFrame->GetActiveDocument(); CYourView* pView = (CYourView*)pChildFrame->GetActiveView(); 7、文档、视图 从视图获取文档指针: CYourDoc* pDoc = GetDocument(); 从文档获取视图指针: 利用成员函数 GetFirstViewPosition() 和 GetNextView() 遍历。 virtual POSITION GetFirstViewPosition() const; virtual CView* GetNextView(POSITION& rPosition) const; SDI: CYourView* pView; POSITION pos = GetFirstViewPosition(); pView = GetNextView(pos);
MDI: 定义函数 CView* CYourDoc::GetView(CRuntimeClass* pClass) {     CView* pView;     POSITION pos=GetFirstViewPosition();     while(pos!=NULL)     {         pView=GetNextView(pos);          if(!pView->IsKindOf(pClass))              break;     }     if(!pView->IsKindOf(pClass))     {         AfxMessageBox("Connt Locate the View.");        return NULL;     }     return pView; } 使用如下: CYourView* pView=(CYourView*)GetView(RUNTIME_CLASS(CYourView)); 8、文档模版、文档 从文档获取文档模版指针: CDocTemplate* GetDocTemplate() const; 从文档模版获取文档指针: viaual POSITION GetFirstDocPosition( ) const = 0; visual CDocument* GetNextDoc(POSITION & rPos) const = 0; 9、获取分割视图中各个视图的指针 主框架中定义:CSplitterWnd m_wndSplitter; 定义两个View类:CView1、CView2; 框架类中重载: BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext) {     VERIFY(m_splitter.CreateStatic(this,2,1)); //分割成两行一列     VERIFY(m_splitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(100,100),pContext));     VERIFY(m_splitter.CreateView(1,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext));     return TRUE; } 获取分割视图指针 CView1* pView1 = (CView1*)m_wndSplitter.GetPane(0,0); CView2* pView2 = (CView2*)m_wndSplitter.GetPane(1,0); 10、通过鼠标获得子窗口指针 CWnd* ChildWindowFromPoint(POINT point) const; CWnd* ChildWindowFromPoint(POINT point,UINT nFlags) const; 用于确定包含指定点的子窗口 如果指定点在客户区之外,函数返回NULL; 如果指定点在客户区内,但是不属于任何一个子窗口,函数返回该CWnd的指针; 如果有多个子窗口包含指定点,则返回第一个子窗口的指针。 还要注意的是,该函数返回的是一个伪窗口指针,不能将它保存起来供以后使用。 对于第二个参数nFlags有几个含义: CWP_ALL             file://不忽略任何子窗口 CWP_SKIPNIVSIBLE    file://忽略不可见子窗口 CWP_SKIPDISABLED    file://忽略禁止的子窗口 CWP_SKIPRANSPARENT file://忽略透明子窗口 ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.8.13 ------------------------------------------------------------------------------------ No.17 /*在多文档界面下去掉开始的子窗口*/ 在多文档界面下,自动生成一个新的子窗口,而一个实际的应用系统往往是由用户操作后再生成新的窗口。为了去掉开始的子窗口,可在应用程序文件分析命令行的语句 CcommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); 后加入: cmdInfo.m_nShellCommand=CcommandLineInfo::FileNothing; 去掉子窗口后,就只剩下主框架窗口了。因为在多文档界面中,系统生成两个菜单:一个是用户的菜单,另一个是系统主框架菜单。通常用户工作在用户菜单。为了保证菜单界面不变,可修改主框架菜单资源,使其与用户菜单保持一致。 ------------------------------------------------------------------------------------ No.18  /*系统相关特殊功能*/ //隐藏WINDOWS系统任务栏     ::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_HIDE); //窗体总在总前面     SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE); //屏蔽掉系统键     SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE); //设置开机自启动键值     TCHAR strCurDirectory[255];     GetModuleFileName( NULL, strCurDirectory, 255 );//获取当前程序全路径名     CRegistry Reg;//CRegistry类不可用,要自己写,只是想说明过程  Reg.SetRootKey(HKEY_LOCAL_MACHINE);     Reg.SetKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);     Reg.WriteString ("FixYou",strCurDirectory); //删除开机自启动键值     CRegistry Reg;//CRegistry类不可用,要自己写,只是想说明过程     Reg.SetRootKey(HKEY_LOCAL_MACHINE);     Reg.SetKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);     Reg.DeleteValue( "FixYou"); //隐藏/显示鼠标     ShowCursor(false/true); //设置鼠标的移动范围     ClipCursor(CRect rect);//NULL表示取消鼠标锁定 //设置对话框背景和文本颜色     在App的  SetDialogBkColor(RGB(160,180,220),RGB(0,0,0)); //一次只运行一个程序实例,如果已运行则退出     在App类的InitInstance()函数中:  if( FindWindow(NULL,"App名字")) exit(0); ------------------------------------------------------------------------------------ No.19 /*获取系统可用磁盘*/     #include     DWORD dx=GetLogicalDrives();     获得的dx每一位表示一个盘符的有效性,从低位到高位依次为A~Z,1表示可用。 ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.8.15 ------------------------------------------------------------------------------------ No.20 /*键盘键值(标准集)*/ #include //Virtual Keys, Standard Set #define VK_LBUTTON        0x01 #define VK_RBUTTON        0x02 #define VK_CANCEL         0x03 #define VK_MBUTTON        0x04    // NOT contiguous with L & RBUTTON
#define VK_BACK           0x08 #define VK_TAB            0x09
#define VK_CLEAR          0x0C #define VK_RETURN         0x0D
#define VK_SHIFT          0x10 #define VK_CONTROL        0x11 #define VK_MENU           0x12 #define VK_PAUSE          0x13 #define VK_CAPITAL        0x14
#define VK_KANA           0x15 #define VK_HANGEUL        0x15  // old name - should be here for compatibility #define VK_HANGUL         0x15 #define VK_JUNJA          0x17 #define VK_FINAL          0x18 #define VK_HANJA          0x19 #define VK_KANJI          0x19
#define VK_ESCAPE         0x1B
#define VK_CONVERT        0x1C #define VK_NONCONVERT     0x1D #define VK_ACCEPT         0x1E #define VK_MODECHANGE     0x1F
#define VK_SPACE          0x20 #define VK_PRIOR          0x21 #define VK_NEXT           0x22 #define VK_END            0x23 #define VK_HOME           0x24 #define VK_LEFT           0x25 #define VK_UP             0x26 #define VK_RIGHT          0x27 #define VK_DOWN           0x28 #define VK_SELECT         0x29 #define VK_PRINT          0x2A #define VK_EXECUTE        0x2B #define VK_SNAPSHOT       0x2C #define VK_INSERT         0x2D #define VK_DELETE         0x2E #define VK_HELP           0x2F
// VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39)
// VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A)
#define VK_LWIN           0x5B #define VK_RWIN           0x5C #define VK_APPS           0x5D
#define VK_NUMPAD0        0x60 #define VK_NUMPAD1        0x61 #define VK_NUMPAD2        0x62 #define VK_NUMPAD3        0x63 #define VK_NUMPAD4        0x64 #define VK_NUMPAD5        0x65 #define VK_NUMPAD6        0x66 #define VK_NUMPAD7        0x67 #define VK_NUMPAD8        0x68 #define VK_NUMPAD9        0x69 #define VK_MULTIPLY       0x6A #define VK_ADD            0x6B #define VK_SEPARATOR      0x6C #define VK_SUBTRACT       0x6D #define VK_DECIMAL        0x6E #define VK_DIVIDE         0x6F #define VK_F1             0x70 #define VK_F2             0x71 #define VK_F3             0x72 #define VK_F4             0x73 #define VK_F5             0x74 #define VK_F6             0x75 #define VK_F7             0x76 #define VK_F8             0x77 #define VK_F9             0x78 #define VK_F10            0x79 #define VK_F11            0x7A #define VK_F12            0x7B #define VK_F13            0x7C #define VK_F14            0x7D #define VK_F15            0x7E #define VK_F16            0x7F #define VK_F17            0x80 #define VK_F18            0x81 #define VK_F19            0x82 #define VK_F20            0x83 #define VK_F21            0x84 #define VK_F22            0x85 #define VK_F23            0x86 #define VK_F24            0x87
#define VK_NUMLOCK        0x90 #define VK_SCROLL         0x91
// VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys. // Used only as parameters to GetAsyncKeyState() and GetKeyState(). // No other API or message will distinguish left and right keys in this way. #define VK_LSHIFT         0xA0 #define VK_RSHIFT         0xA1 #define VK_LCONTROL       0xA2 #define VK_RCONTROL       0xA3 #define VK_LMENU          0xA4 #define VK_RMENU          0xA5
#if(WINVER >= 0x0400) #define VK_PROCESSKEY     0xE5 #endif
#define VK_ATTN           0xF6 #define VK_CRSEL          0xF7 #define VK_EXSEL          0xF8 #define VK_EREOF          0xF9 #define VK_PLAY           0xFA #define VK_ZOOM           0xFB #define VK_NONAME         0xFC #define VK_PA1            0xFD #define VK_OEM_CLEAR      0xFE ------------------------------------------------------------------------------------ No.20 /*系统消息*/ #include #ifndef NOSYSCOMMANDS // begin_r_winuser //System Menu Command Values   #define SC_SIZE         0xF000 #define SC_MOVE         0xF010   //移动,只有右击标题栏单击移动会激活 #define SC_MINIMIZE     0xF020          //最小化 #define SC_MAXIMIZE     0xF030          //最大化 #define SC_NEXTWINDOW   0xF040 #define SC_PREVWINDOW   0xF050 #define SC_CLOSE        0xF060          //关闭窗体 #define SC_VSCROLL      0xF070 #define SC_HSCROLL      0xF080 #define SC_MOUSEMENU    0xF090 #define SC_KEYMENU      0xF100 #define SC_ARRANGE      0xF110 #define SC_RESTORE      0xF120   //窗口恢复,从工具栏恢复 #define SC_TASKLIST     0xF130 #define SC_SCREENSAVE   0xF140 #define SC_HOTKEY       0xF150 #if(WINVER >= 0x0400) #define SC_DEFAULT      0xF160 #define SC_MONITORPOWER 0xF170 #define SC_CONTEXTHELP  0xF180 #define SC_SEPARATOR    0xF00F #endif //WINVER >= 0x0400
#define SC_ICON         SC_MINIMIZE #define SC_ZOOM         SC_MAXIMIZE
// end_r_winuser #endif 另外:       0x0f12为鼠标左键点击标题栏   0x0f93为鼠标左键点击标题栏上的图标 ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.8.16 ------------------------------------------------------------------------------------ No.21 /*设置位图按钮*/ 1.初始化控件  绘制控件时,在按钮的【Styles】属性中选中【Owner draw】和【Bitmap】; 2.声明按钮变量  将每一个按钮对应一个CButton类对象,然后将类名改为CBitmapButton; 3.载入位图资源  每个按钮变量至少载入1张位图,一般要载入4张,表示4中按钮状态:   ①正常显式,ID号一般以"U"结尾;   ②按钮处于焦点,ID号一般以"F"结尾;   ③按钮被按下,ID号一般以"D"结尾;   ④按钮不可用,ID号一般以"X"结尾。 3.按钮变量初始化  在对话框的 OnInitDialog()函数中,用CBitmapButton::LoadBitmaps()函数为每个按钮变量载入对应位图资源,如:  m_DelBtn.LoadBitmaps(IDB_DEL_UP,IDB_DEL_DOWN,IDB_DEL_FOCUS,IDB_DEL_DISABLE); ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.8.19 ------------------------------------------------------------------------------------ No.22 /*设置对话框背景画刷、字体、字体颜色和文字覆盖模式*/ 重载对话框消息 WM_CTLCOLOR 的映射函数 HBRUSH CMFCDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); 在pDC上改。 pWnd是正在绘制的控件。 1.设置字体颜色  pDC->SetTextColor(COLORREF TextColor); 2.设置文字覆盖模式  pDC->SetBkMode(TRANSPARENT/OPAQUE); 3.设置字体  ①在对话框类中定义CFont对象m_xxFont;  ②初始化  ③在OnCtlColor()函数中加入代码:   pDC->SelectObject(&m_xxFont); 4.设置背景画刷  ①在对话框类中定义CBrush对象m_xxBrush;  ②初始化  ③将OnCtlColor()函数中return代码改为:   return m_xxBrush; ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.8.21 ------------------------------------------------------------------------------------ No.23 /*窗体渐渐出现*/ AnimateWindow(Handle,1000,AW_CENTER); //在窗体创建事件中 ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.9.5 ------------------------------------------------------------------------------------ No.24 /*托盘操作*/   ①在头文件中定义结构体变量:  NOTIFYICONDATA m_tnid;   ②在CPP文件中的OnCreate()函数中,对上述变量进行初始化:  m_tnid.cbSize=sizeof(NOTIFYICONDATA);  m_tnid.hWnd=this->m_hWnd;     //自定  m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; //自定  m_tnid.uCallbackMessage=MYWM_NOTIFYICON; //用户自定的回调信息  strcpy(m_tnid.szTip,"......");      //鼠标停留时提示信息  m_tnid.uID=IDI_ICON1;      //图标资源标号  LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));   ③托盘函数:  ::Shell_NotifyIcon(NIM_ADD,&m_tnid);  //添加托盘图标  ::Shell_NotifyIcon(NIM_DELETE,&m_tnid);  ::Shell_NotifyIcon(NIM_MODIFY,&m_tnid);   ④窗口显示代码(点击托盘图标之后):   托盘消息响应函数定义:   afx_msg LRESULT OnNotify***(WPARAM wParam,LPARAM lParam);   根据 lParam的值决定操作。(lParam的值可能是WM_RBUTTONDOWN、WM_RBUTTONDOWN)   用一个变量bool m_bShowFlag 表示当前窗口显示状态。  if (m_bShowFlag)   ::SetForegroundWindow(AfxGetMainWnd()->m_hWnd);  ::ShowWindow(AfxGetMainWnd()->m_hWnd,m_bShowFlag);  m_bShowFlag=!m_bShowFlag;   ⑤鼠标右键单击弹出选单  CMenu menu;  menu.LoadMenu(IDR_MY_MENU); //载入事先定义的选单  CMenu*pMenu=menu.GetSubMenu(0);  CPoint pos;  GetCursorPos(&pos);  pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());   ⑥NOTIFYICONDATA 定义:   typedef struct _NOTIFYICONDATA {     DWORD cbSize;     // 结构大小(sizeof struct),必须设置     HWND hWnd;     // 发送通知消息的窗口句柄     UINT uID;      //  图标ID ( 由回调函数的WPARAM 指定)     UINT uFlags;     UINT uCallbackMessage;   // 消息被发送到此窗口过程     HICON hIcon;     // 图标句柄  //鼠标停留在托盘图标上时的提示文本     #if (_WIN32_IE < 0x0500)         WCHAR  szTip[64];     #else         WCHAR  szTip[128];     #endif     //显示气球提示     #if (_WIN32_IE >= 0x0500)         DWORD dwState;         DWORD dwStateMask;         WCHAR  szInfo[256];         union {             UINT  uTimeout;             UINT  uVersion;         } DUMMYUNIONNAME;         WCHAR  szInfoTitle[64];         DWORD dwInfoFlags;     #endif } NOTIFYICONDATA, *PNOTIFYICONDATA;   ⑦uFlags的值:  #define NIF_MESSAGE 0x1   // 表示uCallbackMessage 有效  #define NIF_ICON    0x2   // 表示hIcon 有效  #define NIF_TIP     0x4   // 表示szTip 有效     ⑧气球提示:(暂时用不了)     在NOTIFYICONDATA.uFlags中的标志之一是NIF_TIP,用它来设置传统的信息提示, 即鼠标要移动到图标上。新的标志NIF_INFO(由于_WIN32_IE >= 0x0500 条件定义, 因此在编译时, 请注意包含最新版本的头文件shellapi.h, 并保证链接最新版本的库文件shell32.lib, 分发程序时用最新版本的运行时动态链接库shell32.dll)便是为显示气球提示所用的。 也就是说,要显示气球提示,那么在调用Shell_NotifyIcon函数时必须用NIF_INFO标志。提示文本填入szInfo域,标题文本填 入szInfoTitle。你甚至可以在NOTIFYICONDATA.uTimeout中设置一个超时时间,当经过指定的毫秒数之后,气球提示自动隐藏。     m_nid.cbSize=sizeof(NOTIFYICONDATA);  m_nid.uFlags = NIF_INFO;  m_nid.uTimeout = uTimeout;  m_nid.dwInfoFlags = dwInfoFlags;  strcpy(m_nid.szInfo,szMsg ? szMsg : _T(""));  strcpy(m_nid.szInfoTitle,szTitle ? szTitle : _T(""));  Shell_NotifyIcon(NIM_MODIFY, &m_nid);     缺省的dwInfoFlags设置为NIIF_INFO,在文本旁边显示信息图标;其它可能的标志 是NIIF_ERROR——表示出错,NIIF_WARNING——表示警告,NIIF_NONE——没有图标。     只有一种方法可以显示气球提示(Shell_NotifyIcon),但终止的方法有多种。用户可以在气球上单击鼠标,也可以单击关闭按钮(在Windows 2000 里没有关闭按钮), 或者Windows用超时机制来终止气球提示。每当创建托盘图标时,你可以提供一个HWND和消息ID来接收事件发生的通知。如果用户单击气球提示,Windows发送NIN_BALLOONUSERCLICK;如果超时或者单击关闭按钮,Windows则发送NIN_BALLOONTIMEOUT。就我所知,目前还没有办法区分是超时还是单击了关闭按钮。下表中列出的是所有与气球提示相关的通知消息: 通知消息  描述 NIN_BALLOONSHOW  显示气球提示时发送 NIN_BALLOONHIDE 气球提示消失时发送;例如,当图标被删除,如果因为超时或是用户单击鼠标气球消失,此消息不会被发送 NIN_BALLOONTIMEOUT 当由于超时或者用户单击气球上的关闭按钮(X),使气球消失时发送此消息 NIN_BALLOONUSERCLICK 当用户在气球提示上或托盘图标上单击鼠标(此时气球处于显示状态)时发送此消息
------------------------------------------------------------------------------------ No.25 /*获取全屏设备描述符句柄*/  HDC hDC=::GetDC(NULL);  释放:  ::ReleaseDC(NULL,hDC); ------------------------------------------------------------------------------------ No.26 /*读写“ini”文件*/  ::WritePrivateProfileString("分类名","标题","标题所对应的值","文件名");  int ::GetPrivateProfileInt("分类名","标题",int(位数),"文件名"); ------------------------------------------------------------------------------------ No.27 /*系统热键*/   ①注册:  RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_ALT,'B'); //注册热键【Ctrl+Alt+B】  RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_ALT,'b'); //注册热键【Ctrl+Alt+b】   ②热键响应,在消息WM_HOTKEY的响应函数OnHotKey()中:   参数wParam返回热键的键值,上述 1001 和 1002 。  if (1001 == wParam || 1002 == wParam)  {   消息处理代码;  }   ③注销热键(在主窗口被销毁时,即进程结束时):  UnregisterHotKey(m_hWnd,1001);  UnregisterHotKey(m_hWnd,1002); ------------------------------------------------------------------------------------ No.28 /*返回本机IP地址*/  #define MAX_LEN 256  char HostName[MAX_LEN];  CString stHostIP;  gethostname(HostName,MAX_LEN);  struct hostent* pHostEnt;  pHostEnt=gethostbyname(HostName);  if (pHostEnt!=NULL)  {   stHostIP.Format("%d.%d.%d.%d",    (pHostEnt->h_addr_list[0][0] & 0x00ff),    (pHostEnt->h_addr_list[0][1] & 0x00ff),    (pHostEnt->h_addr_list[0][2] & 0x00ff),    (pHostEnt->h_addr_list[0][3] & 0x00ff));  } ------------------------------------------------------------------------------------ No.29 /*修改进程权限*/  HANDLE hToken;  TOKEN_PRIVILEGES tkp;  OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken);   //打开一个进程的访问令牌;   //GetCurrentProcess()返回本进程的句柄。  LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);   //修改进程权限。  tkp.PrivilegeCount=1;  tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;  AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(TOKEN_PRIVILEGES)NULL,0);   之后可以调用:  ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0);   //重启Windows  ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);  //关闭Windows  InitiateSystemShutdown(NULL,NULL,0,TRUE,FALSE); //快速重启 ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.9.16 ------------------------------------------------------------------------------------ No.30 /*截获Windows发送的消息到指定类*/  CSubclassWnd类可以截获Windows消息,并将它发送到另外一个窗口消息处理例程中处理,而不是发送到Windows自己默认的消息处理函数。  CSubclassWnd通过安装它自己的窗口过程,从而先于MFC一步对消息进行处理。 ------------------------------------------------------------------------------------ No.31 /*在Explorer重启后恢复托盘图标*/  如果你用的操作系统是Windows 98, 或者你安装了IE 4.0 的桌面。那么不论什么时候,只要IE 4.0 启动了任务栏,那么它就会向所有最顶层父窗口广播一个注册消息:TaskbarCreated。有了这个线索,你就可以重新创建图标。如果你用MFC编程,那么只要定义一个全程变量保存这个注册消息并实现ON_REGISTERED_MESSAGE消息处理例程即可:  const UINT WM_TASKBARCREATED =     ::RegisterWindowMessage(_T("TaskbarCreated"));
 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)   ON_REGISTERED_MESSAGE(WM_TASKBARCREATED,OnTaskBarCreated)  END_MESSAGE_MAP(CMainFrame, CFrameWnd)
 LRESULT CMainFrame::OnTaskBarCreated(WPARAM wp, LPARAM lp)  {   VERIFY(InstallIcons());//调用恢复托盘图标函数   return 0;  } ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.12.11 ------------------------------------------------------------------------------------ No.32 /*自定义状态栏(一)*/ 1.申明状态栏分区:  static UINT indicators[] =  {   ID_SEPARATOR,   // 菜单状态提示   ID_PROGRESSTEXT, //在Resource.h中自定义,用于输出文本,在String Table中也要定义   ID_PROGRESSAREA, //在Resource.h中自定义,用于放置进度条控件,在String Table中也要定义   //以下在本例中没有用到   ID_INDICATOR_CAPS, //大小写状态,即【Caps Lock】键状态   ID_INDICATOR_NUM, //小键盘状态,即【Num Lock】键状态   ID_INDICATOR_SCRL, //滚动状态,即【Scroll Lock】键状态   ID_INDICATOR_OVR, //插入/覆盖状态,即【Insert】键状态   ID_INDICATOR_EXT, //后缀名,extended selection indicator   ID_INDICATOR_REC, // record mode indicator   ID_INDICATOR_KANA // kana lock indicator  }; 2.初始化状态栏  ①创建状态栏及分区:  在CMainFrame::OnCreate() 或 CXXXDlg::OnInitDialog()中:   if (!m_wndStatusBar.Create(this) ||    !m_wndStatusBar.SetIndicators(indicators,    sizeof(indicators)/sizeof(UINT)))   {     TRACE0("Failed to create status bar\n");    return -1;      // fail to create   }   RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);  ②设置每一列的宽度:  在CMainFrame::OnCreate() 或 CXXXDlg::OnInitDialog()中:   int pint[]={120,170,-1};   m_wndStatusBar.GetStatusBarCtrl().SetParts(3,pint);   或   for(int i=0;i<3;i++)    m_wndStatusBar.SetPaneInfo(i,indicators[i],SBPS_NORMAL,pint[i]);  3.更新操作:  ①更新文本:   m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_PROGRESSTEXT),str);  ②更新进度条:   m_wndStatusBar.GetItemRect(i,&rect);   //获取某一栏的位置,i为栏号(从0计数)   CProgressCtrl m_Progress;    //在MainFrm.h中定义   m_Progress.Create(WS_VISIBLE|WS_CHILD|PBS_SMOOTH,rect,&m_wndStatusBar,10);   m_Progress.SetRange(0,100);    //设置滚动条范围   m_Progress.SetStep(1); /*自定义状态栏(二) 见No.45*/ ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.12.11 ------------------------------------------------------------------------------------ No.33 /*客户区分栏*/ 1.定义CSplitterWnd对象  在CMainFrame类中定义对象:  CSplitterWnd m_sp; 2.创建分区:  重载CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext),  调用BOOL CreateStatic( CWnd* pParentWnd, //父框架窗口指针,第一次分栏为this             //以后为外层的CSplitterWnd指针                    int nRows,     //行数。这个值必须不超过16。                    int nCols,     //列数。这个值必须不超过16。                    DWORD dwStyle = WS_CHILD | WS_VISIBLE, //指定窗口的风格。                    UINT nID = AFX_IDW_PANE_FIRST//此窗口的子窗口ID             //不是嵌套在另一个分隔器窗口中的             //可以是AFX_IDW_PANE_FIRSH             //否则,用父窗口对应分栏ID             //如m_SpFather.IdFromRowCol(0, 0)      );  如:  m_Sp3.CreateStatic(&m_sp,2,1,WS_CHILD|WS_VISIBLE, m_SpFather.IdFromRowCol(0, 0)); 3.创建视图:  每一个分区对应一个视图:  virtual BOOL CreateView(   int row,      //行号   int col,      //列号   CRuntimeClass* pViewClass,  //指定新视的CRuntimeClass          //用RUNTIME_CLASS(CXXXXView)获取   SIZE sizeInit,     //指定新视的初始尺寸,如CSize(x,y)   CCreateContext* pContext ); //即OnCreateClient的参数  如:  m_sp.CreateView(0,0,RUNTIME_CLASS(CTest1View),CSize(cx*3/4,cy-324), pContext);  m_sp.CreateView(0,0,RUNTIME_CLASS(CControlWnd),CSize(400,400),pContext); 4.若想使分栏固定(即使分栏线不能左右移动)  应该写一个类继承自CSplitterWnd,重载函数:  afx_msg void OnLButtonDown(UINT nFlags, CPoint point);  afx_msg void OnMouseMove(UINT nFlags, CPoint point);  使它们什么都不做。 ------------------------------------------------------------------------------------ ★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ ------------------------------------------------------------------------------------ 2009.12.18 ------------------------------------------------------------------------------------ No.34 /*改变屏幕分辨率及其它*/ 1.获取当前屏幕分辨率及相关信息:  DEVMODE DevMode;  //屏幕信息结构体  EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&DevMode);  //获取当前的数据  int nCurrentWidth = DevMode.dmPelsWidth;  int nCurrentHeight = DevMode.dmPelsHeight; 2.修改分辨率:  DevMode.dmPelsWidth = 1280;  //修改成你想要的分辨率  DevMode.dmPelsHeight = 768;  ChangeDisplaySettings(&DevMode, CDS_UPDATEREGISTRY);  //设置生效 3.结构体DEVMODE的说明:  DEVMODE数据结构中包含了有关设备初始化和打印机环境的信息。  typedef struct _devicemode  {   TCHAR dmDeviceName[32]; //驱动程序支持的设备名称。   WORD dmSpecVersion;  //指定了初始化数据的版本数字。   WORD dmDriverVersion; //打印机驱动程序版本号。   WORD dmSize;   //DEVMODE结构的大小,以字节为单位;      //不包括dmDriverData(与设备有关)成员。   WORD dmDriverExtra;  //包含了后面的私有驱动程序数据的数目。   DWORD dmFields;   //DEVMODE结构的其余成员中哪些已被初始化      //第0位(定义为DM_ORIENTATION)代表dmOrientation      //第1位(定义为 DM_PAPERSIZE)代表dmPaperSize   short dmOrientation; //选择纸的方向。      //DMORIENT_PORTRAIT(1)      //DMORIENT_ LANDSCAPE(2)   short dmPaperSize;  //选择将用于打印的纸张大小   short dmPaperLength; //重定义由dmPaperSize成员指定的纸张长度   short dmPaperWidth;  //重载由dmPaperSize成员指定的纸张宽度   short dmScale;   //指定了打印输出的缩放因子。   short dmCopies;   //若设备支持多页拷贝,表示要打印的数目。   short dmDefaultSource; //保留,必须为0。   short dmPrintQuality; //指定了打印机的分辨率。      //DMRES_HIGH、DMRES_MEDIUM      //DMRES_LOW、DMRES_DRAFT   short dmColor;   //对于彩色打印机,在彩色和单色之间切换。      //DMCOLOR_COLOR、DMCOLOR_MONOCHROME   short dmDuplex;   //为支持双面打印的打印机选择双面打印方式      //DMDUP_SIMPLEX      //DMDUP_HORIZONTAL      //DMDUP_VERTICAL   short dmYResolution; //打印机在y方向的分辨率。   short dmTTOption;  //指明如何打印TrueType字体。      //DMTT_BITMAP 把TrueType字体作为图形打印。      //DMTT_DOWNLOAD 将TrueType字体作为软字体下载。      //DMTT_SUBDEV 用TrueType字体替换设备字体。   short dmCollate;  //在打印多份拷贝的时候是否使用校对。    TCHAR dmFormName[32]; //指定了要使用的格式名字。   WORD dmUnusedPadding; //用于将结构对齐到DWORD边界。

转载于:https://www.cnblogs.com/dengpeng1004/p/3656689.html

你可能感兴趣的:(我的MFC/C++学习笔记 http://blog.bccn.net/CrystalFan/6909)