Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1676043
  • 博文数量: 585
  • 博客积分: 14610
  • 博客等级: 上将
  • 技术积分: 7402
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-15 10:52
文章存档

2013年(5)

2012年(214)

2011年(56)

2010年(66)

2009年(44)

2008年(200)

分类: C/C++

2012-01-27 03:12:33

 Visual C++ 编程技巧之一和二
分类: 2.3 VC技巧收集 226人阅读 评论(0) 收藏 举报

1. 如何获取应用程序的实例句柄?
2. 如何通过代码获得应用程序主窗口的指针?
3.如何在程序中获得其他程序的图标?
4.如何编程结束应用程序?如何编程控制windows的重新引导?
5.怎样加栽其他的应用程序?
6. 确定应用程序的 路径
7. 获得各种目录信息
8. 如何自定义消息
9. 如何改变窗口的图标? 
10. 如何改变窗口的缺省风格? 
11. 如何将窗口居中显示? 
12. 如何让窗口和 MDI窗口一启动就最大化和最小化? 
13. 如何使程序保持极小状态? 
14. 如何限制窗口的大小? 
15. 如何使窗口不可见? 
16. 如何使窗口始终在最前方?  

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://pwin95//notepad.exe"),0,&stFileInfo,sizeof(stFileInfo),SHGFI_ICON)) 
    { 
        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); 
    if (pWnd)     
        pWnd ->SendMessage(WM_CLOSE); 

 
说明: FindWindow函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要检测 Notepad是不是已运行而事先不知道Notepad的标题栏,这时 FindWindow就无能为力了,可以通过枚举 windows任务列表的办法来实现。 在 机械出版社"Windows 95 API开发人员指南"一书有比较详细的介绍,这里就不再多说乐。 
 
第二问,Use ExitWindow*** Function函数控制系统是重新引导,还是重启 windows.前面已经有人讲过乐,就不再提了。 
 
5.怎样加栽其他的应用程序? 
 
我记得这好象是出场频度很高的问题。三个SDK函数 winexec, shellexecute,createprocess可以使用。 
 
WinExec最简单,两个参数,前一个指定路径,后一个指定显示方式.后一个参数值得说一下,比如泥用 SW_SHOWMAXMIZED方式去加栽一个无最大化按钮的 程序,呵呵就是Neterm,calc等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。ShellExecute较 WinExex灵活一点,可以指定工作目录,下面的 Example就是直接打开 c:/temp/1.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 exeFullPath[MAX_PATH]; // MAX_PATH在API中定义了吧,好象是128 
GetModuleFileName(NULL,exeFullPath,MAX_PATH) 
 
7. 获得各种目录信息 
 
Windows目录: Use "GetWindowsDirectory“ 
Windows下的system目录: Use "GetSystemDirectory" 
temp目录: Use "GetTempPath " 
当前目录: Use "GetCurrentDirectory" 
请注意前两个函数的第一个参数为 目录变量名,后一个为缓冲区; 后两个相反. 
 
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 Original Window's Position and Size  
 
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 it's parent  
// Relative to Screen  
 
Example(2): Center Window(CWnd:: GetDesktopWindow( ));  
//Relative to Application's MainWindow  
 
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);  
}  

阅读(1178) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~