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边界。