编程技巧20法 (上)
发布时间:
1. 如 何 激 活 当 前 屏 幕 保 护 程 序
// 激活当前屏幕保护程序, jingzhou xu
PostMessage(WM_SYSCOMMAND,SC_SCREENSAVE,0);
2. 如 何 禁 止/启 用 屏 幕 保 护 及 电 源 管 理
static
UINT dss_GetList[]={ SPI_GETLOWPOWERTIMEOUT,SPI_GETPOWEROFFTIMEOUT,SPI_GETSCREENSAVETIMEOUT};
static
UINT dss_SetList[]={ SPI_SETLOWPOWERTIMEOUT,SPI_SETPOWEROFFTIMEOUT,SPI_SETSCREENSAVETIMEOUT};
static
const
int dss_ListCount=_countof(dss_GetList);
l 禁 止 屏 幕 保 护 及 电 源 管 理
{
m_pValue=
new
int [dss_ListCount];
for (
int x=0;x<dss_ListCount;x++)
{
// 禁止屏幕保护及电源管理
VERIFY(SystemParametersInfo(dss_SetList[x],0,NULL,0));
}
delete []m_pValue ;
}
l 启 用 屏 幕 保 护 及 电 源 管 理
{
m_pValue=
new
int [dss_ListCount];
for (
int x=0;x<dss_ListCount;x++)
{
//启用屏幕保护及电源管理
VERIFY(SystemParametersInfo(dss_SetList[x],m_pValue[x],NULL,0));
}
delete []m_pValue ;
}
3. 如 何 激 活 和 关 闭 IE 浏 览 器
//激活并打开IE
void lounchIE()
{
HWND h=FindWindowEx(NULL,NULL,NULL,
"Microsoft Internet Explorer" );
ShellExecute(h,
"open" ,
"C://simple.html" , NULL,NULL,SW_SHOWNORMAL);
}
//关闭IE及其它应用
void CloseIE()
{
int app=BSM_APPLICATIONS ;
unsigned
long bsm_app=(unsigned
long )app ;
BroadcastSystemMessage(BSF_POSTMESSAGE,&bsm_app, WM_CLOSE,NULL,NULL);
}
4. 如 何 给 树 控 件 加 入 工 具 提 示
l 首 先 给 树 控 件 加 入 TVS_INFOTIP 属 性 风 格 , 如 下 所 示 :
if (!m_ctrlTree.Create(WS_CHILD|WS_VISIBLE|
//加入提示TVS_INFOTIP,jingzhou xu(树控件ID:100)
TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_INFOTIP,CRect(0,0,0,0),&m_wndTreeBar,100))
{
TRACE0(
"Failed to create instant bar child/n" );
return -1 ;
}
l 其 次 加 入 映 射 消 息 声 明 , 如 下 所 示 :
afx_msg
void OnGetInfoTip(NMHDR*pNMHDR,
LRESULT *pResult);
//树控件上加入提示消息,jingzhou xu
//树控件条目上加入提示,jingzhou xu
ON_NOTIFY(TVN_GETINFOTIP,100,OnGetInfoTip)
l 最 后 加 入 呼 应 涵 数 处 理 :
void CCreateTreeDlg :: OnGetInfoTip(NMHDR*pNMHDR,
LRESULT *pResult)
{
*pResult=0 ;
NMTVGETINFOTIP*pTVTipInfo=(NMTVGETINFOTIP*)pNMHDR ;
LPARAM itemData=(
DWORD )pTVTipInfo->lParam ;
//对应每个条目的数据
HTREEITEM hItem=pTVTipInfo->hItem ;
CString tip ;
HTREEITEM hRootItem=m_chassisTree.GetRootItem();
if (hRootItem!=pTVTipInfo->hItem)
{
tip=
"树结点的提示" ;
}
else
{
tip=
"树根上的提示" ;
}
strcpy(pTVTipInfo->pszText,(
LPCTSTR )tip);
}
5. 如 何 获 取 系 统 信 息 框 的 路 径
#include<atlbase.h>
#define IDS_REG_KEY_MSINFO_PATH1 _T("Software//Microsoft//Shared Tools//MSInfo")
#define IDS_REG_KEY_MSINFO_PATH2 _T("Software//Microsoft//Shared Tools Location")
#define IDS_REG_VAL_MSINFO_PATH1 _T("Path")
#define IDS_REG_VAL_MSINFO_PATH2 _T("MSInfo")
#define IDS_MSINFO_EXE_NAME _T("MSInfo32.exe")
//...
BOOL GetSysInfoPath(CString&strPath)
{
strPath.Empty();
LPTSTR pszPath=strPath.GetBuffer(MAX_PATH);
CRegKey reg ;
DWORD dwSize=MAX_PATH ;
LONG nRet=reg.Open(HKEY_LOCAL_MACHINE,IDS_REG_KEY_MSINFO_PATH1,KEY_READ);
// 在注册表中寻找第一个"MSInfo32.exe" 位置
if (nRet==ERROR_SUCCESS)
{
#if(_MFC_VER>=0x0700)
nRet=reg.QueryStringValue(IDS_REG_VAL_MSINFO_PATH1,pszPath,&dwSize);
#else
nRet=reg.QueryValue(pszPath,IDS_REG_VAL_MSINFO_PATH1,&dwSize);
#endif
reg.Close();
}
// 如果第一次寻找失败,则进行第二次寻找
if (nRet!=ERROR_SUCCESS)
{
nRet=reg.Open(HKEY_LOCAL_MACHINE,IDS_REG_KEY_MSINFO_PATH2,KEY_READ);
if (nRet==ERROR_SUCCESS)
{
#if(_MFC_VER>=0x0700)
reg.QueryStringValue(IDS_REG_VAL_MSINFO_PATH2,pszPath,&dwSize);
#else
reg.QueryValue(pszPath,IDS_REG_VAL_MSINFO_PATH2,&dwSize);
#endif
// 路径名不包括EXE文件名
if (nRet==ERROR_SUCCESS)
VERIFY(:: PathAppend(pszPath,IDS_MSINFO_EXE_NAME));
reg.Close();
}
}
strPath.ReleaseBuffer();
strPath.FreeExtra();
// 检查文件是否有效.
return :: PathFileExists(strPath);
}
6. 如 何 直 接 运 行 一 个 资 源 中 的 程 序
bool Run()
{
CFile f ;
char *pFileName=
"Execution.exe" ;
if (!f.Open(pFileName,CFile :: modeCreate|CFile :: modeWrite,NULL))
{
AfxMessageBox(
"Can not create file!" );
return 0 ;
}
CString path=f.GetFilePath();
HGLOBAL hRes ;
HRSRC hResInfo ;
//获取应用实例
HINSTANCE insApp=AfxGetInstanceHandle();
//寻找EXE资源名
hResInfo=FindResource(insApp,(
LPCSTR )IDR_EXE4,
"EXE" );
hRes=LoadResource(insApp,hResInfo);
// Load it
DWORD dFileLength=SizeofResource(insApp,hResInfo);
//计算EXE文件大小
f.WriteHuge((
LPSTR )hRes,dFileLength);
//写入临时文件
f.Close();
HINSTANCE HINSsd=ShellExecute(NULL,
"open" ,path,NULL,NULL,SW_SHOWNORMAL);
//运行它.
>
return 1 ;
}
7. 如 何 遍 历 整 个 目 录
#include<windows.h>
#include<shlobj.h>
//浏览目录.
void BrowseFolder(
void )
{
TCHAR path[MAX_PATH];
BROWSEINFO bi={ 0 } ;
bi.lpszTitle=(
"递归调用所有目录" );
LPITEMIDLIST pidl=SHBrowseForFolder(&bi);
if (pidl!=0)
{
// 获取目录路径
SHGetPathFromIDList(pidl,path);
//设置为当前路径
SetCurrentDirectory(path);
//搜索所有子目录
SearchFolder(path);
// 释放内存
IMalloc*imalloc=0 ;
if (SUCCEEDED(SHGetMalloc(&imalloc)))
{
imalloc->Free(pidl);
imalloc->Release();
}
}
}
//搜索其下所有子目录及文件.
void SearchFolder(
TCHAR *path)
{
WIN32_FIND_DATA FindFileData ;
HANDLE hFind ;
TCHAR filename[MAX_PATH+256];
TCHAR pathbak[MAX_PATH];
//复制初始用户选择目录
strcpy(pathbak,path);
//寻找第一个文件
hFind=FindFirstFile(
"*.*" ,&FindFileData);
//搜索所有文件及子目录
do
{
if (hFind!=INVALID_HANDLE_VALUE)
{
//如果是当前目录或父目录,跳过
if (!(strcmp(FindFileData.cFileName,
"." ))||!(strcmp(FindFileData.cFileName,
".." )))
{
continue ;
}
//恢复初始用户选择目录
strcpy(path,pathbak);
//列出所有发现的文件
sprintf(path,
"%s//%s" ,path,FindFileData.cFileName);
//如果 SetCurrentDirectory 成功的话,则它是一个目录,递归调用继续搜索子目录
if ((SetCurrentDirectory(path)))
{
SearchFolder(path);
}
//插入文件及路径名到列表框m_listbox_hwnd中
SendMessage(m_listbox_hwnd,LB_ADDSTRING,0,path);
//<--INSERT WHAT YOU WANT DONE HERE!
}
}
while (FindNextFile(hFind,&FindFileData)&&hFind!=INVALID_HANDLE_VALUE);
FindClose(hFind);
}
8. 如 何 禁 止/启 用 系 统 热 键
bool bOld ;
l 禁 止 系 统 热 键
//屏蔽掉系统键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,
true ,&bOld,SPIF_UPDATEINIFILE);
l 启 用 系 统 热 键
//恢复系统热键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,
false ,&bOld,SPIF_UPDATEINIFILE);
9. 如 何 隐 藏/显 示 WINDOWS 系 统 任 务 栏
l 隐 藏 系 统 任 务 栏
//隐藏WINDOWS系统任务栏
:: ShowWindow(:: FindWindow(
"Shell_TrayWnd" ,NULL),SW_HIDE);
l 显 示 系 统 任 务 栏
//恢复WINDOWS系统任务栏正常显示
:: ShowWindow(:: FindWindow(
"Shell_TrayWnd" ,NULL),SW_SHOW);
10. 如 何 实 现 窗 口 到 系 统 区 图 标 间 的 动 画 效 果
//********************************************************************************
//* 名称:FindTrayWnd
//* 作者:徐景周([email protected])
//* 功能:在显示窗体动画效果前,先寻找系统区位置
//********************************************************************************
BOOL CALLBACK FindTrayWnd(
HWND hwnd,
LPARAM lParam)
{
TCHAR szClassName[256];
GetClassName(hwnd,szClassName,255);
// 比较窗口类名
if (_tcscmp(szClassName,_T(
"TrayNotifyWnd" ))==0)
{
CRect*pRect=(CRect*)lParam ;
:: GetWindowRect(hwnd,pRect);
return TRUE ;
}
// 当找到时钟窗口时表示可以结束了
if (_tcscmp(szClassName,_T(
"TrayClockWClass" ))==0)
{
CRect*pRect=(CRect*)lParam ;
CRect rectClock ;
:: GetWindowRect(hwnd,rectClock);
pRect->right=rectClock.left ;
return FALSE ;
}
return TRUE ;
}
//********************************************************************************
//* 名称:WinAnimation
//* 作者:徐景周([email protected])
//* 功能:显示窗口动画效果的涵数
//********************************************************************************
void CScreenSnapDlg :: WinAnimation(
BOOL ShowFlag)
{
CRect rect(0,0,0,0);
// 查找托盘窗口
CWnd*pWnd=FindWindow(
"Shell_TrayWnd" ,NULL);
if (pWnd)
{
pWnd->GetWindowRect(rect);
EnumChildWindows(pWnd->m_hWnd,FindTrayWnd,(
LPARAM )&rect);
//rect 为托盘区矩形
CRect rcWnd ;
GetWindowRect(rcWnd);
//窗体滑向系统区
if (ShowFlag)DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rcWnd,rect);
//窗体从系统区滑出
else DrawAnimatedRects(GetSafeHwnd(),IDANI_CAPTION,rect,rcWnd);
}
}
用 法 如 下 :
//窗体是否已隐藏
if (IsWindowVisible())
{
ShowWindow(SW_HIDE);
//先隐藏窗体
WinAnimation(
true );
//窗体动画滑入到系统区中
}
else
{
WinAnimation(
false );
//窗体动画从系统区滑出
ShowWindow(SW_SHOW);
}