《VC60编程技巧集》由会员分享,可在线阅读,更多相关《VC60编程技巧集(15页珍藏版)》请在金锄头文库上搜索。
1、VC 编程常见问题 1fdsgbfVisual C+编程技巧之一1. 如何获取应用程序的实例句柄?2. 如何通过代码获得应用程序主窗口的指针?3. 如何在程序中获得其他程序的图标?4. 如何编程结束应用程序?如何编程控制 windows的重新引导?5怎样加栽其他的应用程序?6. 确定应用程序的 路径7. 获得各种目录信息8. 如何自定义消息9. 如何改变窗口的图标?10. 如何改变窗口的缺省风格?11. 如何将窗口居中显示?12. 如何让窗口和MDI窗口一启动就最大化和最小化?13. 如何使程序保持极小状态?14. 如何限制窗口的大小?15. 如何使窗口不可见?16. 如何使窗口始终在最前方?
2、17. 如何创建一个字回绕的CEditView18. 通用控件的显示窗口19. 移动窗口20. 重置窗口的大小21、如何单击除了窗口标题栏以外的区域使窗口移动22、如何改变视窗的背景颜色23、如何改变窗口标题24、如何防止主框窗口在其说明中显示活动的文档名1. 如何获取应用程序的实例句柄?应用程序的 实例句柄保存在 CWinApp:m_hInstance 中 ,可以这么调用AfxGetInstancdHandle 获得句柄.Example: HANDLE hInstance = AfxGetInstanceHandle();2. 如何通过代码获得应用程序主窗口的指针?主窗口的 指针保存在 CW
3、inThread:m_pMainWnd 中,调用 AfxGetMainWnd 实 现。AfxGetMainWnd() -ShowWindow(SW_SHOWMAXMIZED); /使程序最大化.3. 如何在程序中获得其他程序的 图标?两种方法:SDK函数SHGetFilelnfo或使用Extracticon获得图标资源的handle,SDK函数SHGetFilelnfo获得有关文件的很多信息,如大小图标,属性,类型 等.Example(1): 在程序窗口左上角显示 NotePad 图标.void CSampleView: OnDraw(CDC * pDC)if( :SHGetFileInfo(
4、_T(c:pwin95notepad.exe),0,&stFileInfo,sizeof(stFileInfo),SHGFI _ICON)pDC -DrawIcon(10,10,stFileInfo.hIcon);Example(2):同样功能,使用Extracticon函数void CSampleView: OnDraw(CDC *pDC)HICON hIcon=: ExtractIcon(AfxGetInstanceHandle(),_T(NotePad.exe),0);if (hIcon &hIcon!=(HICON)-1)pDC-DrawIcon(10,10,hIcon);说明: 获得
5、 notepad.exe 的路径正规上来说用 GetWindowsDirectory 函数得到,如 果是调用 win95 下的画笔,应该用访问注册表的方法获得其路径,要作成一个 比较考究的程序,考虑应该全面点.4.如何编程结束应用程序?如何编程控制 windows 的 重新引导?这是个很简单又是编程中经常要遇到的问题.第一问,向窗口发送WM_CLOSE消息,调用CWnd:OnClose成员函数.允许对用 户提示是否保存修改过的数据.Example: AfxGetMainWindow()-SendMessage(WM_CLOSE);还可以创建一个自定义的函数 Terminate Windowvo
6、id Terminate Window(LPCSTR pCaption)CWnd *pWnd=Cwnd:FindWindow(NULL,pCaption);if (pWnd)pWnd -SendMessage(WM_CLOSE);说明: FindWindow 函数不是提倡的做法,因为它无法处理标题栏自动改变,比如 我们要检测 Notepad 是不是已运行而事先不知道 Notepad 的标题栏,这时 FindWindow 就无能为力了,可以通过枚举 windows 任务列表的办法来实现。在机械出版社Windows 95 API开发人员指南一书有比较详细的介绍,这里就不 再多说。第二问,Use E
7、xitWindowsEx Function函数控制系统是重新引导,还是重启 windows.我记得这好象是出场频度很高的问题。三个 SDK 函数 winexec, shellexecute,createprocess 可以使用。WinExec 最简单,两个参数,前一个指定路径,后一个指定显示方式.后一个参 数值得说一下,比如泥用 SW_SHOWMAXMIZED 方式去加栽一个无最大化按 钮的 程序,呵呵就是 Neterm,calc 等等,就不会出现正常的 窗体,但是已经被 加到任务列表里了。ShellExecute较WinExex灵活一点,可以指定工作目录,下 面的Example就是直接打开c
8、:templ.txt,而不用加栽与txt文件关联的应用程 序,很多安装程序完成后都会打开一个窗口,来显示Readme or Faq,偶猜就是这么 作的啦.ShellExecute(NULL,NULL,_T(l.txt),NULL,_T(c:temp),SW_SHOWMAXMIZ ED);CreateProcess 最复杂,一共有十个参数,不过大部分都可以用 NULL 代替,它可 以指定进程的安全属性,继承信息,类的优先级等等.来看个很简单的 Example:STARTUPINFO stinfo; /启动窗口的信息PROCESSINFO procinfo; /进程的信息CreateProcess
9、(NULL,_T(notepad.exe),NULL,NULL.FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL, &stinfo,&procinfo);6. 确定应用程序的 路径前些天好象有人问过这个问题.Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。Example:TCHAR exeFullPathMAX_PATH; / MAX_PATH在 API 中定义了吧,好象是 128GetModuleFileName(NULL,exeFullPath,MAX_PATH)7. 获得各种目录信息Windows 目录: 使用 GetWin
10、dowsDirectory() 函数Windows 下的 system 目录: 使用 GetSystemDirectory ()函数temp 目录: 使用 GetTempPath() 函数当前目录:使用 GetCurrentDirectory()函数请注意前两个函数的第一个参数为目录变量名,后一个为缓冲区; 后两个相反. 这几个函数具体需 要带什么样的参数请查看 MSDN.8. 如何自定义消息也有人问过的,其实不难。(1) 手工定义消息,可以这么写 #define WM_MY_MESSAGE(WM_USER+100),MS 推荐的至少是 WM_USER+100;(2) 写消息处理函数,用 WP
11、ARAM,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. 如何改变窗口的缺省风格?重栽
12、CWnd: PreCreateWindow 并修改 CREATESTRUCT 结构来指定窗口风格 和其他创建信息.Example:去掉Max按钮并且设置窗口的原始位置和大小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. 如何将窗
13、口居中显示?直接调用函数CWnd: CenterWindows()可以把指定窗口居中显示Example(1):CenterWindow( );/在父窗口中居中显示Example(2):CenterWindow(CWnd: GetDesktopWindow( );/ 在屏幕中居中显示Example(3):AfxGetMainWnd( ) - Center Window( );/在应用程序主框架中居中显示12. 如何让窗口和 MDI 窗口一启动就最大化和最小化?先说窗口。在 InitStance 函数中设定 m_nCmdShow 的 取值. m_nCmdShow=SW_SHOWMAXMIZED ;
14、 /最大化 m_nCmdShow=SW_SHOWMINMIZED ; /最小化 m_nCmdShow=SW_SHOWNORMAL ; /正常方式MDI 窗口:如果是创建新的应用程序,可以用MFC AppWizard的Advanced按钮并 在,MDI子窗口风格组中检测最大化或最小化; 还可以重载 MDI Window 的 PreCreateWindow 函 数,设置WS_MAXMIZE or WS_MINMIZE; 如果从 CMDIChildWnd 派生,调用 OnInitialUpdate 函数中的CWnd:ShowWindow 来指定 MDI Child Window 的风格。13. 如何
15、使程序保持极小状态?很有意思的 问题 这么办: 在恢复程序窗体大小时, 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. 如何使窗口始终在最前方?两种途径.BringWindowToTop(Handle);SetWindowPos 函数,指定窗口的 最顶风格,用 WS_EX_TOPMOST 扩展窗口的 风格