2022年VisualC++编程技巧小结 .pdf
Visual C+编程技巧小结作者: RHU-TAC 教程来源: RHU 点击数:164 更新时间: 2005-12-24 1. 如何获取应用程序的实例句柄? 应用程序的实例句柄保存在CWinAppIm_hInstance 中,可以这么调用AfxGetInstancdHandle 获得句柄 . Example: HANDLE hInstance=AfxGetInstanceHandle(); 2. 如何通过代码获得应用程序主窗口的指针? 主窗口的指针保存在CWinThread:m_pMainWnd中,调用 AfxGetMainWnd实现。AfxGetMainWnd() -ShowWindow(SW_SHOWMAXMIZED); /使程序最大化 . 3. 如何在程序中获得其他程序的图标 ? 两种方法 : (1) SDK 函数 SHGetFileInfo 或使用ExtractIcon 获得图标资源的handle, (2) SDK 函数SHGetFileInfo 获得有关文件的很多信息 ,如大小图标 ,属性 ,类型等 . Example(1): 在程序窗口左上角显示NotePad图标 . void CSampleView: OnDraw(CDC * pDC) if( : SHGetFileInfo(_T(c:pwin95notepad.exe),0,&stFileInfo,sizeof(stFileInfo),SHGFI_ICON) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - pDC -DrawIcon(10,10,stFileInfo.hIcon); Example(2): 同样功能 ,Use ExtractIcon Function void CSampleView: OnDraw(CDC *pDC) HICON hIcon=: ExtractIcon(AfxGetInstanceHandle(),_T(NotePad.exe),0); if (hIcon &hIcon!=(HICON)-1) pDC-DrawIcon(10,10,hIcon); 说明 : 获得 notepad.exe 的路径正规上来说用GetWindowsDirectory 函数得到 ,如果是调用win95 下的画笔, 应该用访问注册表的方法获得其路径,要作成一个比较考究的程序,考虑应该全面点. 4. 如何编程结束应用程序?如何编程控制windows 的重新引导 ? 这是个很简单又是编程中经常要遇到的问题. 第一问 ,向窗口发送WM_CLOSE 消息 ,调用 CWnd:OnClose 成员函数 .允许对用户提示是否保存修改过的数据. Example: AfxGetMainWindow()-SendMessage(WM_CLOSE); 还可以创建一个自定义的函数Terminate Window void Terminate Window(LPCSTR pCaption) CWnd *pWnd=Cwnd:FindWindow(NULL,pCaption); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - if (pWnd) pWnd -SendMessage(WM_CLOSE); 说明 : FindWindow 函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要检测Notepad 是不是已运行而事先不知道Notepad 的标题栏 ,这时 FindWindow 就无能为力了,可以通过枚举windows 任务列表的办法来实现。在 机械出版社 Windows 95 API开发人员指南 一书有比较详细的介绍,这里就不再多说乐。第二问 ,Use ExitWindowsEx Function 函数控制系统是重新引导,还是重启windows. 前面已经有人讲过乐,就不再提了。5. 怎样加栽其他的应用程序? 我记得这好象是出场频度很高的问题。三个 SDK 函数 winexec, shellexecute,createprocess可以使用。WinExec 最简单, 两个参数, 前一个指定路径, 后一个指定显示方式.后一个参数值得说一下,比如泥用SW_SHOWMAXMIZED 方式去加栽一个无最大化按钮的程序,就是Neterm,calc 等等,就不会出现正常的窗体,但是已经被加到任务列表里了。ShellExecute 较 WinExex 灵活一点,可以指定工作目录,下面的Example 就是直接打开c:temp1.txt,而不用加栽与txt 文件关联的应用程序 ,很多安装程序完成后都会打开一个窗口,来显示Readme or Faq,偶猜就是这么作的啦。ShellExecute(NULL,NULL,_T(1.txt),NULL,_T(c:temp),SW_SHOWMAXMIZED); CreateProcess最复杂,一共有十个参数,不过大部分都可以用NULL 代替,它可以指定进程的安全属性,继承信息,类的优先级等等.来看个很简单的Example: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - STARTUPINFO stinfo; / 启动窗口的信息PROCESSINFO procinfo; / 进程的信息CreateProcess(NULL,_T(notepad.exe),NULL,NULL.FALSE, NORMAL_PRIORITY_ CLASS,NULL,NULL, &stinfo,&procinfo); 6. 确定应用程序的路径前些天好象有人问过这个问题. Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。Example: TCHAR exeFullPathMAX_PA TH; / MAX_PA TH 在 API 中定义了吧,好象是128 GetModuleFileName(NULL,exeFullPath,MAX_PATH) 7. 获得各种目录信息Windows 目录 : Use GetWindowsDirectory“Windows 下的 system目录 : Use GetSystemDirectory temp 目录 : Use GetTempPath 当前目录 : Use GetCurrentDirectory 请注意前两个函数的第一个参数为目录变量名,后一个为缓冲区; 后两个相反 . 8. 如何自定义消息名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 8 页 - - - - - - - - - 也有人问过的,其实不难。(1) 手工定义消息,可以这么写#define WM_MY_MESSAGE(WM_USER+100), MS 推荐的至少是WM_USER+100; (2)写消息处理函数 ,用 WPARAM,LPARAM返回 LRESULT. LRESULT CMainFrame:OnMyMessage(WPARAM wparam,LPARAM lParam) /加入你的处理函数 (3) 在类的AFX_MSG 处进行声明,也就是常说的宏映射 9. 如何改变窗口的图标? 向窗口发送WM_SECTION 消息。Example: HICON hIcon=AfxGetApp() -LoadIcon(IDI_ICON); ASSERT(hIcon); AfxGetMainWnd() -SendMessage(WM_SECTION,TRUE,(LPARAM) hIcon); 10. 如何改变窗口的缺省风格? 重写CWnd: PreCreateWindow 并修改 CREATESTRUCT 结构来指定窗口风格和其他创建信息. Example: Delete Max Button and Set Origi nal Window s Position and Size名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8 页 - - - - - - - - - BOOL CMainFrame: PreCreateWindow (CREATESTRUCT &cs) cs.style &=WS_MAXINIZEMOX; cs.x=cs.y=0; cs.cx=GetSystemMetrics(SM_CXSCREEN/2); cs.cy=GetSystemMetrics(SM_CYSCREEN/2); return CMDIFramewnd :PreCreateWindow(cs); 11. 如何将窗口居中显示? Easy, Call Function CWnd: Center Windows Example(1): Center Window( ); /Relative to its parent/ Relative to Screen Example(2): Center Window(CWnd: GetDesktopWindow( ); /Relative to Applications MainWindowAfxGetMainWnd( ) - Center Window( ); 12. 如何让窗口和MDI 窗口一启动就最大化和最小化? 先说窗口。在 InitStance 函数中设定m_nCmdShow 的 取值 . m_nCmdShow=SW_SHOWMAXMIZED ; /最大化m_nCmdShow=SW_SHOWMINMIZED ; /最小化m_nCmdShow=SW_SHOWNORMAL ; /正常方式名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - MDI 窗口 : 如果是创建新的应用程序,可以用MFC AppWizard 的 Advanced 按钮并在MDI 子窗口风格组中检测最大化或最小化; 还可以重载MDI Window 的 PreCreateWindow 函数,设置WS_MAXMIZE or WS_MINMIZE;如果从CMDIChildWnd 派生 ,调用OnInitialUpdate 函数中的CWnd:Show Window 来指定MDI Child Window 的 风格。13. 如何使程序保持极小状态? 很有意思的问题这么办 : 在恢复程序窗体大小时,Windows 会发送 WM_QUERY-OPEN 消息,用ClassWizard 设置成员函数OnQueryOpen() ,add following code: Bool CMainFrame: OnQueryOpen( ) Return false; 14. 如何限制窗口的大小? 也就是FixedDialog 形式。Windows 发送WM_GETMAXMININFO消息来跟踪 , 响应它 ,在 OnGetMAXMININFO 中写代码 : 15. 如何使窗口不可见?很简单 ,用 SW_HIDE 隐藏窗口,可以结合FindWindow,ShowWindow 控制 . 16. 如何使窗口始终在最前方? 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 8 页 - - - - - - - - - 两种途径 . BringWindowToTop(Handle); SetWindowPos 函数,指定窗口的最顶风格 ,用 WS_EX_TOPMOST 扩展窗口的风格Example: void ToggleTopMost( CWnd *pWnd) ASSERT_VALID(pWnd); pWnd -SetWindowPos(pWnd- GetStyle( ) &WS_EX_TOPMOST)? &wndNoTopMOST: &wndTopMost,0,0,0,0,SSP_NOSIZE|WSP_NOMOVE; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -