已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC编程常见问题1fdsgbfVisual C+编程技巧之一 1. 如何获取应用程序的实例句柄? 2. 如何通过代码获得应用程序主窗口的指针? 3.如何在程序中获得其他程序的 图标? 4.如何编程结束应用程序?如何编程控制windows的重新引导? 5.怎样加栽其他的应用程序? 6. 确定应用程序的 路径 7. 获得各种目录信息 8. 如何自定义消息 9. 如何改变窗口的图标? 10. 如何改变窗口的缺省风格? 11. 如何将窗口居中显示? 12. 如何让窗口和MDI窗口一启动就最大化和最小化? 13. 如何使程序保持极小状态? 14. 如何限制窗口的大小? 15. 如何使窗口不可见? 16. 如何使窗口始终在最前方? 17、如何创建一个字回绕的CEditView 18、通用控件的显示窗口 19、移动窗口 20、重置窗口的大小 21、如何单击除了窗口标题栏以外的区域使窗口移动 22、如何改变视窗的背景颜色 23、如何改变窗口标题 24、如何防止主框窗口在其说明中显示活动的文档名 1. 如何获取应用程序的实例句柄? 应用程序的 实例句柄保存在CWinApp:m_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) 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); 说明: 获得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); 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: 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_PATH; / MAX_PATH在API中定义了吧,好象是128 GetModuleFileName(NULL,exeFullPath,MAX_PATH) 7. 获得各种目录信息 Windows目录: 使用 GetWindowsDirectory() 函数 Windows下的system目录: 使用 GetSystemDirectory ()函数 temp目录: 使用 GetTempPath() 函数 当前目录: 使用 GetCurrentDirectory()函数 请注意前两个函数的第一个参数为目录变量名,后一个为缓冲区; 后两个相反. 这几个函数具体需 要带什么样的参数请查看MSDN. 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: 去掉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. 如何将窗口居中显示? 直接调用函数CWnd: CenterWindows()可以把指定窗口居中显示Example(1): CenterWindow( ); /在父窗口中居中显示Example(2): CenterWindow(CWnd: GetDesktopWindow( ); / 在屏幕中居中显示Example(3): AfxGetMainWnd( ) - Center Window( ); /在应用程序主框架中居中显示12. 如何让窗口和 MDI窗口一启动就最大化和最小化? 先说窗口。 在 InitStance 函数中设定 m_nCmdShow的 取值. m_nCmdShow=SW_SHOWMAXMIZED ; /最大化 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. 如何使程序保持极小状态? 很有意思的 问题 这么办: 在恢复程序窗体大小时, 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扩展窗口的 风格 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); 17、如何创建一个字回绕的CEditView 重载CWnd : : PreCreateWindow和修改CREATESTRUCT结构,关闭CEditView对象的ES_AUTOHSCROLL和WS_HSCROLL风格位, 由于CEditView : : PreCreateWindow显示设置cs. style,调用基类函数后要修改cs . style。 BOOL CSampleEDitView : : PreCreateWindow (CREATESTRUCT&cs) /First call basse class function . BOOL bResutl =CEditView : : PreCreateWindow (cs) ; / Now specify the new window style . cs.style &= (ES_AUTOHSCROLL WS_HSCROLL); return bResult ; 18、通用控件的显示窗口 MFC提供了几个CView派生的视窗类, 封装了通用控件的功能,但仍然使用工 作框文档显示窗口体系结构:CEditView封装了编辑控件,CTreeView保持了树列表 控件,CListView封装了列表显示窗口控件,CRichEditView可以处理多种编辑控件。 19、移动窗口 调用CWnd : : SetWindowPos并指定SWP_NOSIZE标志。目的位置与父窗口 有关(顶层窗口与屏幕有关)。调用CWnd : : MoveWindow时必须要指定窗口 的大小。 /Move window to positoin 100 , 100 of its parent window . SetWindowPos (NULL, 100 , 100 , 0 , 0 , SWP_NOSIZE SWP_NOAORDER); 20、重置窗口的大小 调用CWnd: : SetWindowPos并指定SWP_NOMOVE标志, 也可调用 CWnd : : MoveWindow 但必须指定窗口的位置。 / Get the size of the window . Crect reWindow ; GetWindowRect (reWindow ); /Make the window twice as wide and twice as tall . SetWindowPos (NULL , 0 , 0 , reWindow . Width ( ) *2, reWindow . Height () * 2, SWP_NOMOVE SWP_NOZORDER ); 21、如何单击除了窗口标题栏以外的区域使窗口移动 当窗口需要确定鼠标位置时Windows向窗口发送WM_NCHITTEST信息,可以处理 该信息使Windows认为鼠标在窗口标题上。对于对话框和基于对话的应用程序,可 以使用ClassWizard处理该信息并调用基类函数, 如果函数返回HTCLIENT 则表明 鼠标在客房区域,返回HTCAPTION表明鼠标在Windows的标题栏中。 UINT CSampleDialog : : OnNcHitTest (Cpoint point ) UINT nHitTest =Cdialog: : OnNcHitTest (point ); return (nHitTest = =HTCLIENT)? HTCAPTION : nHitTest ; 上述技术有两点不利之处, 其一是在窗口的客户区域双击时, 窗口将极大; 其二, 它不适合包含几个视窗的主框窗口。还有一种方法,当用户按下鼠标左键 使主框窗口认为鼠标在其窗口标题上,使用ClassWizard在视窗中处理WM_LBUTTODOWN 信息并向主框窗口发送一个WM_NCLBUTTONDOWN信息和一个单击测试HTCAPTION。 void CSampleView : : OnLButtonDown (UINT nFlags , Cpoint point ) CView : : OnLButtonDow (nFlags , pont ); /Fool frame window into thinking somene clicked onits caption bar . GetParentFrame ( ) PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARAM (poitn .x , point .y) ); 该技术也适用于对话框和基于对的应用程序,只是不必调用CWnd : : GetParentFrame 。 void CSampleDialog : : OnLbuttonDown (UINT nFlags, Cpoint point ) CDialog : : OnLButtonDow (nFlags, goint ); /Fool dialog into thinking simeone clicked on its caption bar . PostMessage (WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARM (point.x , point. y ) ) ; 22、如何改变视窗的背景颜色 Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用 ClassWizard重载该消息的缺省处理程序来擦除背景(实际是画),并返回TRUE以 防止Windows擦除窗口。 /Paint area that needs to be erased. BOOL CSampleView : : OnEraseBkgnd (CDC* pDC) / Create a pruple brush. CBrush Brush (RGB (128 , 0 , 128) ); / Select the brush into the device context . CBrush* pOldBrush = pDCSelcetObject (&brush); / Get the area that needs to be erased . CRect reClip ; pDCGetCilpBox (&rcClip); /Paint the area. pDC PatBlt (rcClip.left , rcClip.top , rcClip.Width ( ) , rcClip.Height ( ) , PATCOPY ); /Unselect brush out of device context . pDCSelectObject (pOldBrush ); / Return nonzero to half fruther processing . return TRUE; 23、如何改变窗口标题 调用CWnd : : SetWindowText可以改变任何窗口(包括控件)的标题。 /Set title for applications main frame window . AfxGetMainWnd ( ) SetWindowText (_T(Application title) ); /Set title for Views MDI child frame window . GetParentFrame ( ) SetWindowText (_T (MDI Child Frame new title) ); /Set title for dialogs push button control. GetDigitem (IDC_BUTTON) SetWindowText (_T (Button new title ) ); 如果需要经常修改窗口的标题(注:控件也是窗口),应该考虑使用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小区人居环境绿色评估方案
- 2025年丙二酮合作协议书
- 安徽科技馆笔试题目及答案
- 2025吉林事业编综合应用能力C类卷
- 照明工程绿色环保设计方案
- 景观设计与施工方案
- 旧小区智慧路灯系统建设方案
- 面试礼仪试题带答案
- 呼吸辅助器具使用培训试题及答案
- 珠宝业务试题带答案
- Python程序设计基础及实践(慕课版 第2版)课件 6. 组合数据类型(2)列表
- 钳工(高级)课件全套 项目1-9 高级钳工必专业知识-设备的维护保养与维修
- 成都低空经济政策
- VW 60474-2018铝合金AL9的外十二角法兰螺栓EN
- 医疗清廉账户管理办法
- 微型医疗器械设计中的成本效益分析工具考核试卷
- 混凝土外加剂项目可行性研究报告(完整版案例)
- 2025云南中考英语真题及答案
- 观刈麦教学课件
- 汉语言文学专业职业生涯规划书3700字数
- 电大现代货币金融学说形考任务二第1-6章测验题答案
评论
0/150
提交评论