当前位置:文档之家› VC学习手札

VC学习手札

*************************************************************************************************************
2011年06月02日



258:摄像头照片地址
C:\Documents and Settings\All Users\Application Data\Microsoft\WIA\{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\0001




257:当用SetWindowPlacement函数隐藏窗体时,窗体没有标题,可实现在任务管理器【应用程序】中隐藏。




*************************************************************************************************************
2011年05月18日



256:关于锁住文件
CFile file;
file.Open("E:\\1.txt",CFile::modeRead);
file.LockRange(0,3);
注意:其中file必须是成员变量或全局变量。



*************************************************************************************************************
2011年05月12日



255:IE的全屏幕模式----每次打开IE时的窗口都是最大化
在IE里按下F11键就可以快速切换到全屏幕模式,不过我们这里所说的全屏幕模式是指一个不包括工具栏、状态栏的纯全屏模式。要达到这种效果----通过 "快速启动工具栏"中的图标启动IE时,可以右击“快捷方式图标”,选择“属性”,在“快捷方式”选项卡中的“运行方式”选项栏中选择“最大化”,然后单击“确定”按钮。此后,无论什么时候您通过这个快捷方式启动IE,浏览器的窗口总处于最大化状态.



254:抓取当前活动窗口
在使用Print Screen进行屏幕抓图时,同时按下Alt键,就会只抓取当前活动窗口,然后按上述方法保存即可。



*************************************************************************************************************


2011年04月15日


253:VC宏文件存放目录:
D:\Program Files\Microsoft Visual Studio\Common\MSDev98\Macros


*************************************************************************************************************


2011年04月15日




252:关于Cstring类的GetBuffer函数
CString str="123456";
char *p=str.GetBuffer(0);
p="123456789";
AfxMessageBox(p);
AfxMessageBox(str);
str.ReleaseBuffer();





*************************************************************************************************************


2011年04月14日



251:CFile类的GetFileTitle和GetFileName两个函数返回可能结果一样,可能不一样,跟文件夹选项里设置的隐藏已知文件类型扩展名有关。




250:获得本机IP地址。
WORD wVersionRequested;
WSADATA wsaData;
char szHostName[255]="";
CString csIP="";
PHOSTENT pHostInfo;
wVersionRequested=MAKEWORD(2,0);
if (WSAStartup(wVersionRequested,&wsaData)==0)
{
if(gethostname(szHostName,sizeof(szHostName))==0)
{
AfxMessageBox(CString("计算机名称:")+szHostName);
if((pHostInfo=gethostbyname(szHostName))!=NULL)
{
csIP=inet_ntoa(*(struct in_addr*)*pHostInf

o->h_addr_list);
}
}
WSACleanup();
}
AfxMessageBox(CString("本机IP地址:")+csIP);





249:对话框程序一开始便隐藏新办法。
SetParent(FindWindow("ProgMan",NULL));
ShowWindow(SW_MINIMIZE);
说明:把当前应用的主窗口作为另一个隐藏窗口的子窗口,从而实现隐藏。




248:完全隐藏控制台程序
如果完全不需要用户操作的话可以加一个预编译语句在main之前也可以隐藏程序
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

此处空格不能少。




*************************************************************************************************************


2011年04月13日



247:vb获得本机IP地址
Private Sub Command1_Click()
Set objWMI = GetObject("winmgmts://./root/cimv2")
Set colIP = objWMI.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
For Each IP In colIP
MsgBox "本机IP地址是: " & IP.IPAddress(0), 4096 + 64, "飘零"
Exit For
Next
End Sub


246:关闭防火墙

在命令行模式下关闭Windows XP或Windows 2003自带的防火墙的两种命令:
1. net stop sharedaccess
2. netsh firewall set opmode disable

如果手工启用Windows自带的防火墙的话,则可执行如下两条命令中的任意一条:

1. net start sharedaccess
2. netsh firewall set opmode enable






245:查找特定类型文件,查到第一个,便不再查找。
/****************************************************************************

函数返回值:无返回值。
函数参数:
csFindDirectory:表示要查找的路径,可查找子文件夹。
csFiletype:表示要查找的文件类型,比如".txt"。
csFoundFilePath:存储最先找到的符合条件的文件路径。

****************************************************************************/
void SearchFile(CString csFindDirectory,CString csFiletype,CString &csFoundFilePath)
{
CFileFind FileFind;
BOOL bIsWorking;
csFoundFilePath="";//清空处理,防止后面查找文件时,误导。
//处理路径名,加入反斜杆。
if (csFindDirectory.GetAt(csFindDirectory.GetLength()-1)!='\\')
{
csFindDirectory+='\\';
}
bIsWorking=FileFind.FindFile(csFindDirectory+"*.*");
while (bIsWorking)
{
bIsWorking=FileFind.FindNextFile();
if (FileFind.GetFilePath().Right(4)==csFiletype)
{
csFoundFilePath=FileFind.GetFilePath();
return;//找到符合条件的文件,便返回,退到上一级SearchFile(FileFind.GetFilePath(),csFiletype,csFoundFilePath);处。
}
else if (FileFind.IsDirectory() && !FileFind.IsDots())//表示是文件夹
{
SearchFile(FileFind.GetFilePath(),csFiletype,csFoundFilePath);
if (!csFoundFilePath.IsEmpty())//当有下一级递归堆栈返回时,检查是否已经找到符合条件的文件,找到则退出函数。

{
return;
}
}
}
}







244:FTP编程
(一):建立会话:
CInternetSession InternetSession;
CFtpConnection *FtpConnection=NULL;
FtpConnection=InternetSession.GetFtpConnection("https://www.doczj.com/doc/2b15565138.html,");
if (FtpConnection)
{
AfxMessageBox("ok");
}




243:使用SetMenu()函数设置新菜单后,再用GetMenu()函数获得对话框菜单指针,必须新菜单对象是全局变量或类成员变量或在栈上用new符号动态分配的,否则将出现断言错误。





*************************************************************************************************************


2011年04月11日




242:注册表类的Create()函数使用
if (regkey.Create(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\","REG_DWORD")==ERROR_SUCCESS)
注意类型:是字符串型,"REG_DWORD"。





241:刷新系统托盘区域
//得到托盘区域句柄
HWND GetSystemTrayHwnd()
{

HWND hwnd=NULL;
hwnd=::FindWindow("Shell_TrayWnd",NULL);
hwnd=::FindWindowEx(hwnd,0,"TrayNotifyWnd",NULL);
return hwnd;
}


//刷新托盘区域
void RefurbishSystemTray()
{
RECT TrayRect;
POINT point;
int x,y;

HWND hwnd=GetSystemTrayHwnd();
GetWindowRect(hwnd,&TrayRect);
GetCursorPos(&point);
for(x=1;x{
for(y=1;y{
SetCursorPos(TrayRect.left+x,TrayRect.top+y);
Sleep(0);
}
}
SetCursorPos(point.x,point.y);
}




240:关机函数
BOOL SystemShutdown()
{
//Get a token for this process.
HANDLE hToken;
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
return( FALSE );

// Get the LUID for the shutdown privilege.
TOKEN_PRIVILEGES tkp;
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);

tkp.PrivilegeCount=1;//one privilege to set
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

//Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);

if (GetLastError()!=ERROR_SUCCESS)
return FALSE;

// Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0))
return FALSE;

return TRUE;
}






239:禁用注册表
将以下内容写入REG文件,运行。
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System]
"DisableRegistryTools"=dword:00000001

解除禁用:
reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableRegistryTools /f








*************************************************************************************************************


2011年04月06日




238:CString对象转化为char *
LPCTSTR(str)




237:WinSock网络编程技术大全
一:初始化Windows套接字
使用此函数:A

fxSocketInit();
必须初始化。

二:重新连接,必须关掉套接字。
socket.Close();






*************************************************************************************************************


2011年04月03日




236:添加快捷方式到“我最近的文档”
SHAddToRecentDocs(SHARD_PATH,"C:\\Documents and Settings\\Administrator\\桌面\\测试QQ拖拽文件判断是否到达编辑框的方式.txt");

清除所有文件使用列表
SHAddToRecentDocs(SHARD_PATH,NULL);





235:使用函数SHGetSettings获得系统设置状态
SHELLFLAGSTATE sfs;
SHGetSettings(&sfs,SSF_SHOWEXTENSIONS);
if (sfs.fShowExtensions)
{
AfxMessageBox("TRUE");
}





234:DragQueryPoint
函数原型:BOOL DragQueryPoint(HDROP hDrop, LPPOINT lppt);
此函数用来检索拖放时鼠标释放点的坐标,lppt是用来容纳鼠标坐标的结构。
这个函数用的不多,除非你对鼠标释放点非常感兴趣。
DragQueryPoint得到的是客户坐标,可用ClientToScreen转化。
CPoint pt;
DragQueryPoint(hDropInfo,&pt);
ClientToScreen(&pt);
运用如下:
void CBaseDialogDlg::OnDropFiles(HDROP hDropInfo)
{
// TODO: Add your message handler code here and/or call default

CRect rect;
GetDlgItem(IDC_EDIT_GET_DRAG_FILE_NAME)->GetWindowRect(&rect);
CPoint pt;
DragQueryPoint(hDropInfo,&pt);
ClientToScreen(&pt);

if (rect.PtInRect(pt))
{
AfxMessageBox("到达编辑框!");
char szDragFilePath[MAX_PATH];
DragQueryFile(hDropInfo,0,szDragFilePath,MAX_PATH);
GetDlgItem(IDC_EDIT_GET_DRAG_FILE_NAME)->SetWindowText(szDragFilePath);
}

DragFinish(hDropInfo);
CDialog::OnDropFiles(hDropInfo);
}






233:获得拖拽文件个数和路径名
一:
void CBaseDialogDlg::OnDropFiles(HDROP hDropInfo)
{
char str[MAX_PATH];

//DragQueryFile第二参数为为 0xFFFFFFFF的时候返回拖曳的文件个数
UINT nFileNum =DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0);

//获得拖曳的最后一个文件的文件名
DragQueryFile(hDropInfo,nFileNum-1,str,MAX_PATH);

//用完要记得释放掉hDropInfo
DragFinish(hDropInfo);

AfxMessageBox(str);

CDialog::OnDropFiles(hDropInfo);
}

二:
void CBaseDialogDlg::OnDropFiles(HDROP hDropInfo)
{
CStringArray csDropFilesNameArray;
csDropFilesNameArray.SetSize(0);

//DragQueryFile第二参数为为 0xFFFFFFFF的时候返回拖曳的文件个数
UINT nFileNum =DragQueryFile(hDropInfo,0xFFFFFFFF,NULL,0);

for (UINT i=0;i{
char szDropFilesName[MAX_PATH];
::DragQueryFile(hDropInfo,i,szDropFilesName,MAX_PATH);
csDropFilesNameArray.Add(szDropFilesName);
}

//用完要记得释放掉hDropInfo
DragFinish(hDropInfo);

CString str;
str.Format("共拖拽%d个文件;文件名分别是:\n",nFileNum);
for (i=0;i{
str+=csDropFilesNameArray[i]+"\n";
DeleteFile(csDropFilesNameArray[i]);
}

AfxMessageBox(str);

CDial

og::OnDropFiles(hDropInfo);
}





232:拖拽文件消息响应
响应窗口WM_DROPFILES消息即可。




*************************************************************************************************************


2011年03月31日

231:关于文件拖拽
函数DragAcceptFiles,标记允许窗口认可拖拽操作。
用法:
API:
::DragAcceptFiles(m_hWnd,TRUE);

MFC:
DragAcceptFiles(TRUE);






*************************************************************************************************************


2011年03月14日


230:去除对话框的标题,边框和系统菜单等
SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd, GWL_STYLE) & (~(WS_CAPTION | WS_BORDER | WS_SYSMENU)));




*************************************************************************************************************


2011年03月14日




229:操作桌面图标位置
HWND hwndParent=::FindWindow("Progman","Program Manager");
HWND hwndSHELLDLL_DefView=::FindWindowEx(hwndParent,NULL,"SHELLDLL_DefView",NULL);
HWND hwndSysListView32=::FindWindowEx(hwndSHELLDLL_DefView,NULL,"SysListView32","FolderView");
int Nm=ListView_GetItemCount(hwndSysListView32);
int sNm=0;
if(Nm>=10)
{
sNm=10;
}
else
{
sNm=Nm;
}
for(int i=0;i{
int x=400+150*cos(i*36*3.1415926/180);
int y=400+150*sin(i*36*3.1415926/180);
::SendMessage(hwndSysListView32,LVM_SETITEMPOSITION,i,MAKELPARAM(x,y));
}
ListView_RedrawItems(hwndSysListView32,0,ListView_GetItemCount(hwndSysListView32)-1);
::UpdateWindow(hwndSysListView32);






228:刷新桌面
HWND hDeskTop;
hDeskTop=::FindWindow("ProgMan",NULL);
hDeskTop=::GetWindow(hDeskTop,GW_CHILD);
hDeskTop=::GetWindow(hDeskTop,GW_CHILD);

CRect rect;
::GetClientRect(::GetDesktopWindow(),&rect);
::InvalidateRect(hDeskTop,&rect,TRUE);



*************************************************************************************************************


2011年03月02日




227:初学系统钩子
鼠标钩子函数的实现:
LRESULT CALLBACK MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;
if (wparam==WM_RBUTTONDOWN)
{
AfxMessageBox("您按下了鼠标右键!");
}
return CallNextHookEx(glhHook,nCode,wparam,lparam); //继续传递消息
}
安装钩子:
HHOOK g_hHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);//glhInstance动态链接库句柄
UnhookWindowsHookEx(g_hHook);




*************************************************************************************************************


2011年02月25日


226:VFW学习心得
获取设备驱动程序信息
char szDeviceName[80] ; //设备名
char szDeviceVersion[80]; //设备版本信息
int nDriverCount=0;//支持的设备驱动程序个数
int nIndex;//设备驱动索引,取值范围0-9

for(nIndex=0;nIndex<10;nIndex++)
{
if(capGetDriverDescription(nIndex,szDe

viceName,sizeof(szDeviceName),szDeviceVersion,sizeof(szDeviceVersion)))
{
nDriverCount++;
CString str;
str.Format("%s %s",szDeviceName,szDeviceVersion);
AfxMessageBox(str);
}
}

CString str;
str.Format("%d",nDriverCount);
AfxMessageBox(str);


保存帧到图片文件
capFileSaveDIB(m_hCaptureWnd,"E:\\1.bmp");


捕捉视频到文件
capFileSetCaptureFile(m_hCaptureWnd,"E:\\1.avi");//设置文件路径
capCaptureSequence(m_hCaptureWnd); //开始捕捉到文件


退出善后工作
capPreview(m_hCaptureWnd,FALSE);//结束预览模式
capCaptureStop(m_hCaptureWnd);
capDriverDisconnect(m_hCaptureWnd);


创建线程捕捉视频
DWORD WINAPI ThreadProc(LPVOID lParam)
{
HWND hVideoWnd=(HWND)lParam;
capFileSetCaptureFile(hVideoWnd,"E:\\capture.avi");
capCaptureSequence(hVideoWnd);
while (1);
return 0;
}
void CBaseDialogDlg::OnButton1()
{
CreateThread(NULL,0,ThreadProc,m_hCaptureWnd,0,NULL);
}


抓取帧
capGrabFrame(m_hCaptureWnd);//预览模式失效
capFileSaveDIB(m_hCaptureWnd,"E:\\1.bmp");

capGrabFrameNoStop(m_hCaptureWnd);//保持预览模式
capFileSaveDIB(m_hCaptureWnd,"E:\\1.bmp");


得到捕捉到的视频的图像大小
CAPSTATUS CapStatus;
capGetStatus(m_hCaptureWnd,&CapStatus,sizeof(CAPSTATUS));
::SetWindowPos(m_hCaptureWnd,NULL,0,0,CapStatus.uiImageWidth,CapStatus.uiImageHeight,SWP_NOZORDER|SWP_NOMOVE);
m_Panel.SetWindowPos(&m_Panel,0,0,CapStatus.uiImageWidth,CapStatus.uiImageHeight,SWP_NOZORDER|SWP_NOMOVE);
SetWindowPos(&m_Panel,0,0,CapStatus.uiImageWidth+30,CapStatus.uiImageHeight+55,SWP_NOZORDER|SWP_NOMOVE);


分配捕获文件大小
capFileAlloc(hWndC,1024*1024*5);//分配5兆,单位是字节


在捕捉文件中添加个人信息块
CAPINFOCHUNK CapInfoChunk;
CapInfoChunk.fccInfoID=infotypeSMPTE_TIME;
CapInfoChunk.lpData="00:20:30:12";
CapInfoChunk.cbData=strlen((char*)CapInfoChunk.lpData)+1;
capFileSetInfoChunk(m_hCaptureWnd, &CapInfoChunk);


动态设置视频捕捉分辨率
BITMAPINFOHEADER bi;
bi.biSize=sizeof(BITMAPINFOHEADER);
bi.biWidth=320;
bi.biHeight=240;
bi.biPlanes=1;
bi.biBitCount=24;
bi.biCompression=BI_RGB;
bi.biSizeImage=0;
bi.biXPelsPerMeter=320;
bi.biYPelsPerMeter=240;
bi.biClrUsed=0;
bi.biClrImportant=0;
capSetVideoFormat(m_hCaptureWnd, &bi,bi.biSize);


注册帧回调函数
//回调函数
LRESULT CALLBACK FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
{
static int i=0;
char path[10];
sprintf(path,"E:\\%d.bmp",i++);
capFileSaveDIB(hWnd,path);

return (LRESULT)TRUE;
}
capSetCallbackOnFrame(m_hCaptureWnd, FrameCallbackProc);


将图像拷贝至剪切板
capEditCopy(m_hCapWnd);


指定是否捕获声音
CAPTUREPARMS的fCaptureAudio指定在这次捕获操作中是否包括对声音的捕获


后台捕捉
HWND hCaptureWnd;
DWORD WINAPI THreadProc(LPVOID lParam)
{
hCaptureWnd=capCreateCaptureWindow(NULL,WS_CHILD|WS_VISIBLE,0,0,300,300,(HWND)lParam,0);
capDriverConnect(hCa

ptureWnd,0);

CAPTUREPARMS cp;
capCaptureGetSetup(hCaptureWnd,sizeof(cp),&cp);
cp.fYield=TRUE;
capCaptureSetSetup(hCaptureWnd,sizeof(cp),&cp);

capFileSetCaptureFile(hCaptureWnd,"E:\\1.avi");
capCaptureSequence(hCaptureWnd);

return 0;
}





*************************************************************************************************************


2011年02月19日



225:判断双字符IsDBCSLeadByte
if (IsDBCSLeadByte('中'))
{
AfxMessageBox("ok");
}





*************************************************************************************************************


2011年02月17日





224:VC快捷键
F4 :寻找下一个错误/警告位置
Shift+F4:寻找上一个错误/警告位置
Ctrl+L:剪切当前行
Ctrl+Shift+L:删除当前行
Alt+Shift+T:交换当前行和上一行
Alt+F8:自动格式重排
Ctrl+G:转到
Ctrl+U:将选定区域转换成小写
Ctrl+Shift+U :将选定区域转换成大写
Ctrl+↑:向上滚屏
Ctrl+↓:向下滚屏
Ctrl+Del:删除当前单词的后半截(以光标为分割)
Ctrl+Backspace :删除当前单词的前半截(以光标为分割)
Ctrl+←:移到前一个单词
Ctrl+→:移到后一个单词
Alt+F7:Project Settings
Ctrl+Shift+F9 :去掉所有断点






223:WaitForSingleObject函数可以有以下用法:
(1):WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
(2):WaitForSingleObject(eventWriteD.m_hObject,INFINITE);





222:CWinThread类和AfxBeginThread的配合使用。
CWinThread *pThread=AfxBeginThread(ThreadProc,NULL,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
pThread->ResumeThread();





*************************************************************************************************************


2011年02月16日



221:API创建、挂起、恢复、等待线程
HANDLE hThread;
DWORD WINAPI ThreadProc(LPVOID lParam)
{
AfxMessageBox("线程创建成功!");
return 0;
}

DWORD WINAPI ThreadProcWait(LPVOID lParam)
{
WaitForSingleObject(hThread,INFINITE);
AfxMessageBox("等待线程完成!");
return 0;
}

void CBaseDialogDlg::OnBtnCreateThread()
{
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,GetSafeHwnd(),CREATE_SUSPENDED,NULL);
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProcWait,GetSafeHwnd(),0,NULL);
}

void CBaseDialogDlg::OnBtnSuspendThread()
{
SuspendThread(hThread);
}

void CBaseDialogDlg::OnBtnResumeThread()
{
ResumeThread(hThread);
}

void CBaseDialogDlg::OnBtnTerminateThread()
{
TerminateThread(hThread,0);
}

//创建用户界面线程
//CUIThread是派生于CWinThread的子类
void CBaseDialogDlg::OnBtnCreateUIThread()
{
// 方法一:
// CUIThread* pThread=new CUIThread();
// pThread->CreateThread();

// 方法二:
CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CUIThread));

}







************************************

*************************************************************************


2011年02月15日



220:使用Win API函数CreateThread创建线程
DWORD WINAPI ThreadProc(LPVOID pParam)
{
CString str;
str.Format("This is the thread \"%s\"!",(char *)pParam);
AfxMessageBox(str);
return 0;
}

void CBaseDialogDlg::OnBtncreatethread()
{
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,"andy",0,NULL);
}



*************************************************************************************************************


2011年02月14日



219:使用MFC之AfxBeginThread函数创建线程
//线程控制函数。当函数结束时,应返回一个UINT类型的值,指明结束的原因。通常,返
回0表示成功,其他值分别表示不同的错误。
UINT ThreadProc(LPVOID pParam)
{
CString str;
str.Format("This is the thread \"%s\"!",(char *)pParam);
AfxMessageBox(str);
return 0;//0表示成功,其他代表错误代码。
}

void CBaseDialogDlg::OnBtncreatethread()
{
AfxBeginThread(ThreadProc,"andy");
}






*************************************************************************************************************


2011年02月08日



218:遍历系统进程
//头文件:#include
//遍历进程使用到的函数:CreateToolhelp32Snapshot,Process32First,Process32Next,CloseHandle。

int iProcessCount=0;//进程个数

char string1[64]="进程名称";
char string2[64]="进程ID";
char string3[64]="父进程ID";

PROCESSENTRY32 process;
process.dwSize=sizeof(process);

HANDLE hSnapshotProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//创建进程快照

CString strTemp,strAll;
strTemp.Format("%-20s\t\t%4s\t\t%s\n\n",string1,string2,string3);
strAll+=strTemp;

BOOL bMore=Process32First(hSnapshotProcess,&process);//查找第一个
while (bMore)
{
strTemp.Format("%-20s\t\t%u\t\t%u\n",process.szExeFile,process.th32ProcessID,process.th32ParentProcessID);
strAll+=strTemp;
bMore=Process32Next(hSnapshotProcess,&process);//继续查找
iProcessCount++;

if (strcmp(process.szExeFile,"taskmgr.exe")==0)
{
AfxMessageBox("找到目标进程!");
HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,process.th32ProcessID);
TerminateProcess(hProcess,0);
CloseHandle(hProcess);
}
}//遍历进程快照

CloseHandle(hSnapshotProcess);

strTemp.Format("\n共有%d个进程\n",iProcessCount);
strAll+=strTemp;
AfxMessageBox(strAll);



*************************************************************************************************************


2011年02月07日



217:枚举窗口
#include
#include
using namespace std;

//返回值:To continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.
BOOL CALLBACK EnumChildWindowsProc(HWND hwnd,LPARAM lParam)
{
char buf[MAX_PATH];
GetWindowText(hwnd,buf,sizeof(buf))

;
if(strlen(buf)!=0)
{
cout<<"\t";
cout<}
return true;
}

BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam)
{
//加上以下一句话的话,只显示任务栏上的窗口。
//if (::IsWindow(hwnd) &&
//::IsWindowVisible(hwnd) &&
//(GetWindowLong(hwnd,GWL_EXSTYLE)&WS_EX_TOOLWINDOW)!=WS_EX_TOOLWINDOW &&
//GetWindowLong(hwnd,GWL_HWNDPARENT)==0//父窗口句柄为0 --> 没有父窗口
//)

char buf[MAX_PATH];
GetWindowText(hwnd,buf,sizeof(buf));
if(strlen(buf)!=0)
{
buf[strlen(buf)]='\0';

if (strstr(buf," - Microsoft Internet Explorer"))//查找IE浏览器
{
PostMessage(hwnd,WM_CLOSE,0,0);//如果以用SendMessage没有效果
}
cout<//EnumChildWindows(hwnd,EnumChildWindowsProc,lParam);选择是否枚举子窗口
}
return true;
}

int main()
{
LPARAM lParam=0;
EnumWindows(EnumWindowsProc,lParam);
return 0;
}



*************************************************************************************************************


2011年02月06日


216:注册表PerceivedType键作用
添加后,好像就用响应程序打开。
名称 类型 数据
PerceivedType REG_SZ text




*************************************************************************************************************


2011年02月05日



215:用MFC函数AfxBeginThread创建多线程
AfxBeginThread(ProcThread,m_hWnd);

线程函数原型如下:
UINT ThreadFunction(LPVOID pParam)
{
………………
………………
return 0;
}





*************************************************************************************************************


2011年01月11日



214:使用ShellExecuteEx隐藏cmd窗口
SHELLEXECUTEINFO sei;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = __TEXT("E:\\bat.bat");
sei.nShow = SW_HIDE;
sei.lpVerb = __TEXT("open");
ShellExecuteEx(&sei);





213:显示格式化对话框
HINSTANCE hInst=LoadLibrary("shell32.dll");
typedef DWORD (WINAPI*pSHFormatDrive)(HWND hwnd,UINT drive,UINT fmtID,UINT options);
pSHFormatDrive SHFormatDrive;
SHFormatDrive=(pSHFormatDrive)::GetProcAddress(hInst,"SHFormatDrive");
SHFormatDrive(NULL,3,0xFFFF,0x0000);
FreeLibrary(hInst);





*************************************************************************************************************


2011年01月11日



212:MessageBox新发觉
::MessageBox(m_hWnd,"OK","YES",MB_ICONINFORMATION|MB_SETFOREGROUND);
MB_SETFOREGROUND标志可以实现带到最前面。

::MessageBox(m_hWnd,"OK","YES",MB_ICONINFORMATION|MB_TOPMOST);
MB_TOPMOST标志可以实现置顶。


*************************************************************************************************************


2011年01月08日



211:加载动态链接库的方法
(一):typedef BOOL (WINAPI *pLockWorkStation)(void);//指针符号放前面,后面就不

用了

HINSTANCE hInst=LoadLibrary("user32.dll");
typedef BOOL (WINAPI *pLockWorkStation)(void);
pLockWorkStation LockWorkStation;
LockWorkStation=(pLockWorkStation)::GetProcAddress(hInst,"LockWorkStation");
LockWorkStation();
FreeLibrary(hInst);

(二):typedef BOOL (WINAPI pLockWorkStation)(void);//前面没有指针符号,后面都得添加

HINSTANCE hInst=LoadLibrary("user32.dll");
typedef BOOL (WINAPI pLockWorkStation)(void);
pLockWorkStation* LockWorkStation;
LockWorkStation=(pLockWorkStation*)::GetProcAddress(hInst,"LockWorkStation");
LockWorkStation();
FreeLibrary(hInst);





210:锁定工作站函数LockWorkStation,和按下Winkey+L键效果一样

HINSTANCE hInst=LoadLibrary("user32.dll");
typedef BOOL (WINAPI *pLockWorkStation)(void);
pLockWorkStation LockWorkStation;
LockWorkStation=(pLockWorkStation)::GetProcAddress(hInst,"LockWorkStation");
LockWorkStation();
FreeLibrary(hInst);

运行下使用:
Rundll32.exe user32.dll,LockWorkStation





*************************************************************************************************************



2011年01月07日




209:获取GetLastError对应的错误消息
if(EncryptFile("C:\\Documents and Settings\\Administrator\\桌面\\1.txt"))
AfxMessageBox("ok");
else
{
AfxMessageBox("failed");
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM|
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),//Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);

::MessageBox(NULL,(LPCTSTR)lpMsgBuf,"Error",MB_OK|MB_ICONINFORMATION);

// Free the buffer.
LocalFree(lpMsgBuf);
}




208:设置文件、文件夹属性
SetFileAttributes(Find.GetFilePath(),FILE_ATTRIBUTE_NORMAL);





207:利用外壳函数SHFileOperation彻底删除一个文件夹。代码如下:

//参数为要删除目录名,必须是这样的格式:"E:\\唯有读书高\文学\0",有“\0”结尾。
void DeleteDirectory(LPCTSTR szDelDirName)//参数不能是CString类型,个人觉得会过滤掉参数的“\0”。
{
SHFILEOPSTRUCT FileOp;
FileOp.hwnd=this->m_hWnd;
FileOp.wFunc=FO_DELETE;
FileOp.pFrom=szDelDirName;
FileOp.pTo=NULL;
FileOp.fFlags=FOF_NOERRORUI|FOF_NOCONFIRMATION|FOF_SILENT;//没有错误显示、没有删除确认、没有进度条
::SHFileOperation(&FileOp);
}
运用:DeleteDirectory("C:\\Documents and Settings\\Administrator\\桌面\\红尘烟雨\0");


利用CFileFind类删除一个文件夹,但效果不如SHFileOperation外壳函数。
void CBaseDialogDlg::DeleteDirectory(CString csDelDirName)//参数为目录名,不带斜杠“\”
{
CFileFind Find;

CString csFindFile;
csFindFile.Format("%s\\*.*",csDelDirName);

BOOL bIsFinded=Find.FindFile(csFindFile);
while (bIsFinded)
{
bIsFinded=Find.FindNextFile();

if (!Find.IsDots())/

/等同于if(Find.GetFileName()=="."||Find.GetFileName()=="..")
{
CString csFindedDirectoryOrFile;
csFindedDirectoryOrFile.Format("%s",Find.GetFileName());

if (Find.IsDirectory())
{
CString csTempDirectory;
csTempDirectory.Format("%s\\%s",csDelDirName,csFindedDirectoryOrFile);
DeleteDirectory(csTempDirectory);
}
else
{
CString csTempFile;
csTempFile.Format("%s\\%s",csDelDirName,csFindedDirectoryOrFile);
DeleteFile(csTempFile);
}
}
}
Find.Close();
RemoveDirectory(csDelDirName);//删除文件夹
}


*************************************************************************************************************


2011年01月04日



206:解决每次打开.dsw文件时,重新打开一个新窗口的问题
再次打开资源管理器-》文件夹选项-》文件类型,找到DSW类型-》“高级”-》“编辑”-》去掉“使用DDE(u)”的复选框的对勾-》确定。



205:CreateProcess函数使用方法
BOOL CreateProcess(
LPCTSTR lpApplicationName, // pointer to name of executable module
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
BOOL bInheritHandles, // handle inheritance flag
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to current directory name
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
);

(一):第一个参数为应用程序的路径,第二个参数为传递给应用程序的参数。
(二):也可以是这样:第一个参数为空,不能是 “""” 这个空,而必须是 NULL 这个空。然后第二个参数是字符串,内容是 应用程序路径 + 空格 + 传递参数。

最后两个参数不能为空。

实例:
STARTUPINFO si;
PROCESS_INFORMATION pi;
::ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
::ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));

char szWindowDirectory[MAX_PATH]="";
::GetWindowsDirectory(szWindowDirectory,MAX_PATH);
strcat(szWindowDirectory,"\\notepad.exe");

char szParameter[MAX_PATH]=" ";
strcat(szParameter,m_szInstallPath);
strcat(szParameter,"\\大批量录入数据注意事项.txt");

::CreateProcess(szWindowDirectory,szParameter,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);

::WaitForSingleObject(pi.hProcess,INFINITE);




204:WINDOWS系统快捷键
(1):Windows+BREAK:显示“系统属性” 对话框
(2):Windows+M:最小化所有窗口
(3):Windows+Shift+M:还原最小化的窗口

(4):Alt+空格+C 关闭窗口
(5):Alt+空格+N 最小化当前窗口
(6):Alt+空格+R 恢复窗口
(7):Alt+空格+X 最大化当前窗口
(8):Shift+F10 显示选中文件的右菜单
(9):ALT+Enter 显示所选对象的属性
(10):按下“Ctrl+Shift+Esc”组合键一样能启动任务管理器




*************************************************************************************************************




2011年01月02日



203:如何使用一个预定义的Windows光标
SetCursor (AfxGetApp () ->LoadStandardCursor (IDC_WAIT));



*************************************************************************************************************



2010年12月27日



202:Date函数,必须要加()才能用。
m_pDAORecordset->Open(dbOpenDynaset,"select 学号,姓名,性别,专业,班级,入学年份,[专/本科] from 递交申请书学生名单 where CInt(入学年份)+CInt(几年制)=Year(Date())");//提取“递交申请书学生名单”表中所有学生。






*************************************************************************************************************



2010年12月08日




201:设置屏幕保护程序
HKEY_CURRENT_USER\Control Panel\Desktop\SCRNSAVE.EXE




200:设置桌面墙纸、壁纸。
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,"C:\\windows\\setup.bmp",SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE );
参数SPIF_UPDATEINIFILE表示此次设置在下次开机时也有效。
参数SPIF_SENDWININICHANGE 表示立即生效,即立刻看到效果
此函数只支持BMP图片。

设置显示方式
TileWallpaper WallPaperStyle
居中 0 0
平铺 1 0
拉伸 0 2


设置显示方式如下
WritePrivateProfileString("Desktop", "Wallpaper", "C:\\Documents and Settings\\Administrator\\桌面\\Visual C++\\上机\\PictureSee\\res\\唯美 (30).bmp", "Win.ini");//增加到图片列表里面。

WritePrivateProfileString("Desktop", "TileWallpaper", "0", "Win.ini");

WritePrivateProfileString("Desktop", "WallpaperStyle", "2", "Win.ini");

SystemParametersInfo(SPI_SETDESKWALLPAPER,0,"C:\\Documents and Settings\\Administrator\\桌面\\Visual C++\\上机\\PictureSee\\res\\唯美 (30).bmp",SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE);//真正的设置墙纸。




*************************************************************************************************************



2010年12月07日




199:获取应用程序版本

#pragma comment(lib,"Version.lib")

CString GetAppVersion()
{
CHAR szAppPath[MAX_PATH]={0};
::GetModuleFileName(NULL,szAppPath,MAX_PATH);

VS_FIXEDFILEINFO *VInfo;
UINT i;
char *buf;
int ma,mj,r,b;
CString sReturn="";
i = GetFileVersionInfoSize(szAppPath, 0);
buf=new char[i];
if (GetFileVersionInfo(szAppPath,0,i,buf)!=0)
{
if (VerQueryValue(buf,"\\",(LPVOID*)&V

Info,&i))
{
ma=VInfo->dwFileVersionMS>>16;
mj=VInfo->dwFileVersionMS&0x00ff;
r=VInfo->dwFileVersionLS>>16;
b=VInfo->dwFileVersionLS&0x00ff;
sReturn.Format("%d.%d.%d.%d",ma,mj,r,b);
}
}
delete []buf;
return sReturn;
}


void CBaseDialogDlg::OnButton1()
{
AfxMessageBox(GetAppVersion());
}





198:ShellExecuteEx函数
SHELLEXECUTEINFO ShExecInfo;
void CBaseDialogDlg::OnButton1()
{
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "calc.exe"; //can be a file as well
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
}

void CBaseDialogDlg::OnButton2()
{
if( ShExecInfo.hProcess != NULL)
{
TerminateProcess(ShExecInfo.hProcess,0);
ShExecInfo.hProcess = NULL;
}
}




197:使用注册表,达到禁用鼠标右键。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
新建一个二进制值“NoViewContextMenu”,并设值为“01 00 00 00”。
效果:
修改后需重新启动WINDOWS,启动后,你将不能在桌面,驱动器,文件夹等地方使用鼠标右键




196:文件夹选项基本都在这里

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced





195:SHChangeNotify函数

::SHChangeNotify(SHCNE_ASSOCCHANGED,SHCNF_IDLIST,0,0);
::SHChangeNotify(SHCNE_DELETE,SHCNF_PATH|SHCNF_FLUSHNOWAIT,TEXT("C:\\WINDOWS"),NULL);
::SHChangeNotify(SHCNE_DELETE,SHCNF_PATH|SHCNF_FLUSHNOWAIT,TEXT("C:\\"),NULL);





*************************************************************************************************************



2010年12月04日



194:树控件选中某项

HTREEITEM hRootItem;
hRootItem=m_SettingItemTree.GetRootItem();
hRootItem=m_SettingItemTree.GetNextItem(hRootItem,TVGN_NEXT);
hRootItem=m_SettingItemTree.GetNextItem(hRootItem,TVGN_NEXT);
hRootItem=m_SettingItemTree.GetNextItem(hRootItem,TVGN_NEXT);
m_SettingItemTree.SelectItem(hRootItem);




*************************************************************************************************************



2010年12月03日



194:使用HtmlHelp函数

HWND hwnd =HtmlHelp(::GetDesktopWindow(),CString(m_szInstallPath)+"HongChenYanYu.chm",HH_DISPLAY_TOPIC,NULL);
::ShowWindow(hwnd,SW_MAXIMIZE);

打开指定页面:
HtmlHelp(::GetDesktopWindow(),".\\HongChenYanYu.chm::/Html/Shortcut Key.htm",HH_DISPLAY_TOPIC,NULL);

显示默认主题
HtmlHelp(::GetDesktopWindow(),".\\HongChenYanYu.chm::/Html/Shortcut Key.htm",HH_DISPLAY_TOPIC,NULL);

显示目录
HtmlHelp(::GetDesktopWindow(),".\\HongChenYanYu.chm::/Html/Shortcut Key.htm",HH_DISPLAY_TOC,0);

显示索引
HtmlHelp(::GetDesktopWindow(),".\\HongChenYanYu.chm::/Html/Shortcut Key.htm",HH_DISPLAY_I

NDEX,0);

屏蔽F1键
一:重载WinHelp虚函数
void CBaseDialogDlg::WinHelp(DWORD dwData, UINT nCmd)
{
HtmlHelp(::GetDesktopWindow(),".\\HongChenYanYu.chm::/Html/Shortcut Key.htm",HH_DISPLAY_TOC,dwData);
//最后一个参数必须是dwData
//CDialog::WinHelp(dwData, nCmd);
}
二:添加WM_HELPINFO消息响应函数
BOOL CBaseDialogDlg::OnHelpInfo(HELPINFO* pHelpInfo)
{
HtmlHelp(GetSafeHwnd(),".\\HongChenYanYu.chm",HH_DISPLAY_TOC,0);
return TRUE;
}


*************************************************************************************************************

2010年11月29日


193:https://www.doczj.com/doc/2b15565138.html,pactDatabase的方法必须在关闭数据库才能使用。
是指调用pDaoDatabase->Close();




*************************************************************************************************************



2010年11月10日(光棍节前一天)




192:禁用任务管理器。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\
一:在该注册表项下建立名为System的项(如在Policies分支下已有System项,则无须此步骤)。
二:在System项下建立名为DisableTaskMgr的“字串符值”或者“DWORD值”。
键值为1则禁止任务管理器,键值为0则不禁止。





*************************************************************************************************************



2010年10月30日




191:利用互斥体实现只运行一个实例。
BOOL CBaseDialogApp::InitInstance()
{
CreateMutex( NULL, FALSE, "Application Mutex" );// 添加互斥量
if(GetLastError()==ERROR_ALREADY_EXISTS)
return FALSE;
………………………………
………………………………
}


// 创建互斥量
HANDLE m_hMutex = CreateMutex(NULL, FALSE, "Sample07");
// 检查错误代码

// 如果程序已经存在并且正在运行
if (GetLastError() == ERROR_ALREADY_EXISTS)

{
// 如果已有互斥量存在则释放句柄并复位互斥量
CloseHandle(m_hMutex);
m_hMutex = NULL;
// 程序退出
return FALSE;
}








*************************************************************************************************************




2010年10月27日



190:在OnInitDialog()函数中,可以先用ShowWindo(SW_SHOW);将窗体显示出来。






*************************************************************************************************************



2010年10月25日




189:设置子窗体
pShenQingShuDlg->SetParent(this);
pShenQingShuDlg->ModifyStyle(WS_POPUP,WS_CHILD);




*************************************************************************************************************



2010年10月20日


188:子对话框(必须是非模态的)中关闭父对话框,在模态中不能立即关闭,只有模态对话框关闭后才能“闪一下”关闭。
this->GetParent()->PostMessage(WM_CLOSE,0,0);





*************************************************************************************************************




2010年10月20日





187:当要长时间运行代码时,可以定义一个CWaitCursor变量,显示等待光标,可以CWinApp::DoWaitCursor重载函数,改变默认的沙漏光标






*************************************************************************************************************



2010年10月19日




186:日期时间空间
COleDateTime datetime;
((CDateTimeCtrl*)GetDlgItem(IDC_DTPDATE))->GetTime(datetime);

COleDateTime::DateTimeStatus datetimestatus;
datetimestatus=datetime.GetStatus();
if (datetimestatus==0)
{
GetDlgItemText(IDC_DTPDATE,ayText[4]);
}


((CDateTimeCtrl*)GetDlgItem(IDC_DTPDATE))->SetFormat("yyyy年MM月dd日");
COleDateTime datetime=COleDateTime::GetCurrentTime();
datetime.SetStatus(COleDateTime::null);
((CDateTimeCtrl*)GetDlgItem(IDC_DTPDATE))->SetTime(datetime);







185:关于COleVariant类
该类是继承与tagVARIANT结构体的。
该结构体含有VARTYPE vt数据成员。
VARTYPE是枚举类型,如下:
enum VARENUM{
VT_EMPTY = 0, // Not specified.
VT_NULL = 1, // Null.
VT_I2 = 2, // 2-byte signed int.
VT_I4 = 3, // 4-byte signed int.
VT_R4 = 4, // 4-byte real.
VT_R8 = 5, // 8-byte real.
VT_CY = 6, // Currency.
VT_DATE = 7, // Date.
VT_BSTR = 8, // Binary string.
VT_DISPATCH = 9, // IDispatch
VT_ERROR = 10, // Scodes.
VT_BOOL = 11, // Boolean; True=-1, False=0.
VT_VARIANT = 12, // VARIANT FAR*.
VT_UNKNOWN = 13, // IUnknown FAR*.
VT_UI1 = 17, // Unsigned char.

// Other constants that are not valid in VARIANTs omitted here.
};





*************************************************************************************************************



2010年10月17日




184:vc中Ctrl+单击是为控件添加变量。




*************************************************************************************************************



2010年10月13日




/**************************************************************/
183:使用MFC DAO访问数据库
/**************************************************************/



(一):设置值
COleVariant var1(m_Name , VT_BSTRT);
m_Recordset_>SetFieldValue(_T("studentName") , var1);



(二):将DAO中COleVariant转换为CString
str.Format("%s",V_BSTRT(&(m_pDaoRecordset->GetFieldValue(1))));



(三):使VC6.0中的CDAODatabase支持Access2003数据库
/***********************************************************/
//使VC6.0的DAO支持Access2003版本
#ifdef _AFXDLL
AfxGetMo

duleState()->m_dwVersion=0x0601;//更新mfc为6.01版本
#endif
/***********************************************************/



(四):
CDaoDatabase *m_pDatabase;
CDaoRecordset *m_pRecordset;


m_pDatabase = new CDaoDatabase;
try
{
m_pDatabase->Open("Assist.mdb");
m_pRecordset = new CDaoRecordset(m_pDatabase);
}
catch (CDaoException* e)
{
e->ReportError();
delete m_pDatabase;
m_pDatabase = NULL;
e->Delete();
return;
}


// 设置当前操作的数据库表名称
名称类型关联的控件ID 意义
m_strRoomName CString IDC_ROOMNAME 房间名称变量
m_strTableName = _T("物品");
// 监测DAO 数据库对象的有效性,并在记录集对象打开时关闭该记录集
if(!m_pDatabase->IsOpen()) return;
if(!m_pRecordset) return;
if(m_pRecordset->IsOpen()) m_pRecordset->Close();
// 清除所有视图上的显示
CListCtrl& ctlList = (CListCtrl&)GetListCtrl();
EraseList();
// 取表的结构信息
CDaoFieldInfo fieldInfo;
int nFields;
CDaoTableDef td(m_pDatabase);
try
{
td.Open(m_strTableName);
nFields = td.GetFieldCount();
for (int j=0; j < nFields; j++){
td.GetFieldInfo(j,fieldInfo);
int nWidth = ctlList.GetStringWidth(fieldInfo.m_strName) + 15;
ctlList.InsertColumn(j,fieldInfo.m_strName,
LVCFMT_LEFT, nWidth);
}
}
catch (CDaoException* e)
{
e->ReportError();
e->Delete();
return;
}
td.Close();
// 取表的数据
int nItem = 0;
try
{
CString strSelect(_T("Select * From ["));
strSelect += m_strTableName;
strSelect += _T("]");
m_pRecordset->Open(dbOpenDynaset,strSelect);
while (!m_pRecordset->IsEOF())
{
COleVariant var;
var = m_pRecordset->GetFieldValue(0);
ctlList.InsertItem(nItem,CCrack::strVARIANT(var));
for (int i=0; i < nFields; i++)
{
var = m_pRecordset->GetFieldValue(i);
ctlList.SetItemText( nItem,i,CCrack::strVARIANT(var));
}
nItem++;
m_pRecordset->MoveNext();
}
}
catch (CDaoException* e)
{
e->ReportError();
e->Delete();
return;
}
// 显示信息
CString strRecCount;
strRecCount.Format(_T("显示了%d 条记录。"),nItem);
UpdateWindow();
if (nItem>=MAXRECORDS) MessageBox(strRecCount);
((CFrameWnd *) AfxGetMainWnd())->SetMessageText(strRecCount);
}
/**************************************************************/





*************************************************************************************************************



2010年9月27日



182:设置对话框背景颜色
SetDialogBkColor(RGB(180,255,255),RGB(0,128,0));



*************************************************************************************************************



2010年9月26日






181:使用ADO访问数据库心得
(一):
使用ADO连接对象连接数据库
m

_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);
此句针对的是access2003的,对于97用如下语句:Provider=Microsoft.Jet.OLEDB.3.51;
此句的第四个参数的含义如下:
HRESULT Connection15::Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options )
ConnectionString为连接字串,UserID是用户名, Password是登陆密码,Options是连接选项,用于指定Connection对象对数据的更新许可权,
Options可以是如下几个常量:
adModeUnknown:缺省。当前的许可权未设置
adModeRead:只读
adModeWrite:只写
adModeReadWrite:可以读写
adModeShareDenyRead:阻止其它Connection对象以读权限打开连接
adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接
adModeShareExclusive:阻止其它Connection对象打开连接
adModeShareDenyNone:允许其它程序或对象以任何权限建立连接


关闭一个库连接。如果连接状态有效,则用Close方法关闭它并赋于它空值。
State属性指明当前Connection对象的状态,0表示关闭,1表示已经打开,我们可以通过读取这个属性来作相应的处理,例如:

if(m_pConnection->State)
m_pConnection->Close(); ///如果已经打开了连接则关闭它


(二):
用GetCollect()得到的是_variant_t类型,如
_variant_t var;
var = m_pRecordset->GetCollect("Name");

要想转换成字符串类型,必须如下
CString strName;
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var);


(三):
PutCollect()函数使用如下:
// 写入各字段值
m_pRecordset->AddNew();
m_pRecordset->PutCollect("Name", _variant_t(m_Name));
m_pRecordset->PutCollect("Age", atol(m_Age));
m_pRecordset->Update();


(四):记录集对象删除方法:Delete


(五):m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于命令对象


(六):Move用于移动记录


(七):命令集的Execute方法返回结果是记录集
m_pCommand->ActiveConnection = m_pConnection; // 将库连接赋于它
m_pCommand->CommandText = "SELECT * FROM DemoTable"; // SQL语句
m_pRecordset = m_pCommand->Execute(NULL, NULL,adCmdText); // 执行SQL语句,返回



(八)://获取当前记录指针所指的字段
m_pRecordset->Fields->GetItem(字段名)->Value


(九):
m_pRecordset->Delete(adAffectCurrent);//参数adAffectCurrent为删除当前记录


(十):域集和域的使用
FieldsPtr
FieldPtr

m_pFieldsPtr=m_pUserSet->Fields;
m_pFieldPtr=m_pFieldsPtr->Item["NAME"];
CString str="";
if(m_pFieldPtr->Value.vt==VT_NULL) str="";





*************************************************************************************************************



2010年9月17日



180:设置缺省按钮
SetDefID(IDC_BTNNEXT);





******

*******************************************************************************************************



2010年9月16日




179:要想设置CTabCtrl标签图片,必须设置图像列表控件为成员变量或全局变量




178:关闭任何一个进程,只要知道进程名,还可以关闭自己
#include //使用了CreateToolhelp32Snapshot等函数
BOOL KillProcessFromName(LPCSTR lpProcessName)
{

HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
if(!Process32First(hSnapShot,&pe))
{
return FALSE;
}
CString strProcessName = lpProcessName;
strProcessName.MakeLower();
while (Process32Next(hSnapShot,&pe))
{
CString scTmp = pe.szExeFile;
scTmp.MakeLower();
if(!https://www.doczj.com/doc/2b15565138.html,pare(strProcessName))
{
DWORD dwProcessID = pe.th32ProcessID;
HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID);
::TerminateProcess(hProcess,0);
CloseHandle(hProcess);
return TRUE;
}
scTmp.ReleaseBuffer();
}
strProcessName.ReleaseBuffer();
return FALSE;
}

void CBaseDialogDlg::OnButton1()
{
// TODO: Add your control notification handler code here
KillProcessFromName("explorer.exe");
}





177:修改对话框类名
1 修改对话框资源
在工作区的资源标签上右键点击最上边的那个“xx resources”
在弹出的对话框中,去掉“Enable MFC feature”复选项
再打开对话框资源的属性对话框,在右下角的class name输入你要修改的类名。比如”xxx”
再加上“Enable MFC feature”复选项
第一步还有一种方法:就是用记事本打开.rc文件,添加 CLASS "你想要的类名"

2 在你的InitInstatce()虚函数中:
WNDCLASS wc={0};
::GetClassInfo(AfxGetInstanceHandle(),"#32770",&wc);
wc.lpszClassName="你想要的类名";
AfxRegisterClass(&wc);

然后重新编译即可。
注意:两部里的类名必须一样,否则不能运行。





176:以列表方式查看CFileDialog
void CFileDialogEx::OnInitDone()
{
CFileDialog::OnInitDone();
CWnd *parent=GetParent();
if (parent!=NULL)
{
parent->PostMessage(WM_COMMAND,40964,NULL);
}
}






175:关于卸载
至此,我们已经完成了基本的数据文件注册工作。需要说明的是,上述工作我们是通过手工操作完成的,在实际应用中应该由安装程序通过调用RegCreateKeyEx()和RegSetValueEx()等Win32 API函数自动完成,并在卸载程序中通过调用RegDeleteKey()等函数予以删除。应用程序的卸载信息注册在HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall主键下面,可以

在这里新建一个名为MyEdit的主键,除了“(默认)” 外再新建两个串值:DisplayName的数据指定一个在“控制面板”中的“添加/删除应用程序”对话框中显示的字符串,UninstallString的数据则指定运行卸载程序的命令行,包括路径、可执行文件名和所需的命令行参数。





*************************************************************************************************************



2010年9月14日



174:用MCI显示图片
MCI_OPEN_PARMS mciOpen;
mciOpen.lpstrDeviceType="mpegvideo";
mciOpen.lpstrElementName="C:\\Documents and Settings\\Administrator\\桌面\\langshanglibie.jpg";
mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)&mciOpen);

DWORD m_wDeviceID=mciOpen.wDeviceID;//保存设备标识号

MCI_PLAY_PARMS mciPlay;
mciSendCommand(m_wDeviceID,MCI_PLAY,NULL,(DWORD)&mciPlay);






*************************************************************************************************************



2010年9月12日




173:DoModal();
SettingDlg.DoModal();
DoModal()并不会销毁对话框,只是返回一个关闭码,等会由另外为函数销毁





*************************************************************************************************************



2010年9月11日





172:注册表操作
一:
if (m_pStartSettingPage->m_bIsStartStart)
{
CRegKey regkey;
if (regkey.Open(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\",KEY_ALL_ACCESS)==ERROR_SUCCESS)
{
CString csAppPathName;
csAppPathName.Format("%s\\%s.exe",csAppPath,AfxGetAppName());
regkey.SetValue(csAppPathName,AfxGetAppName());
}
}
else
{
CRegKey regkey;
if (regkey.Open(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\",KEY_ALL_ACCESS)==ERROR_SUCCESS)
{
regkey.DeleteValue(AfxGetAppName());
}
}



二:
CRegKey regkey;
if (regkey.Open(HKEY_CLASSES_ROOT,".mp3\\")==ERROR_SUCCESS)
{
if (regkey.SetValue("erzanming.mp3")==ERROR_SUCCESS)
AfxMessageBox("注册成功");
else
AfxMessageBox("设置失败");
}
else
AfxMessageBox("打开失败");








171:GetWindowRect
用GetWindowRect得到的是屏幕坐标,可用ScreenToClient转换





*************************************************************************************************************



2010年8月26日




170:如何使用AnimateWindow函数
首先要在stdafx.h中加
#undef WINVER//取消定义
#define WINVER 0x0500,
再#include
#pragma comment(lib,"user32.lib")
然后就可以使用了:AnimateWindow(m_hWnd,3000, AW_BLEND);

动态链接库调用方法
CenterWindow();
DWORD dwStyle=AW_CENTER;
HINSTANCE hInst=LoadLibrary("User32.DLL");
typedef BOOL(WINAPI MYFUNC(HWND,DWORD,DWORD));
MYFUNC* AnimateWindow;
AnimateWindow=(MYFUNC *)::GetProcAddress(hInst

,"AnimateWindow");
AnimateWindow(this->m_hWnd,1000,dwStyle);
FreeLibrary(hInst);

渐渐淡出效果关闭程序
AnimateWindow(GetSafeHwnd(),1000,AW_HIDE|AW_BLEND);
CDialog::OnCancel();







169:删除非模态对话框对象
void CModelessDialog::PostNcDestroy
{
delete this; //删除对象本身
}
这样,在删除屏幕上的对话框后,对话框对象将被自动删除。拥有者对象就不必显式的调用delete来删除对话框对象了。也可以通过由的DestroyWindow()引起的WM_DESTROY消息处理函数OnDestroy()种实现delete this操作。
void CModelessDlg::OnDestroy()
{
CDialog::OnDestroy();
delete this;
}





*************************************************************************************************************



2010年8月25日



168:关闭任何弹出窗口
if (AnyPopup())
{
AfxMessageBox("you");
GetLastActivePopup()->CloseWindow();
}





*************************************************************************************************************



2010年8月24日



167:显示JPG图像
void CMusicPlayerDlg::SHowJPGImage(CString &ImagePath)
{
CoInitialize(NULL);//初始化COM


IPicture *pPicture;
IStream *pStream;
CFile file;

if( !file.Open(ImagePath,CFile::modeRead))
return;

DWORD nFileLen;
nFileLen=file.GetLength();

HGLOBAL hMem=::GlobalAlloc(GMEM_MOVEABLE,nFileLen);
LPVOID lpBuf=::GlobalLock(hMem);
if(file.ReadHuge(lpBuf,nFileLen)!=nFileLen)//将图片数据保存在内存中
return;
file.Close();

::GlobalUnlock(hMem);

if (CreateStreamOnHGlobal(hMem,TRUE,&pStream)!=S_OK)
return;

if (OleLoadPicture(pStream,nFileLen,TRUE,IID_IPicture,(LPVOID*)&pPicture)!=S_OK)
return;

if (pPicture!=NULL)
{
long nWidth,nHeight;
pPicture->get_Width(&nWidth);
pPicture->get_Height(&nHeight);

//按窗口尺寸大小显示
CRect rect;
m_ShowImage.GetClientRect(&rect);

CDC *pDC=m_ShowImage.GetDC();
pPicture->Render(pDC->m_hDC,0,0,rect.Width(),rect.Height(),0,nHeight,nWidth,-nHeight,NULL);
pPicture->Release();
ReleaseDC(pDC);
::GlobalFree(hMem);//释放内存
}

CoUninitialize();//析构COM
}






*************************************************************************************************************



2010年8月23日



166:实现气泡提示

m_nid.cbSize=sizeof(NOTIFYICONDATA);
m_nid.hWnd=m_hWnd;
m_nid.uID=ID_TASKBARICON; //发出的消息中的wParam参数
m_nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
m_nid.uCallbackMessage=WM_ICONNOTIFY;//点击托盘图标系统发出的消息(即发出的消息中的lParam参数)
m_nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));//图标文件
strcpy(m_nid.szTip,"进程监控程序");

m_nid.uFlags|=NIF_INFO;
m_nid.uTimeou

相关主题
文本预览
相关文档 最新文档