作者在 2011-11-19 17:52:47 发布以下内容
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.07.31
------------------------------------------------------------------------------------
No.1 /*调用外部程序*/
::ShellExecute(NULL,"open","NOTEPAD.EXE","E:\\学习\\计算机学习\\面向对象程序设计\\学习笔记\\MFC学习笔记.txt","E:\\学习\\计算机学习\\面向对象程序设计\\学习笔记\\MFC学习笔记.txt",SW_SHOWDEFAULT);
原型:
WINSHELLAPI HINSTANCE APIENTRY ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);
------------------------------------------------------------------------------------
No.2 /*以命令行方式调用外部程序*/
::WinExec("NOTEPAD.EXE E:\\学习\\计算机学习\\面向对象程序设计\\学习笔记\\MFC学习笔记.txt",SW_SHOWDEFAULT);
原型:
WINBASEAPI UINT WINAPI WinExec(LPCSTR lpCmdLine,UINT uCmdShow);
------------------------------------------------------------------------------------
No.3 /*SystemParametersInfo*/
//设置桌面壁纸
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,lpPath,0);
//屏蔽掉系统键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);
//可屏蔽 Ctrl+Alt+Del
//Alt+F4 在OnSysCommand()中可以取消
//另见No.42,in 3;
SystemParametersInfo(SPI_SETSWITCHTASKDISABLE,true,&bOld,SPIF_UPDATEINIFILE);
原型:
WINUSERAPI BOOL WINAPI
SystemParametersInfo(
UINT uiAction,
UINT uiParam,
PVOID pvParam,
UINT fWinIni);
参数 uiAction 具体值参见文件:
E:\学习\计算机学习\面向对象程序设计\学习笔记\相应文档\SystemParametersinfo.txt
------------------------------------------------------------------------------------
No.4 /*文件处理之浏览文件*/
1.定义:
OPENFILENAME file={0};
2.为file.lpstrFile申请空间:
char lpPath[260]={0};
file.lpstrFile=lpPath;
3.为file赋其他初值:
file.lStructSize=sizeof(OPENFILENAME);
file.lpstrFile=lpPath;
file.nMaxFile=260;
file.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files\0*.*\0\0";
file.nFilterIndex=1;
4.调用GetOpenFileName函数:
if(GetOpenFileName(&file)!=0)
{...};
就可得到文件名,在lpPath所指字符串中。
------------------------------------------------------------------------------------
No.5 /*文件处理之搜索文件*/
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.07.31
------------------------------------------------------------------------------------
No.1 /*调用外部程序*/
::ShellExecute(NULL,"open","NOTEPAD.EXE","E:\\学习\\计算机学习\\面向对象程序设计\\学习笔记\\MFC学习笔记.txt","E:\\学习\\计算机学习\\面向对象程序设计\\学习笔记\\MFC学习笔记.txt",SW_SHOWDEFAULT);
原型:
WINSHELLAPI HINSTANCE APIENTRY ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);
------------------------------------------------------------------------------------
No.2 /*以命令行方式调用外部程序*/
::WinExec("NOTEPAD.EXE E:\\学习\\计算机学习\\面向对象程序设计\\学习笔记\\MFC学习笔记.txt",SW_SHOWDEFAULT);
原型:
WINBASEAPI UINT WINAPI WinExec(LPCSTR lpCmdLine,UINT uCmdShow);
------------------------------------------------------------------------------------
No.3 /*SystemParametersInfo*/
//设置桌面壁纸
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,lpPath,0);
//屏蔽掉系统键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);
//可屏蔽 Ctrl+Alt+Del
//Alt+F4 在OnSysCommand()中可以取消
//另见No.42,in 3;
SystemParametersInfo(SPI_SETSWITCHTASKDISABLE,true,&bOld,SPIF_UPDATEINIFILE);
原型:
WINUSERAPI BOOL WINAPI
SystemParametersInfo(
UINT uiAction,
UINT uiParam,
PVOID pvParam,
UINT fWinIni);
参数 uiAction 具体值参见文件:
E:\学习\计算机学习\面向对象程序设计\学习笔记\相应文档\SystemParametersinfo.txt
------------------------------------------------------------------------------------
No.4 /*文件处理之浏览文件*/
1.定义:
OPENFILENAME file={0};
2.为file.lpstrFile申请空间:
char lpPath[260]={0};
file.lpstrFile=lpPath;
3.为file赋其他初值:
file.lStructSize=sizeof(OPENFILENAME);
file.lpstrFile=lpPath;
file.nMaxFile=260;
file.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files\0*.*\0\0";
file.nFilterIndex=1;
4.调用GetOpenFileName函数:
if(GetOpenFileName(&file)!=0)
{...};
就可得到文件名,在lpPath所指字符串中。
------------------------------------------------------------------------------------
No.5 /*文件处理之搜索文件*/
1.初始化,设置搜索条件(路径,后缀名等,例中由dir决定):
CFileFind ff;
CString dir("D:\\MyDir\\*.txt");
BOOL bfile=ff.FindFile(dir);
2.循环调用ff.FindNextFile函数进行搜索:
while(bfile)
{
bfile=ff.FindNextFile();
if(!(ff.IsDots())&&!(ff.IsDirectory()))
{...};
};
3.搜索结果有三种:
(1)Dots: "."表示本层目录,".."表示上一层目录,此时ff.IsDots()返回值为TRUE;
(2)Directory: 子目录,此时ff.IsDirectory()返回值为TRUE;
(3)文件
4.对每个查找到的文件可以查看文件信息:
(1)BOOL GetCreationTime(CTime &); 或BOOL GetCreationTime(FILETIME*);
BOOL GetLastAccessTime(CTime &); 或BOOL GetLastAccessTime(FILETIME*);
BOOL GetLastWriteTime(CTime &); 或BOOL GetLastWriteTime(FILETIME*);
(2)CString GetFileName(); //文件名.后缀名
(3)CString GetFilePath(); //全路径+文件名.后缀名
(4)CString GetFileTitle(); //只有文件名
(5)CString GetRoot();
(6)DWORD GetLength(); 或__int64 GetLength64();
(7)BOOL IsHidden();
BOOL IsNormal();
BOOL IsReadOnly();
BOOL IsSystem();
BOOL IsTemporary();
------------------------------------------------------------------------------------
No.6 /*文件处理之一般处理*/
1.进入文件夹(设置工作文件夹):
chdir(LPTSTR path);
SetCurrentDirectory(LPCTSTR lpPathName);
2.文件删除:
BOOL DeleteFile(LPTSTR lpFileName);
3.文件复制:
BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists);其中参数bFailIfExists告诉系统当目标文件存在时如何操作,当bFailIfExists为true时,如果目标文件存在,则函数执行失败;当bFailIfExists为false时,如果目标文件存在,则覆盖目标文件。
4.文件重命名:
BOOL RenameFile(const AnsiString OldName, const AnsiString NewName);
5.返回文件的完整的路径名和文件名:
AnsiString ExpandFileName(AnsiString FileName);
6.返回指定文件的文件名:
AnsiString ExtractFileName(AnsiString FileName);
7.返回指定文件的扩展名:
AnsiString ExtractFileExt(AnsiString FileName);
8.创建新文件夹:
BOOL CreateDirectory( LPCTSTR lpPathName,LPSECURITY_ATTRIBUTES lpSecurityAttributes);lpSecurityAttributes为安全属性。
9.移动存在的文件或目录:
BOOL MoveFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName);
10.创建文件(即打开文件):
CreateFile(...);
11.关闭文件:
CloseHandle();
------------------------------------------------------------------------------------
No.7 /*获取用户名和计算机名:*/
GetUserName(LPTSTR lpName,LPDWORD lpSize);
GetComputerName(LPTSTR lpName,LPDWORD lpSize);
lpSize表示字符串长度的最大值。
/*获取程序的全路径名*/
DWORD WINAPI GetModuleFileName(HMODULE hModule,LPSTR lpFilename,DWORD nSize);
获得自己的全路径名时第一个参数用NULL,路径名保存在lpFilename中。
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.1
------------------------------------------------------------------------------------
No.8 /*动态链接库(dll文件)的生成*/
1.非MFC动态链接库生成
(1)创建 Win32 Dynamic-Link Library 工程;
(2)方法一:在H文件中要导出的函数前加上 extern "C" _decspec(dllexport),编译链接即可在Debug文件夹下产生dll文件和lib文件。
(3)方法二:函数前不加 extern "C" _decspec(dllexport),在工程中新建一个“工程名.DEF”的文件,输入:
LIBRARY 工程名
DESCRIPTION "简要介绍,此行可以省略"
EXPORTS //重要,不可省略
函数名1 @序号1 //@序号1 可以省略
...
函数名n @序号n
2.扩展MFC动态链接库的生成(创建时类型选择第三个--MFC Extension DLL(using shared MFC DLL))
(1)导出普通函数:在H文件的函数声明前加上 “extern "C" AFX_EXT_API”即可(AFX_EXT_API表示_decspec(dllexport)或_decspec(dllimport),也可按第二种方法导出,在DEF文件中添加函数列表);
(2)导出类:在H文件的类声明第一行改为“class AFX_EXT_CLASS 类名”即可;
(3)资源导出:创建或导入资源过程与平时一样,只要最后将所创建资源ID号的定义代码(如“#define IDR_MENU_TEST 1000 ”)拷贝到H文件中即可;
(4)完成上述操作,点击Build,则在Debug文件夹中生成dll文件和lib文件,注意保留H文件。
3.普通MFC动态链接库的生成(创建时类型选择第一个和第二个--Regular DLL ...)
(1)只能用第二种方法导出函数,资源的导出与上面一样,不能导出MFC库类,但可以在内部使用任何MFC类和C++类。
(2)此方法导出的链接库可被其他 Win32 编程环境使用。
(3)两种Regular DLL类型开发步骤一样,只是生成的代码不一样,静态的将MFC库函数全都加载到 .dll文件中,而动态的(第二个)则只在.dll文件中提供一个入口地址。
------------------------------------------------------------------------------------
No.9 /*使用动态链接库*/
1.函数与类的导入使用(隐式链接)
(1)包含原链接库文件对应的H文件;
(2)将dll文件和相应lib文件复制到工程文件夹下;
(3)在【Project】->【Settings】->【Link】选项卡中,【Object/Library modules】框中填入lib文件的文件名和后缀名;
(4)若原H文件中有_decspec(dllexport),则改为_decspec(dllimport);
则动态链接库中的类和函数均可正常使用。
2.函数的导入使用(显式链接)
(1)进行上面的步骤(1)(2);
(2)定义函数指针类型:typedef (*PFUNC) (形参列表);
(3)载入DLL库:HINSTANCE hdll=LoadLibrary("*.dll");
(4)获取函数指针:PFUNC pFunc=(PFUNC)GetProcAddress(hdll,"函数名");
(5)调用函数后,释放DLL:FreeLibrary(hdll);
3.资源的导入使用(显式链接,以菜单导入为例)
(1)进行1中的步骤(1)(2);
(2)载入DLL库:HINSTANCE hdll=LoadLibrary("*.dll");
(3)菜单加载与绘制:
HMENU hmenu=LoadMenu(hdll,MAKEINTRESOURCE(资源ID));
::SetMenu(this->GetSafeHwnd(),hmenu);
::DrawMenuBar(this->GetSafeHwnd());
//以上两行中this指针为对话框类指针
(4)释放DLL:FreeLibrary(hdll);
(5)对于从动态链接库中导入的资源,MFC建立类向导无法自动生成消息响应函数,必须自己手动添加,共三处:消息响应类H文件中添加消息响应函数声明(前面要加afx_msg);消息响应类CPP文件中添加消息响应函数实现部分;消息响应类CPP文件中添加消息响应的命令映射,如在BEGIN_MESSAGE_MAP(CMyDialog,CDialog)和END_MESSAGE_MAP()之间添加ON_COMMAND(菜单ID,响应函数名)。
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.2
------------------------------------------------------------------------------------
No.10 /*资源符号ID前缀命名规则*/
'类型' '前缀'
位图 IDB_
光标 IDC_
图标 IDI_
菜单/加速键 IDR_
串表 IDS_
对话框 IDD_
消息框 IDP_
控件 IDC_
命令 ID_
------------------------------------------------------------------------------------
No.11 /*匈牙利命名法前缀命名规则*/
'数据类型' '前缀' '示例'
Boolean b bool bIsUpper;BOOL bGetEnd;
char c char cLetter;
string str string strName;CString strMajor;
char* sz char* szAppName="WinApp"; //含所有以'\0'结束的字符串
int n,i int nCount,iNumber;
short int si short siNumberOfStudent;
long int l long lID_card;
float f float fArea;
double d double dArea;
long double ld long double ldRate;
句柄(HXXX) h HINSTANCE hInstance;
文件输入流 if ifstream ifDataInFile;
文件输出流 of ofstream ofDataOutFile;
结构体(Struct)S struct SAddress;
类(Class) C class CStudent;
无符号的 u unsigned int uCard;
静态的 s static int siInst;
类或结构体成员m_ CString m_strName;
指针/长指针 p/lp int* piHead;
坐标 x,y int x,y;
------------------------------------------------------------------------------------
No.12 /*用CCriticalSection和CSingleLock使线程同步*/
在 stdafx.h 里加上
#include <afxmt.h>
CCriticalSection cs;
int nCount=0;
CString mStr;
UINT ThreadProc(LPVOID lpParam)
{
LPSTR lpStr=(LPSTR)lpParam;
CSingleLock singlelock(&cs);
singlelock.Lock();
::MessageBox(NULL,"Thread has access to the criticalsection",lpStr,MB_ICONINFORMATION);
return 0;
}
CFileFind ff;
CString dir("D:\\MyDir\\*.txt");
BOOL bfile=ff.FindFile(dir);
2.循环调用ff.FindNextFile函数进行搜索:
while(bfile)
{
bfile=ff.FindNextFile();
if(!(ff.IsDots())&&!(ff.IsDirectory()))
{...};
};
3.搜索结果有三种:
(1)Dots: "."表示本层目录,".."表示上一层目录,此时ff.IsDots()返回值为TRUE;
(2)Directory: 子目录,此时ff.IsDirectory()返回值为TRUE;
(3)文件
4.对每个查找到的文件可以查看文件信息:
(1)BOOL GetCreationTime(CTime &); 或BOOL GetCreationTime(FILETIME*);
BOOL GetLastAccessTime(CTime &); 或BOOL GetLastAccessTime(FILETIME*);
BOOL GetLastWriteTime(CTime &); 或BOOL GetLastWriteTime(FILETIME*);
(2)CString GetFileName(); //文件名.后缀名
(3)CString GetFilePath(); //全路径+文件名.后缀名
(4)CString GetFileTitle(); //只有文件名
(5)CString GetRoot();
(6)DWORD GetLength(); 或__int64 GetLength64();
(7)BOOL IsHidden();
BOOL IsNormal();
BOOL IsReadOnly();
BOOL IsSystem();
BOOL IsTemporary();
------------------------------------------------------------------------------------
No.6 /*文件处理之一般处理*/
1.进入文件夹(设置工作文件夹):
chdir(LPTSTR path);
SetCurrentDirectory(LPCTSTR lpPathName);
2.文件删除:
BOOL DeleteFile(LPTSTR lpFileName);
3.文件复制:
BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists);其中参数bFailIfExists告诉系统当目标文件存在时如何操作,当bFailIfExists为true时,如果目标文件存在,则函数执行失败;当bFailIfExists为false时,如果目标文件存在,则覆盖目标文件。
4.文件重命名:
BOOL RenameFile(const AnsiString OldName, const AnsiString NewName);
5.返回文件的完整的路径名和文件名:
AnsiString ExpandFileName(AnsiString FileName);
6.返回指定文件的文件名:
AnsiString ExtractFileName(AnsiString FileName);
7.返回指定文件的扩展名:
AnsiString ExtractFileExt(AnsiString FileName);
8.创建新文件夹:
BOOL CreateDirectory( LPCTSTR lpPathName,LPSECURITY_ATTRIBUTES lpSecurityAttributes);lpSecurityAttributes为安全属性。
9.移动存在的文件或目录:
BOOL MoveFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName);
10.创建文件(即打开文件):
CreateFile(...);
11.关闭文件:
CloseHandle();
------------------------------------------------------------------------------------
No.7 /*获取用户名和计算机名:*/
GetUserName(LPTSTR lpName,LPDWORD lpSize);
GetComputerName(LPTSTR lpName,LPDWORD lpSize);
lpSize表示字符串长度的最大值。
/*获取程序的全路径名*/
DWORD WINAPI GetModuleFileName(HMODULE hModule,LPSTR lpFilename,DWORD nSize);
获得自己的全路径名时第一个参数用NULL,路径名保存在lpFilename中。
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.1
------------------------------------------------------------------------------------
No.8 /*动态链接库(dll文件)的生成*/
1.非MFC动态链接库生成
(1)创建 Win32 Dynamic-Link Library 工程;
(2)方法一:在H文件中要导出的函数前加上 extern "C" _decspec(dllexport),编译链接即可在Debug文件夹下产生dll文件和lib文件。
(3)方法二:函数前不加 extern "C" _decspec(dllexport),在工程中新建一个“工程名.DEF”的文件,输入:
LIBRARY 工程名
DESCRIPTION "简要介绍,此行可以省略"
EXPORTS //重要,不可省略
函数名1 @序号1 //@序号1 可以省略
...
函数名n @序号n
2.扩展MFC动态链接库的生成(创建时类型选择第三个--MFC Extension DLL(using shared MFC DLL))
(1)导出普通函数:在H文件的函数声明前加上 “extern "C" AFX_EXT_API”即可(AFX_EXT_API表示_decspec(dllexport)或_decspec(dllimport),也可按第二种方法导出,在DEF文件中添加函数列表);
(2)导出类:在H文件的类声明第一行改为“class AFX_EXT_CLASS 类名”即可;
(3)资源导出:创建或导入资源过程与平时一样,只要最后将所创建资源ID号的定义代码(如“#define IDR_MENU_TEST 1000 ”)拷贝到H文件中即可;
(4)完成上述操作,点击Build,则在Debug文件夹中生成dll文件和lib文件,注意保留H文件。
3.普通MFC动态链接库的生成(创建时类型选择第一个和第二个--Regular DLL ...)
(1)只能用第二种方法导出函数,资源的导出与上面一样,不能导出MFC库类,但可以在内部使用任何MFC类和C++类。
(2)此方法导出的链接库可被其他 Win32 编程环境使用。
(3)两种Regular DLL类型开发步骤一样,只是生成的代码不一样,静态的将MFC库函数全都加载到 .dll文件中,而动态的(第二个)则只在.dll文件中提供一个入口地址。
------------------------------------------------------------------------------------
No.9 /*使用动态链接库*/
1.函数与类的导入使用(隐式链接)
(1)包含原链接库文件对应的H文件;
(2)将dll文件和相应lib文件复制到工程文件夹下;
(3)在【Project】->【Settings】->【Link】选项卡中,【Object/Library modules】框中填入lib文件的文件名和后缀名;
(4)若原H文件中有_decspec(dllexport),则改为_decspec(dllimport);
则动态链接库中的类和函数均可正常使用。
2.函数的导入使用(显式链接)
(1)进行上面的步骤(1)(2);
(2)定义函数指针类型:typedef (*PFUNC) (形参列表);
(3)载入DLL库:HINSTANCE hdll=LoadLibrary("*.dll");
(4)获取函数指针:PFUNC pFunc=(PFUNC)GetProcAddress(hdll,"函数名");
(5)调用函数后,释放DLL:FreeLibrary(hdll);
3.资源的导入使用(显式链接,以菜单导入为例)
(1)进行1中的步骤(1)(2);
(2)载入DLL库:HINSTANCE hdll=LoadLibrary("*.dll");
(3)菜单加载与绘制:
HMENU hmenu=LoadMenu(hdll,MAKEINTRESOURCE(资源ID));
::SetMenu(this->GetSafeHwnd(),hmenu);
::DrawMenuBar(this->GetSafeHwnd());
//以上两行中this指针为对话框类指针
(4)释放DLL:FreeLibrary(hdll);
(5)对于从动态链接库中导入的资源,MFC建立类向导无法自动生成消息响应函数,必须自己手动添加,共三处:消息响应类H文件中添加消息响应函数声明(前面要加afx_msg);消息响应类CPP文件中添加消息响应函数实现部分;消息响应类CPP文件中添加消息响应的命令映射,如在BEGIN_MESSAGE_MAP(CMyDialog,CDialog)和END_MESSAGE_MAP()之间添加ON_COMMAND(菜单ID,响应函数名)。
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.2
------------------------------------------------------------------------------------
No.10 /*资源符号ID前缀命名规则*/
'类型' '前缀'
位图 IDB_
光标 IDC_
图标 IDI_
菜单/加速键 IDR_
串表 IDS_
对话框 IDD_
消息框 IDP_
控件 IDC_
命令 ID_
------------------------------------------------------------------------------------
No.11 /*匈牙利命名法前缀命名规则*/
'数据类型' '前缀' '示例'
Boolean b bool bIsUpper;BOOL bGetEnd;
char c char cLetter;
string str string strName;CString strMajor;
char* sz char* szAppName="WinApp"; //含所有以'\0'结束的字符串
int n,i int nCount,iNumber;
short int si short siNumberOfStudent;
long int l long lID_card;
float f float fArea;
double d double dArea;
long double ld long double ldRate;
句柄(HXXX) h HINSTANCE hInstance;
文件输入流 if ifstream ifDataInFile;
文件输出流 of ofstream ofDataOutFile;
结构体(Struct)S struct SAddress;
类(Class) C class CStudent;
无符号的 u unsigned int uCard;
静态的 s static int siInst;
类或结构体成员m_ CString m_strName;
指针/长指针 p/lp int* piHead;
坐标 x,y int x,y;
------------------------------------------------------------------------------------
No.12 /*用CCriticalSection和CSingleLock使线程同步*/
在 stdafx.h 里加上
#include <afxmt.h>
CCriticalSection cs;
int nCount=0;
CString mStr;
UINT ThreadProc(LPVOID lpParam)
{
LPSTR lpStr=(LPSTR)lpParam;
CSingleLock singlelock(&cs);
singlelock.Lock();
::MessageBox(NULL,"Thread has access to the criticalsection",lpStr,MB_ICONINFORMATION);
return 0;
}
void CUseThread3Dlg::OnThread()
{
mStr.Format(_T("Thread%d"),nCount++);
AfxBeginThread(ThreadProc,(LPSTR)LPCTSTR(mStr));
}
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.10
------------------------------------------------------------------------------------
No.13 /*多线程编程*/
1.定义传递给线程的变量的结构体类型//在调用线程的类的H文件中
struct threadInfo
{
};
注意:在线程中要改变的变量要传指针或引用,就如函数变量传递。
2.定义传递给线程的变量的结构体变量和线程函数//在调用线程的类的CPP文件中
threadInfo Info; //如果只有一个变量,则不用定义结构体,直接传指针
UINT ThreadProc(LPVOID lpParam)
{
threadInfo* pInfo=(threadInfo*)lpParam;
...
return 0;
}
3.初始化并启动线程//在调用处
先给结构体变量各成员赋初值;
在H文件中定义:CWinThread* m_pThread;//非必要
在调用处:m_pThread=AfxBeginThread(ThreadProc,&Info);
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.11
------------------------------------------------------------------------------------
No.14 /*声音文件播放*/
1.导入声音头文件和文件库
在要播放声音文件的类的CPP文件中加入:
#include "mmsystem.h"//导入声音头文件
#pragma comment(lib,"winmm.lib")//导入声音头文件库
2.使用sndPlaySound函数播放声音:
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);
只能播放文件:
sndPlaySound("MYSOUND.WAV",SND_ASYNC);
3.使用PlaySound函数播放:
BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);
(1)播放指定路径的文件:
PlaySound("c:\\win95\\media\\The Microsoft Sound.wav",NULL,SND_FILENAME|SND_ASYNC);
(2)播放导入的声音资源:
PlaySound((LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);
PlaySound(MAKEINTRESOURCE(IDR_WAVE2),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
(3)播放系统声音:
PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);
4.播放标志以及含义:
SND_APPLICATION 用应用程序指定的关联来播放声音。
SND_ALIAS pszSound参数指定了注册表或WIN.INI中的系统事件的别名。
SND_ALIAS_ID pszSound参数指定了预定义的声音标识符。
SND_ASYNC 用异步方式播放声音,PlaySound函数在开始播放后立即返回。
SND_FILENAME pszSound参数指定了WAVE文件名。
SND_LOOP 重复播放声音,必须与SND_ASYNC标志一块使用。
SND_MEMORY 播放载入到内存中的声音,此时pszSound是指向声音数据的指针。
SND_NODEFAULT 不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。
SND_NOSTOP PlaySound不打断原来的声音播出并立即返回FALSE。
SND_NOWAIT 如果驱动程序正忙则函数就不播放声音并立即返回。
SND_PURGE 停止所有与调用任务有关的声音。
若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。
SND_RESOURCE pszSound参数是WAVE资源的标识符,这时要用到hmod参数。
SND_SYNC 同步播放声音,在播放完后PlaySound函数才返回。
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.12
------------------------------------------------------------------------------------
No.15 /*CFile类*/
CFile的成员函数实现了对Win32文件操作函数的封装,完成以下动作:打开、创建、关闭文件,文件指针定位,文件的锁定与解锁,文件状态的读取和修改,等等。其中,用到了m_hFile文件句柄的一般是虚拟函数,和此无关的一般是静态成员函数。
1.文件访问和共享模式:
enum OpenFlags {
//第一(从右,下同)至第二位,打开文件时访问模式,读/写/读写
modeRead = 0x0000,
modeWrite = 0x0001,
modeReadWrite = 0x0002,
shareCompat = 0x0000, //32位MFC中没用
//第五到第七位,打开文件时的共享模式
shareExclusive = 0x0010,//独占方式,禁止其他进程读写
shareDenyWrite = 0x0020,//禁止其他进程写
shareDenyRead = 0x0030,//禁止其他进程读
shareDenyNone = 0x0040,//允许其他进程写
//第八位,打开文件时的文件继承方式
modeNoInherit = 0x0080,//不允许子进程继承
//第十三、十四位,是否创建新文件和创建方式
modeCreate = 0x1000,//创建新文件,文件长度0
modeNoTruncate = 0x2000,//创建新文件时如文件已存在则打开
//第十五、十六位,文件以二进制或者文本方式打开,在派生类CStdioFile中用
typeText = 0x4000,
typeBinary = (int)0x8000
};
2.文件属性:正常、只读、隐含、系统文件,文件或者目录
enum Attribute {
normal = 0x00,
readOnly = 0x01,
hidden = 0x02,
system = 0x04,
volume = 0x08,
directory = 0x10,
archive = 0x20
};
3.文件位置:头、尾、当前
enum SeekPosition{
begin = 0x0,
current = 0x1,
end = 0x2
};
4.空文件句柄:
enum { hFileNull = -1 };
5.变量成员:
'UINT m_hFile;'
该成员变量是public访问属性,保存了CreateFile返回的操作系统的文件句柄。
MFC重载了运算符号HFILE来返回m_hFile,这样在使用HFILE类型变量的地方可以使用CFile对象。
'BOOL m_bCloseOnDelete;'
'CString m_strFileName;'
这两个成员变量是protected访问属性。
m_bCloseOnDelete用来指示是否在关闭文件时删除CFile对象;m_strFileName用来保存文件名。
6.成员函数:
(1)构造函数:
①CFile();
//缺省构造函数,仅仅构造一个CFile对象,还必须使用Open成员函数来打开文件。
②CFile(int hFile);
//已经打开了一个文件hFile,在此基础上构造一个CFile对象来给它打包。 hFile将被赋值给CFile的成员变量m_hFile。
③CFile(LPCTSTR lpszFileName, UINT nOpenFlags);
//指定一个文件名和文件打开方式,构造CFile对象,调用Open打开/创建文件, 把文件句柄保存到m_hFile。
(2)打开/创建文件
④BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags,CFileException* pException);
//Open调用Win32函数::CreateFile打开文件,并把文件句柄保存到成员变量m_hFile中。
CreateFile函数的原型如下:
HANDLE CreateFile(
LPCTSTR lpFileName,// pointer to name of the file
DWORD dwDesiredAccess,// access (read-write) mode
DWORD dwShareMode,// share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //pointer to security descriptor
DWORD dwCreationDistribution,// how to create
DWORD dwFlagsAndAttributes,// file attributes
HANDLE hTemplateFile// handle to file with attributes to copy
);
------------------------------------------------------------------------------------
No.16 /*MFC中获取各种类指针*/
1、获取应用程序指针
CMyApp* pApp=(CMyApp*)AfxGetApp();
2、获取主框架指针
CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针。
CMainFrame* pMainFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd);
或者
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
3、获取菜单指针
CMenu* pMenu = AfxGetMainWnd()->GetMenu();
4、获取工具栏、状态栏指针
主框架中可以直接使用m_wndToolBar、m_wndStatusBar。
其他:
CToolBar* pToolBar = (CToolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
CStatusBar* pStatusBar = (CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
5、获取控件指针
先用 GetDlgItem() 再转换,如:
CButton* pButton = (CButton*)GetDlgItem(IDC_MYBUTTON);
6、获取文档、视图指针
SDI:
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
CYourDoc* pDoc = (CYourDoc*)pMainFrame->GetActiveDocument();
CYourView* pView = (CYourView*)pMainFrame->GetActiveView();
{
mStr.Format(_T("Thread%d"),nCount++);
AfxBeginThread(ThreadProc,(LPSTR)LPCTSTR(mStr));
}
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.10
------------------------------------------------------------------------------------
No.13 /*多线程编程*/
1.定义传递给线程的变量的结构体类型//在调用线程的类的H文件中
struct threadInfo
{
};
注意:在线程中要改变的变量要传指针或引用,就如函数变量传递。
2.定义传递给线程的变量的结构体变量和线程函数//在调用线程的类的CPP文件中
threadInfo Info; //如果只有一个变量,则不用定义结构体,直接传指针
UINT ThreadProc(LPVOID lpParam)
{
threadInfo* pInfo=(threadInfo*)lpParam;
...
return 0;
}
3.初始化并启动线程//在调用处
先给结构体变量各成员赋初值;
在H文件中定义:CWinThread* m_pThread;//非必要
在调用处:m_pThread=AfxBeginThread(ThreadProc,&Info);
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.11
------------------------------------------------------------------------------------
No.14 /*声音文件播放*/
1.导入声音头文件和文件库
在要播放声音文件的类的CPP文件中加入:
#include "mmsystem.h"//导入声音头文件
#pragma comment(lib,"winmm.lib")//导入声音头文件库
2.使用sndPlaySound函数播放声音:
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);
只能播放文件:
sndPlaySound("MYSOUND.WAV",SND_ASYNC);
3.使用PlaySound函数播放:
BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);
(1)播放指定路径的文件:
PlaySound("c:\\win95\\media\\The Microsoft Sound.wav",NULL,SND_FILENAME|SND_ASYNC);
(2)播放导入的声音资源:
PlaySound((LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);
PlaySound(MAKEINTRESOURCE(IDR_WAVE2),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
(3)播放系统声音:
PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);
4.播放标志以及含义:
SND_APPLICATION 用应用程序指定的关联来播放声音。
SND_ALIAS pszSound参数指定了注册表或WIN.INI中的系统事件的别名。
SND_ALIAS_ID pszSound参数指定了预定义的声音标识符。
SND_ASYNC 用异步方式播放声音,PlaySound函数在开始播放后立即返回。
SND_FILENAME pszSound参数指定了WAVE文件名。
SND_LOOP 重复播放声音,必须与SND_ASYNC标志一块使用。
SND_MEMORY 播放载入到内存中的声音,此时pszSound是指向声音数据的指针。
SND_NODEFAULT 不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。
SND_NOSTOP PlaySound不打断原来的声音播出并立即返回FALSE。
SND_NOWAIT 如果驱动程序正忙则函数就不播放声音并立即返回。
SND_PURGE 停止所有与调用任务有关的声音。
若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。
SND_RESOURCE pszSound参数是WAVE资源的标识符,这时要用到hmod参数。
SND_SYNC 同步播放声音,在播放完后PlaySound函数才返回。
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.12
------------------------------------------------------------------------------------
No.15 /*CFile类*/
CFile的成员函数实现了对Win32文件操作函数的封装,完成以下动作:打开、创建、关闭文件,文件指针定位,文件的锁定与解锁,文件状态的读取和修改,等等。其中,用到了m_hFile文件句柄的一般是虚拟函数,和此无关的一般是静态成员函数。
1.文件访问和共享模式:
enum OpenFlags {
//第一(从右,下同)至第二位,打开文件时访问模式,读/写/读写
modeRead = 0x0000,
modeWrite = 0x0001,
modeReadWrite = 0x0002,
shareCompat = 0x0000, //32位MFC中没用
//第五到第七位,打开文件时的共享模式
shareExclusive = 0x0010,//独占方式,禁止其他进程读写
shareDenyWrite = 0x0020,//禁止其他进程写
shareDenyRead = 0x0030,//禁止其他进程读
shareDenyNone = 0x0040,//允许其他进程写
//第八位,打开文件时的文件继承方式
modeNoInherit = 0x0080,//不允许子进程继承
//第十三、十四位,是否创建新文件和创建方式
modeCreate = 0x1000,//创建新文件,文件长度0
modeNoTruncate = 0x2000,//创建新文件时如文件已存在则打开
//第十五、十六位,文件以二进制或者文本方式打开,在派生类CStdioFile中用
typeText = 0x4000,
typeBinary = (int)0x8000
};
2.文件属性:正常、只读、隐含、系统文件,文件或者目录
enum Attribute {
normal = 0x00,
readOnly = 0x01,
hidden = 0x02,
system = 0x04,
volume = 0x08,
directory = 0x10,
archive = 0x20
};
3.文件位置:头、尾、当前
enum SeekPosition{
begin = 0x0,
current = 0x1,
end = 0x2
};
4.空文件句柄:
enum { hFileNull = -1 };
5.变量成员:
'UINT m_hFile;'
该成员变量是public访问属性,保存了CreateFile返回的操作系统的文件句柄。
MFC重载了运算符号HFILE来返回m_hFile,这样在使用HFILE类型变量的地方可以使用CFile对象。
'BOOL m_bCloseOnDelete;'
'CString m_strFileName;'
这两个成员变量是protected访问属性。
m_bCloseOnDelete用来指示是否在关闭文件时删除CFile对象;m_strFileName用来保存文件名。
6.成员函数:
(1)构造函数:
①CFile();
//缺省构造函数,仅仅构造一个CFile对象,还必须使用Open成员函数来打开文件。
②CFile(int hFile);
//已经打开了一个文件hFile,在此基础上构造一个CFile对象来给它打包。 hFile将被赋值给CFile的成员变量m_hFile。
③CFile(LPCTSTR lpszFileName, UINT nOpenFlags);
//指定一个文件名和文件打开方式,构造CFile对象,调用Open打开/创建文件, 把文件句柄保存到m_hFile。
(2)打开/创建文件
④BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags,CFileException* pException);
//Open调用Win32函数::CreateFile打开文件,并把文件句柄保存到成员变量m_hFile中。
CreateFile函数的原型如下:
HANDLE CreateFile(
LPCTSTR lpFileName,// pointer to name of the file
DWORD dwDesiredAccess,// access (read-write) mode
DWORD dwShareMode,// share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //pointer to security descriptor
DWORD dwCreationDistribution,// how to create
DWORD dwFlagsAndAttributes,// file attributes
HANDLE hTemplateFile// handle to file with attributes to copy
);
------------------------------------------------------------------------------------
No.16 /*MFC中获取各种类指针*/
1、获取应用程序指针
CMyApp* pApp=(CMyApp*)AfxGetApp();
2、获取主框架指针
CWinApp 中的公有成员变量 m_pMainWnd 就是主框架的指针。
CMainFrame* pMainFrame = (CMainFrame*)(AfxGetApp()->m_pMainWnd);
或者
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
3、获取菜单指针
CMenu* pMenu = AfxGetMainWnd()->GetMenu();
4、获取工具栏、状态栏指针
主框架中可以直接使用m_wndToolBar、m_wndStatusBar。
其他:
CToolBar* pToolBar = (CToolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
CStatusBar* pStatusBar = (CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
5、获取控件指针
先用 GetDlgItem() 再转换,如:
CButton* pButton = (CButton*)GetDlgItem(IDC_MYBUTTON);
6、获取文档、视图指针
SDI:
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
CYourDoc* pDoc = (CYourDoc*)pMainFrame->GetActiveDocument();
CYourView* pView = (CYourView*)pMainFrame->GetActiveView();
MDI:
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
CChildFrame* pChildFrame = (CChildFrame*)pMainFrame->GetActiveFrame();
CYourDoc* pDoc = (CYourDoc*)pChildFrame->GetActiveDocument();
CYourView* pView = (CYourView*)pChildFrame->GetActiveView();
7、文档、视图
从视图获取文档指针:
CYourDoc* pDoc = GetDocument();
从文档获取视图指针:
利用成员函数 GetFirstViewPosition() 和 GetNextView() 遍历。
virtual POSITION GetFirstViewPosition() const;
virtual CView* GetNextView(POSITION& rPosition) const;
SDI:
CYourView* pView;
POSITION pos = GetFirstViewPosition();
pView = GetNextView(pos);
CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
CChildFrame* pChildFrame = (CChildFrame*)pMainFrame->GetActiveFrame();
CYourDoc* pDoc = (CYourDoc*)pChildFrame->GetActiveDocument();
CYourView* pView = (CYourView*)pChildFrame->GetActiveView();
7、文档、视图
从视图获取文档指针:
CYourDoc* pDoc = GetDocument();
从文档获取视图指针:
利用成员函数 GetFirstViewPosition() 和 GetNextView() 遍历。
virtual POSITION GetFirstViewPosition() const;
virtual CView* GetNextView(POSITION& rPosition) const;
SDI:
CYourView* pView;
POSITION pos = GetFirstViewPosition();
pView = GetNextView(pos);
MDI:
定义函数
CView* CYourDoc::GetView(CRuntimeClass* pClass)
{
CView* pView;
POSITION pos=GetFirstViewPosition();
while(pos!=NULL)
{
pView=GetNextView(pos);
if(!pView->IsKindOf(pClass))
break;
}
if(!pView->IsKindOf(pClass))
{
AfxMessageBox("Connt Locate the View.");
return NULL;
}
return pView;
}
使用如下:
CYourView* pView=(CYourView*)GetView(RUNTIME_CLASS(CYourView));
8、文档模版、文档
从文档获取文档模版指针:
CDocTemplate* GetDocTemplate() const;
从文档模版获取文档指针:
viaual POSITION GetFirstDocPosition( ) const = 0;
visual CDocument* GetNextDoc(POSITION & rPos) const = 0;
9、获取分割视图中各个视图的指针
主框架中定义:CSplitterWnd m_wndSplitter;
定义两个View类:CView1、CView2;
框架类中重载:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext)
{
VERIFY(m_splitter.CreateStatic(this,2,1)); //分割成两行一列
VERIFY(m_splitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(100,100),pContext));
VERIFY(m_splitter.CreateView(1,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext));
return TRUE;
}
获取分割视图指针
CView1* pView1 = (CView1*)m_wndSplitter.GetPane(0,0);
CView2* pView2 = (CView2*)m_wndSplitter.GetPane(1,0);
10、通过鼠标获得子窗口指针
CWnd* ChildWindowFromPoint(POINT point) const;
CWnd* ChildWindowFromPoint(POINT point,UINT nFlags) const;
用于确定包含指定点的子窗口
如果指定点在客户区之外,函数返回NULL;
如果指定点在客户区内,但是不属于任何一个子窗口,函数返回该CWnd的指针;
如果有多个子窗口包含指定点,则返回第一个子窗口的指针。
还要注意的是,该函数返回的是一个伪窗口指针,不能将它保存起来供以后使用。
对于第二个参数nFlags有几个含义:
CWP_ALL file://不忽略任何子窗口
CWP_SKIPNIVSIBLE file://忽略不可见子窗口
CWP_SKIPDISABLED file://忽略禁止的子窗口
CWP_SKIPRANSPARENT file://忽略透明子窗口
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.13
------------------------------------------------------------------------------------
No.17 /*在多文档界面下去掉开始的子窗口*/
在多文档界面下,自动生成一个新的子窗口,而一个实际的应用系统往往是由用户操作后再生成新的窗口。为了去掉开始的子窗口,可在应用程序文件分析命令行的语句
CcommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
后加入:
cmdInfo.m_nShellCommand=CcommandLineInfo::FileNothing;
去掉子窗口后,就只剩下主框架窗口了。因为在多文档界面中,系统生成两个菜单:一个是用户的菜单,另一个是系统主框架菜单。通常用户工作在用户菜单。为了保证菜单界面不变,可修改主框架菜单资源,使其与用户菜单保持一致。
------------------------------------------------------------------------------------
No.18 /*系统相关特殊功能*/
//隐藏WINDOWS系统任务栏
::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_HIDE);
//窗体总在总前面
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
//屏蔽掉系统键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);
//设置开机自启动键值
TCHAR strCurDirectory[255];
GetModuleFileName( NULL, strCurDirectory, 255 );//获取当前程序全路径名
CRegistry Reg;//CRegistry类不可用,要自己写,只是想说明过程
Reg.SetRootKey(HKEY_LOCAL_MACHINE);
Reg.SetKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);
Reg.WriteString ("FixYou",strCurDirectory);
//删除开机自启动键值
CRegistry Reg;//CRegistry类不可用,要自己写,只是想说明过程
Reg.SetRootKey(HKEY_LOCAL_MACHINE);
Reg.SetKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);
Reg.DeleteValue( "FixYou");
//隐藏/显示鼠标
ShowCursor(false/true);
//设置鼠标的移动范围
ClipCursor(CRect rect);//NULL表示取消鼠标锁定
//设置对话框背景和文本颜色
在App的
SetDialogBkColor(RGB(160,180,220),RGB(0,0,0));
//一次只运行一个程序实例,如果已运行则退出
在App类的InitInstance()函数中:
if( FindWindow(NULL,"App名字")) exit(0);
------------------------------------------------------------------------------------
No.19 /*获取系统可用磁盘*/
#include <Winbase.h>
DWORD dx=GetLogicalDrives();
获得的dx每一位表示一个盘符的有效性,从低位到高位依次为A~Z,1表示可用。
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.15
------------------------------------------------------------------------------------
No.20 /*键盘键值(标准集)*/
#include <winuser.h>
//Virtual Keys, Standard Set
#define VK_LBUTTON 0x01
#define VK_RBUTTON 0x02
#define VK_CANCEL 0x03
#define VK_MBUTTON 0x04 // NOT contiguous with L & RBUTTON
定义函数
CView* CYourDoc::GetView(CRuntimeClass* pClass)
{
CView* pView;
POSITION pos=GetFirstViewPosition();
while(pos!=NULL)
{
pView=GetNextView(pos);
if(!pView->IsKindOf(pClass))
break;
}
if(!pView->IsKindOf(pClass))
{
AfxMessageBox("Connt Locate the View.");
return NULL;
}
return pView;
}
使用如下:
CYourView* pView=(CYourView*)GetView(RUNTIME_CLASS(CYourView));
8、文档模版、文档
从文档获取文档模版指针:
CDocTemplate* GetDocTemplate() const;
从文档模版获取文档指针:
viaual POSITION GetFirstDocPosition( ) const = 0;
visual CDocument* GetNextDoc(POSITION & rPos) const = 0;
9、获取分割视图中各个视图的指针
主框架中定义:CSplitterWnd m_wndSplitter;
定义两个View类:CView1、CView2;
框架类中重载:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT, CCreateContext* pContext)
{
VERIFY(m_splitter.CreateStatic(this,2,1)); //分割成两行一列
VERIFY(m_splitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(100,100),pContext));
VERIFY(m_splitter.CreateView(1,0,RUNTIME_CLASS(CView2),CSize(100,100),pContext));
return TRUE;
}
获取分割视图指针
CView1* pView1 = (CView1*)m_wndSplitter.GetPane(0,0);
CView2* pView2 = (CView2*)m_wndSplitter.GetPane(1,0);
10、通过鼠标获得子窗口指针
CWnd* ChildWindowFromPoint(POINT point) const;
CWnd* ChildWindowFromPoint(POINT point,UINT nFlags) const;
用于确定包含指定点的子窗口
如果指定点在客户区之外,函数返回NULL;
如果指定点在客户区内,但是不属于任何一个子窗口,函数返回该CWnd的指针;
如果有多个子窗口包含指定点,则返回第一个子窗口的指针。
还要注意的是,该函数返回的是一个伪窗口指针,不能将它保存起来供以后使用。
对于第二个参数nFlags有几个含义:
CWP_ALL file://不忽略任何子窗口
CWP_SKIPNIVSIBLE file://忽略不可见子窗口
CWP_SKIPDISABLED file://忽略禁止的子窗口
CWP_SKIPRANSPARENT file://忽略透明子窗口
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.13
------------------------------------------------------------------------------------
No.17 /*在多文档界面下去掉开始的子窗口*/
在多文档界面下,自动生成一个新的子窗口,而一个实际的应用系统往往是由用户操作后再生成新的窗口。为了去掉开始的子窗口,可在应用程序文件分析命令行的语句
CcommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
后加入:
cmdInfo.m_nShellCommand=CcommandLineInfo::FileNothing;
去掉子窗口后,就只剩下主框架窗口了。因为在多文档界面中,系统生成两个菜单:一个是用户的菜单,另一个是系统主框架菜单。通常用户工作在用户菜单。为了保证菜单界面不变,可修改主框架菜单资源,使其与用户菜单保持一致。
------------------------------------------------------------------------------------
No.18 /*系统相关特殊功能*/
//隐藏WINDOWS系统任务栏
::ShowWindow (::FindWindow("Shell_TrayWnd",NULL),SW_HIDE);
//窗体总在总前面
SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
//屏蔽掉系统键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);
//设置开机自启动键值
TCHAR strCurDirectory[255];
GetModuleFileName( NULL, strCurDirectory, 255 );//获取当前程序全路径名
CRegistry Reg;//CRegistry类不可用,要自己写,只是想说明过程
Reg.SetRootKey(HKEY_LOCAL_MACHINE);
Reg.SetKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);
Reg.WriteString ("FixYou",strCurDirectory);
//删除开机自启动键值
CRegistry Reg;//CRegistry类不可用,要自己写,只是想说明过程
Reg.SetRootKey(HKEY_LOCAL_MACHINE);
Reg.SetKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true);
Reg.DeleteValue( "FixYou");
//隐藏/显示鼠标
ShowCursor(false/true);
//设置鼠标的移动范围
ClipCursor(CRect rect);//NULL表示取消鼠标锁定
//设置对话框背景和文本颜色
在App的
SetDialogBkColor(RGB(160,180,220),RGB(0,0,0));
//一次只运行一个程序实例,如果已运行则退出
在App类的InitInstance()函数中:
if( FindWindow(NULL,"App名字")) exit(0);
------------------------------------------------------------------------------------
No.19 /*获取系统可用磁盘*/
#include <Winbase.h>
DWORD dx=GetLogicalDrives();
获得的dx每一位表示一个盘符的有效性,从低位到高位依次为A~Z,1表示可用。
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.15
------------------------------------------------------------------------------------
No.20 /*键盘键值(标准集)*/
#include <winuser.h>
//Virtual Keys, Standard Set
#define VK_LBUTTON 0x01
#define VK_RBUTTON 0x02
#define VK_CANCEL 0x03
#define VK_MBUTTON 0x04 // NOT contiguous with L & RBUTTON
#define VK_BACK 0x08
#define VK_TAB 0x09
#define VK_TAB 0x09
#define VK_CLEAR 0x0C
#define VK_RETURN 0x0D
#define VK_RETURN 0x0D
#define VK_SHIFT 0x10
#define VK_CONTROL 0x11
#define VK_MENU 0x12
#define VK_PAUSE 0x13
#define VK_CAPITAL 0x14
#define VK_CONTROL 0x11
#define VK_MENU 0x12
#define VK_PAUSE 0x13
#define VK_CAPITAL 0x14
#define VK_KANA 0x15
#define VK_HANGEUL 0x15 // old name - should be here for compatibility
#define VK_HANGUL 0x15
#define VK_JUNJA 0x17
#define VK_FINAL 0x18
#define VK_HANJA 0x19
#define VK_KANJI 0x19
#define VK_HANGEUL 0x15 // old name - should be here for compatibility
#define VK_HANGUL 0x15
#define VK_JUNJA 0x17
#define VK_FINAL 0x18
#define VK_HANJA 0x19
#define VK_KANJI 0x19
#define VK_ESCAPE 0x1B
#define VK_CONVERT 0x1C
#define VK_NONCONVERT 0x1D
#define VK_ACCEPT 0x1E
#define VK_MODECHANGE 0x1F
#define VK_NONCONVERT 0x1D
#define VK_ACCEPT 0x1E
#define VK_MODECHANGE 0x1F
#define VK_SPACE 0x20
#define VK_PRIOR 0x21
#define VK_NEXT 0x22
#define VK_END 0x23
#define VK_HOME 0x24
#define VK_LEFT 0x25
#define VK_UP 0x26
#define VK_RIGHT 0x27
#define VK_DOWN 0x28
#define VK_SELECT 0x29
#define VK_PRINT 0x2A
#define VK_EXECUTE 0x2B
#define VK_SNAPSHOT 0x2C
#define VK_INSERT 0x2D
#define VK_DELETE 0x2E
#define VK_HELP 0x2F
#define VK_PRIOR 0x21
#define VK_NEXT 0x22
#define VK_END 0x23
#define VK_HOME 0x24
#define VK_LEFT 0x25
#define VK_UP 0x26
#define VK_RIGHT 0x27
#define VK_DOWN 0x28
#define VK_SELECT 0x29
#define VK_PRINT 0x2A
#define VK_EXECUTE 0x2B
#define VK_SNAPSHOT 0x2C
#define VK_INSERT 0x2D
#define VK_DELETE 0x2E
#define VK_HELP 0x2F
// VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39)
// VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A)
#define VK_LWIN 0x5B
#define VK_RWIN 0x5C
#define VK_APPS 0x5D
#define VK_RWIN 0x5C
#define VK_APPS 0x5D
#define VK_NUMPAD0 0x60
#define VK_NUMPAD1 0x61
#define VK_NUMPAD2 0x62
#define VK_NUMPAD3 0x63
#define VK_NUMPAD4 0x64
#define VK_NUMPAD5 0x65
#define VK_NUMPAD6 0x66
#define VK_NUMPAD7 0x67
#define VK_NUMPAD8 0x68
#define VK_NUMPAD9 0x69
#define VK_MULTIPLY 0x6A
#define VK_ADD 0x6B
#define VK_SEPARATOR 0x6C
#define VK_SUBTRACT 0x6D
#define VK_DECIMAL 0x6E
#define VK_DIVIDE 0x6F
#define VK_F1 0x70
#define VK_F2 0x71
#define VK_F3 0x72
#define VK_F4 0x73
#define VK_F5 0x74
#define VK_F6 0x75
#define VK_F7 0x76
#define VK_F8 0x77
#define VK_F9 0x78
#define VK_F10 0x79
#define VK_F11 0x7A
#define VK_F12 0x7B
#define VK_F13 0x7C
#define VK_F14 0x7D
#define VK_F15 0x7E
#define VK_F16 0x7F
#define VK_F17 0x80
#define VK_F18 0x81
#define VK_F19 0x82
#define VK_F20 0x83
#define VK_F21 0x84
#define VK_F22 0x85
#define VK_F23 0x86
#define VK_F24 0x87
#define VK_NUMPAD1 0x61
#define VK_NUMPAD2 0x62
#define VK_NUMPAD3 0x63
#define VK_NUMPAD4 0x64
#define VK_NUMPAD5 0x65
#define VK_NUMPAD6 0x66
#define VK_NUMPAD7 0x67
#define VK_NUMPAD8 0x68
#define VK_NUMPAD9 0x69
#define VK_MULTIPLY 0x6A
#define VK_ADD 0x6B
#define VK_SEPARATOR 0x6C
#define VK_SUBTRACT 0x6D
#define VK_DECIMAL 0x6E
#define VK_DIVIDE 0x6F
#define VK_F1 0x70
#define VK_F2 0x71
#define VK_F3 0x72
#define VK_F4 0x73
#define VK_F5 0x74
#define VK_F6 0x75
#define VK_F7 0x76
#define VK_F8 0x77
#define VK_F9 0x78
#define VK_F10 0x79
#define VK_F11 0x7A
#define VK_F12 0x7B
#define VK_F13 0x7C
#define VK_F14 0x7D
#define VK_F15 0x7E
#define VK_F16 0x7F
#define VK_F17 0x80
#define VK_F18 0x81
#define VK_F19 0x82
#define VK_F20 0x83
#define VK_F21 0x84
#define VK_F22 0x85
#define VK_F23 0x86
#define VK_F24 0x87
#define VK_NUMLOCK 0x90
#define VK_SCROLL 0x91
#define VK_SCROLL 0x91
// VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
// Used only as parameters to GetAsyncKeyState() and GetKeyState().
// No other API or message will distinguish left and right keys in this way.
#define VK_LSHIFT 0xA0
#define VK_RSHIFT 0xA1
#define VK_LCONTROL 0xA2
#define VK_RCONTROL 0xA3
#define VK_LMENU 0xA4
#define VK_RMENU 0xA5
// Used only as parameters to GetAsyncKeyState() and GetKeyState().
// No other API or message will distinguish left and right keys in this way.
#define VK_LSHIFT 0xA0
#define VK_RSHIFT 0xA1
#define VK_LCONTROL 0xA2
#define VK_RCONTROL 0xA3
#define VK_LMENU 0xA4
#define VK_RMENU 0xA5
#if(WINVER >= 0x0400)
#define VK_PROCESSKEY 0xE5
#endif
#define VK_PROCESSKEY 0xE5
#endif
#define VK_ATTN 0xF6
#define VK_CRSEL 0xF7
#define VK_EXSEL 0xF8
#define VK_EREOF 0xF9
#define VK_PLAY 0xFA
#define VK_ZOOM 0xFB
#define VK_NONAME 0xFC
#define VK_PA1 0xFD
#define VK_OEM_CLEAR 0xFE
------------------------------------------------------------------------------------
No.20 /*系统消息*/
#include <winuser.h>
#ifndef NOSYSCOMMANDS
// begin_r_winuser
//System Menu Command Values
#define SC_SIZE 0xF000
#define SC_MOVE 0xF010 //移动,只有右击标题栏单击移动会激活
#define SC_MINIMIZE 0xF020 //最小化
#define SC_MAXIMIZE 0xF030 //最大化
#define SC_NEXTWINDOW 0xF040
#define SC_PREVWINDOW 0xF050
#define SC_CLOSE 0xF060 //关闭窗体
#define SC_VSCROLL 0xF070
#define SC_HSCROLL 0xF080
#define SC_MOUSEMENU 0xF090
#define SC_KEYMENU 0xF100
#define SC_ARRANGE 0xF110
#define SC_RESTORE 0xF120 //窗口恢复,从工具栏恢复
#define SC_TASKLIST 0xF130
#define SC_SCREENSAVE 0xF140
#define SC_HOTKEY 0xF150
#if(WINVER >= 0x0400)
#define SC_DEFAULT 0xF160
#define SC_MONITORPOWER 0xF170
#define SC_CONTEXTHELP 0xF180
#define SC_SEPARATOR 0xF00F
#endif //WINVER >= 0x0400
#define VK_CRSEL 0xF7
#define VK_EXSEL 0xF8
#define VK_EREOF 0xF9
#define VK_PLAY 0xFA
#define VK_ZOOM 0xFB
#define VK_NONAME 0xFC
#define VK_PA1 0xFD
#define VK_OEM_CLEAR 0xFE
------------------------------------------------------------------------------------
No.20 /*系统消息*/
#include <winuser.h>
#ifndef NOSYSCOMMANDS
// begin_r_winuser
//System Menu Command Values
#define SC_SIZE 0xF000
#define SC_MOVE 0xF010 //移动,只有右击标题栏单击移动会激活
#define SC_MINIMIZE 0xF020 //最小化
#define SC_MAXIMIZE 0xF030 //最大化
#define SC_NEXTWINDOW 0xF040
#define SC_PREVWINDOW 0xF050
#define SC_CLOSE 0xF060 //关闭窗体
#define SC_VSCROLL 0xF070
#define SC_HSCROLL 0xF080
#define SC_MOUSEMENU 0xF090
#define SC_KEYMENU 0xF100
#define SC_ARRANGE 0xF110
#define SC_RESTORE 0xF120 //窗口恢复,从工具栏恢复
#define SC_TASKLIST 0xF130
#define SC_SCREENSAVE 0xF140
#define SC_HOTKEY 0xF150
#if(WINVER >= 0x0400)
#define SC_DEFAULT 0xF160
#define SC_MONITORPOWER 0xF170
#define SC_CONTEXTHELP 0xF180
#define SC_SEPARATOR 0xF00F
#endif //WINVER >= 0x0400
#define SC_ICON SC_MINIMIZE
#define SC_ZOOM SC_MAXIMIZE
#define SC_ZOOM SC_MAXIMIZE
// end_r_winuser
#endif
另外:
0x0f12为鼠标左键点击标题栏
0x0f93为鼠标左键点击标题栏上的图标
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.16
------------------------------------------------------------------------------------
No.21 /*设置位图按钮*/
1.初始化控件
绘制控件时,在按钮的【Styles】属性中选中【Owner draw】和【Bitmap】;
2.声明按钮变量
将每一个按钮对应一个CButton类对象,然后将类名改为CBitmapButton;
3.载入位图资源
每个按钮变量至少载入1张位图,一般要载入4张,表示4中按钮状态:
①正常显式,ID号一般以"U"结尾;
②按钮处于焦点,ID号一般以"F"结尾;
③按钮被按下,ID号一般以"D"结尾;
④按钮不可用,ID号一般以"X"结尾。
3.按钮变量初始化
在对话框的 OnInitDialog()函数中,用CBitmapButton::LoadBitmaps()函数为每个按钮变量载入对应位图资源,如:
m_DelBtn.LoadBitmaps(IDB_DEL_UP,IDB_DEL_DOWN,IDB_DEL_FOCUS,IDB_DEL_DISABLE);
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.19
------------------------------------------------------------------------------------
No.22 /*设置对话框背景画刷、字体、字体颜色和文字覆盖模式*/
重载对话框消息 WM_CTLCOLOR 的映射函数 HBRUSH CMFCDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); 在pDC上改。
pWnd是正在绘制的控件。
1.设置字体颜色
pDC->SetTextColor(COLORREF TextColor);
2.设置文字覆盖模式
pDC->SetBkMode(TRANSPARENT/OPAQUE);
3.设置字体
①在对话框类中定义CFont对象m_xxFont;
②初始化
③在OnCtlColor()函数中加入代码:
pDC->SelectObject(&m_xxFont);
4.设置背景画刷
①在对话框类中定义CBrush对象m_xxBrush;
②初始化
③将OnCtlColor()函数中return代码改为:
return m_xxBrush;
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.21
------------------------------------------------------------------------------------
No.23 /*窗体渐渐出现*/
AnimateWindow(Handle,1000,AW_CENTER);
//在窗体创建事件中
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.9.5
------------------------------------------------------------------------------------
No.24 /*托盘操作*/
①在头文件中定义结构体变量:
NOTIFYICONDATA m_tnid;
②在CPP文件中的OnCreate()函数中,对上述变量进行初始化:
m_tnid.cbSize=sizeof(NOTIFYICONDATA);
m_tnid.hWnd=this->m_hWnd; //自定
m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; //自定
m_tnid.uCallbackMessage=MYWM_NOTIFYICON; //用户自定的回调信息
strcpy(m_tnid.szTip,"......"); //鼠标停留时提示信息
m_tnid.uID=IDI_ICON1; //图标资源标号
LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
③托盘函数:
::Shell_NotifyIcon(NIM_ADD,&m_tnid); //添加托盘图标
::Shell_NotifyIcon(NIM_DELETE,&m_tnid);
::Shell_NotifyIcon(NIM_MODIFY,&m_tnid);
④窗口显示代码(点击托盘图标之后):
托盘消息响应函数定义:
afx_msg LRESULT OnNotify***(WPARAM wParam,LPARAM lParam);
根据 lParam的值决定操作。(lParam的值可能是WM_RBUTTONDOWN、WM_RBUTTONDOWN)
用一个变量bool m_bShowFlag 表示当前窗口显示状态。
if (m_bShowFlag)
::SetForegroundWindow(AfxGetMainWnd()->m_hWnd);
::ShowWindow(AfxGetMainWnd()->m_hWnd,m_bShowFlag);
m_bShowFlag=!m_bShowFlag;
⑤鼠标右键单击弹出选单
CMenu menu;
menu.LoadMenu(IDR_MY_MENU); //载入事先定义的选单
CMenu*pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
⑥NOTIFYICONDATA 定义:
typedef struct _NOTIFYICONDATA {
DWORD cbSize; // 结构大小(sizeof struct),必须设置
HWND hWnd; // 发送通知消息的窗口句柄
UINT uID; // 图标ID ( 由回调函数的WPARAM 指定)
UINT uFlags;
UINT uCallbackMessage; // 消息被发送到此窗口过程
HICON hIcon; // 图标句柄
//鼠标停留在托盘图标上时的提示文本
#if (_WIN32_IE < 0x0500)
WCHAR szTip[64];
#else
WCHAR szTip[128];
#endif
//显示气球提示
#if (_WIN32_IE >= 0x0500)
DWORD dwState;
DWORD dwStateMask;
WCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
} DUMMYUNIONNAME;
WCHAR szInfoTitle[64];
DWORD dwInfoFlags;
#endif
} NOTIFYICONDATA, *PNOTIFYICONDATA;
⑦uFlags的值:
#define NIF_MESSAGE 0x1 // 表示uCallbackMessage 有效
#define NIF_ICON 0x2 // 表示hIcon 有效
#define NIF_TIP 0x4 // 表示szTip 有效
⑧气球提示:(暂时用不了)
在NOTIFYICONDATA.uFlags中的标志之一是NIF_TIP,用它来设置传统的信息提示, 即鼠标要移动到图标上。新的标志NIF_INFO(由于_WIN32_IE >= 0x0500 条件定义, 因此在编译时, 请注意包含最新版本的头文件shellapi.h, 并保证链接最新版本的库文件shell32.lib, 分发程序时用最新版本的运行时动态链接库shell32.dll)便是为显示气球提示所用的。 也就是说,要显示气球提示,那么在调用Shell_NotifyIcon函数时必须用NIF_INFO标志。提示文本填入szInfo域,标题文本填 入szInfoTitle。你甚至可以在NOTIFYICONDATA.uTimeout中设置一个超时时间,当经过指定的毫秒数之后,气球提示自动隐藏。
m_nid.cbSize=sizeof(NOTIFYICONDATA);
m_nid.uFlags = NIF_INFO;
m_nid.uTimeout = uTimeout;
m_nid.dwInfoFlags = dwInfoFlags;
strcpy(m_nid.szInfo,szMsg ? szMsg : _T(""));
strcpy(m_nid.szInfoTitle,szTitle ? szTitle : _T(""));
Shell_NotifyIcon(NIM_MODIFY, &m_nid);
缺省的dwInfoFlags设置为NIIF_INFO,在文本旁边显示信息图标;其它可能的标志 是NIIF_ERROR——表示出错,NIIF_WARNING——表示警告,NIIF_NONE——没有图标。
只有一种方法可以显示气球提示(Shell_NotifyIcon),但终止的方法有多种。用户可以在气球上单击鼠标,也可以单击关闭按钮(在Windows 2000 里没有关闭按钮), 或者Windows用超时机制来终止气球提示。每当创建托盘图标时,你可以提供一个HWND和消息ID来接收事件发生的通知。如果用户单击气球提示,Windows发送NIN_BALLOONUSERCLICK;如果超时或者单击关闭按钮,Windows则发送NIN_BALLOONTIMEOUT。就我所知,目前还没有办法区分是超时还是单击了关闭按钮。下表中列出的是所有与气球提示相关的通知消息:
通知消息 描述
NIN_BALLOONSHOW 显示气球提示时发送
NIN_BALLOONHIDE 气球提示消失时发送;例如,当图标被删除,如果因为超时或是用户单击鼠标气球消失,此消息不会被发送
NIN_BALLOONTIMEOUT 当由于超时或者用户单击气球上的关闭按钮(X),使气球消失时发送此消息
NIN_BALLOONUSERCLICK 当用户在气球提示上或托盘图标上单击鼠标(此时气球处于显示状态)时发送此消息
#endif
另外:
0x0f12为鼠标左键点击标题栏
0x0f93为鼠标左键点击标题栏上的图标
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.16
------------------------------------------------------------------------------------
No.21 /*设置位图按钮*/
1.初始化控件
绘制控件时,在按钮的【Styles】属性中选中【Owner draw】和【Bitmap】;
2.声明按钮变量
将每一个按钮对应一个CButton类对象,然后将类名改为CBitmapButton;
3.载入位图资源
每个按钮变量至少载入1张位图,一般要载入4张,表示4中按钮状态:
①正常显式,ID号一般以"U"结尾;
②按钮处于焦点,ID号一般以"F"结尾;
③按钮被按下,ID号一般以"D"结尾;
④按钮不可用,ID号一般以"X"结尾。
3.按钮变量初始化
在对话框的 OnInitDialog()函数中,用CBitmapButton::LoadBitmaps()函数为每个按钮变量载入对应位图资源,如:
m_DelBtn.LoadBitmaps(IDB_DEL_UP,IDB_DEL_DOWN,IDB_DEL_FOCUS,IDB_DEL_DISABLE);
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.19
------------------------------------------------------------------------------------
No.22 /*设置对话框背景画刷、字体、字体颜色和文字覆盖模式*/
重载对话框消息 WM_CTLCOLOR 的映射函数 HBRUSH CMFCDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); 在pDC上改。
pWnd是正在绘制的控件。
1.设置字体颜色
pDC->SetTextColor(COLORREF TextColor);
2.设置文字覆盖模式
pDC->SetBkMode(TRANSPARENT/OPAQUE);
3.设置字体
①在对话框类中定义CFont对象m_xxFont;
②初始化
③在OnCtlColor()函数中加入代码:
pDC->SelectObject(&m_xxFont);
4.设置背景画刷
①在对话框类中定义CBrush对象m_xxBrush;
②初始化
③将OnCtlColor()函数中return代码改为:
return m_xxBrush;
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.8.21
------------------------------------------------------------------------------------
No.23 /*窗体渐渐出现*/
AnimateWindow(Handle,1000,AW_CENTER);
//在窗体创建事件中
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.9.5
------------------------------------------------------------------------------------
No.24 /*托盘操作*/
①在头文件中定义结构体变量:
NOTIFYICONDATA m_tnid;
②在CPP文件中的OnCreate()函数中,对上述变量进行初始化:
m_tnid.cbSize=sizeof(NOTIFYICONDATA);
m_tnid.hWnd=this->m_hWnd; //自定
m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; //自定
m_tnid.uCallbackMessage=MYWM_NOTIFYICON; //用户自定的回调信息
strcpy(m_tnid.szTip,"......"); //鼠标停留时提示信息
m_tnid.uID=IDI_ICON1; //图标资源标号
LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
③托盘函数:
::Shell_NotifyIcon(NIM_ADD,&m_tnid); //添加托盘图标
::Shell_NotifyIcon(NIM_DELETE,&m_tnid);
::Shell_NotifyIcon(NIM_MODIFY,&m_tnid);
④窗口显示代码(点击托盘图标之后):
托盘消息响应函数定义:
afx_msg LRESULT OnNotify***(WPARAM wParam,LPARAM lParam);
根据 lParam的值决定操作。(lParam的值可能是WM_RBUTTONDOWN、WM_RBUTTONDOWN)
用一个变量bool m_bShowFlag 表示当前窗口显示状态。
if (m_bShowFlag)
::SetForegroundWindow(AfxGetMainWnd()->m_hWnd);
::ShowWindow(AfxGetMainWnd()->m_hWnd,m_bShowFlag);
m_bShowFlag=!m_bShowFlag;
⑤鼠标右键单击弹出选单
CMenu menu;
menu.LoadMenu(IDR_MY_MENU); //载入事先定义的选单
CMenu*pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
⑥NOTIFYICONDATA 定义:
typedef struct _NOTIFYICONDATA {
DWORD cbSize; // 结构大小(sizeof struct),必须设置
HWND hWnd; // 发送通知消息的窗口句柄
UINT uID; // 图标ID ( 由回调函数的WPARAM 指定)
UINT uFlags;
UINT uCallbackMessage; // 消息被发送到此窗口过程
HICON hIcon; // 图标句柄
//鼠标停留在托盘图标上时的提示文本
#if (_WIN32_IE < 0x0500)
WCHAR szTip[64];
#else
WCHAR szTip[128];
#endif
//显示气球提示
#if (_WIN32_IE >= 0x0500)
DWORD dwState;
DWORD dwStateMask;
WCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
} DUMMYUNIONNAME;
WCHAR szInfoTitle[64];
DWORD dwInfoFlags;
#endif
} NOTIFYICONDATA, *PNOTIFYICONDATA;
⑦uFlags的值:
#define NIF_MESSAGE 0x1 // 表示uCallbackMessage 有效
#define NIF_ICON 0x2 // 表示hIcon 有效
#define NIF_TIP 0x4 // 表示szTip 有效
⑧气球提示:(暂时用不了)
在NOTIFYICONDATA.uFlags中的标志之一是NIF_TIP,用它来设置传统的信息提示, 即鼠标要移动到图标上。新的标志NIF_INFO(由于_WIN32_IE >= 0x0500 条件定义, 因此在编译时, 请注意包含最新版本的头文件shellapi.h, 并保证链接最新版本的库文件shell32.lib, 分发程序时用最新版本的运行时动态链接库shell32.dll)便是为显示气球提示所用的。 也就是说,要显示气球提示,那么在调用Shell_NotifyIcon函数时必须用NIF_INFO标志。提示文本填入szInfo域,标题文本填 入szInfoTitle。你甚至可以在NOTIFYICONDATA.uTimeout中设置一个超时时间,当经过指定的毫秒数之后,气球提示自动隐藏。
m_nid.cbSize=sizeof(NOTIFYICONDATA);
m_nid.uFlags = NIF_INFO;
m_nid.uTimeout = uTimeout;
m_nid.dwInfoFlags = dwInfoFlags;
strcpy(m_nid.szInfo,szMsg ? szMsg : _T(""));
strcpy(m_nid.szInfoTitle,szTitle ? szTitle : _T(""));
Shell_NotifyIcon(NIM_MODIFY, &m_nid);
缺省的dwInfoFlags设置为NIIF_INFO,在文本旁边显示信息图标;其它可能的标志 是NIIF_ERROR——表示出错,NIIF_WARNING——表示警告,NIIF_NONE——没有图标。
只有一种方法可以显示气球提示(Shell_NotifyIcon),但终止的方法有多种。用户可以在气球上单击鼠标,也可以单击关闭按钮(在Windows 2000 里没有关闭按钮), 或者Windows用超时机制来终止气球提示。每当创建托盘图标时,你可以提供一个HWND和消息ID来接收事件发生的通知。如果用户单击气球提示,Windows发送NIN_BALLOONUSERCLICK;如果超时或者单击关闭按钮,Windows则发送NIN_BALLOONTIMEOUT。就我所知,目前还没有办法区分是超时还是单击了关闭按钮。下表中列出的是所有与气球提示相关的通知消息:
通知消息 描述
NIN_BALLOONSHOW 显示气球提示时发送
NIN_BALLOONHIDE 气球提示消失时发送;例如,当图标被删除,如果因为超时或是用户单击鼠标气球消失,此消息不会被发送
NIN_BALLOONTIMEOUT 当由于超时或者用户单击气球上的关闭按钮(X),使气球消失时发送此消息
NIN_BALLOONUSERCLICK 当用户在气球提示上或托盘图标上单击鼠标(此时气球处于显示状态)时发送此消息
------------------------------------------------------------------------------------
No.25 /*获取全屏设备描述符句柄*/
HDC hDC=::GetDC(NULL);
释放:
::ReleaseDC(NULL,hDC);
------------------------------------------------------------------------------------
No.26 /*读写“ini”文件*/
::WritePrivateProfileString("分类名","标题","标题所对应的值","文件名");
int ::GetPrivateProfileInt("分类名","标题",int(位数),"文件名");
------------------------------------------------------------------------------------
No.27 /*系统热键*/
①注册:
RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_ALT,'B'); //注册热键【Ctrl+Alt+B】
RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_ALT,'b'); //注册热键【Ctrl+Alt+b】
②热键响应,在消息WM_HOTKEY的响应函数OnHotKey()中:
参数wParam返回热键的键值,上述 1001 和 1002 。
if (1001 == wParam || 1002 == wParam)
{
消息处理代码;
}
③注销热键(在主窗口被销毁时,即进程结束时):
UnregisterHotKey(m_hWnd,1001);
UnregisterHotKey(m_hWnd,1002);
------------------------------------------------------------------------------------
No.28 /*返回本机IP地址*/
#define MAX_LEN 256
char HostName[MAX_LEN];
CString stHostIP;
gethostname(HostName,MAX_LEN);
struct hostent* pHostEnt;
pHostEnt=gethostbyname(HostName);
if (pHostEnt!=NULL)
{
stHostIP.Format("%d.%d.%d.%d",
(pHostEnt->h_addr_list[0][0] & 0x00ff),
(pHostEnt->h_addr_list[0][1] & 0x00ff),
(pHostEnt->h_addr_list[0][2] & 0x00ff),
(pHostEnt->h_addr_list[0][3] & 0x00ff));
}
------------------------------------------------------------------------------------
No.29 /*修改进程权限*/
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken);
//打开一个进程的访问令牌;
//GetCurrentProcess()返回本进程的句柄。
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
//修改进程权限。
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(TOKEN_PRIVILEGES)NULL,0);
之后可以调用:
ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0); //重启Windows
ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0); //关闭Windows
InitiateSystemShutdown(NULL,NULL,0,TRUE,FALSE); //快速重启
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.9.16
------------------------------------------------------------------------------------
No.30 /*截获Windows发送的消息到指定类*/
CSubclassWnd类可以截获Windows消息,并将它发送到另外一个窗口消息处理例程中处理,而不是发送到Windows自己默认的消息处理函数。
CSubclassWnd通过安装它自己的窗口过程,从而先于MFC一步对消息进行处理。
------------------------------------------------------------------------------------
No.31 /*在Explorer重启后恢复托盘图标*/
如果你用的操作系统是Windows 98, 或者你安装了IE 4.0 的桌面。那么不论什么时候,只要IE 4.0 启动了任务栏,那么它就会向所有最顶层父窗口广播一个注册消息:TaskbarCreated。有了这个线索,你就可以重新创建图标。如果你用MFC编程,那么只要定义一个全程变量保存这个注册消息并实现ON_REGISTERED_MESSAGE消息处理例程即可:
const UINT WM_TASKBARCREATED =
::RegisterWindowMessage(_T("TaskbarCreated"));
No.25 /*获取全屏设备描述符句柄*/
HDC hDC=::GetDC(NULL);
释放:
::ReleaseDC(NULL,hDC);
------------------------------------------------------------------------------------
No.26 /*读写“ini”文件*/
::WritePrivateProfileString("分类名","标题","标题所对应的值","文件名");
int ::GetPrivateProfileInt("分类名","标题",int(位数),"文件名");
------------------------------------------------------------------------------------
No.27 /*系统热键*/
①注册:
RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_ALT,'B'); //注册热键【Ctrl+Alt+B】
RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_ALT,'b'); //注册热键【Ctrl+Alt+b】
②热键响应,在消息WM_HOTKEY的响应函数OnHotKey()中:
参数wParam返回热键的键值,上述 1001 和 1002 。
if (1001 == wParam || 1002 == wParam)
{
消息处理代码;
}
③注销热键(在主窗口被销毁时,即进程结束时):
UnregisterHotKey(m_hWnd,1001);
UnregisterHotKey(m_hWnd,1002);
------------------------------------------------------------------------------------
No.28 /*返回本机IP地址*/
#define MAX_LEN 256
char HostName[MAX_LEN];
CString stHostIP;
gethostname(HostName,MAX_LEN);
struct hostent* pHostEnt;
pHostEnt=gethostbyname(HostName);
if (pHostEnt!=NULL)
{
stHostIP.Format("%d.%d.%d.%d",
(pHostEnt->h_addr_list[0][0] & 0x00ff),
(pHostEnt->h_addr_list[0][1] & 0x00ff),
(pHostEnt->h_addr_list[0][2] & 0x00ff),
(pHostEnt->h_addr_list[0][3] & 0x00ff));
}
------------------------------------------------------------------------------------
No.29 /*修改进程权限*/
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken);
//打开一个进程的访问令牌;
//GetCurrentProcess()返回本进程的句柄。
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
//修改进程权限。
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(TOKEN_PRIVILEGES)NULL,0);
之后可以调用:
ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0); //重启Windows
ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0); //关闭Windows
InitiateSystemShutdown(NULL,NULL,0,TRUE,FALSE); //快速重启
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.9.16
------------------------------------------------------------------------------------
No.30 /*截获Windows发送的消息到指定类*/
CSubclassWnd类可以截获Windows消息,并将它发送到另外一个窗口消息处理例程中处理,而不是发送到Windows自己默认的消息处理函数。
CSubclassWnd通过安装它自己的窗口过程,从而先于MFC一步对消息进行处理。
------------------------------------------------------------------------------------
No.31 /*在Explorer重启后恢复托盘图标*/
如果你用的操作系统是Windows 98, 或者你安装了IE 4.0 的桌面。那么不论什么时候,只要IE 4.0 启动了任务栏,那么它就会向所有最顶层父窗口广播一个注册消息:TaskbarCreated。有了这个线索,你就可以重新创建图标。如果你用MFC编程,那么只要定义一个全程变量保存这个注册消息并实现ON_REGISTERED_MESSAGE消息处理例程即可:
const UINT WM_TASKBARCREATED =
::RegisterWindowMessage(_T("TaskbarCreated"));
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_REGISTERED_MESSAGE(WM_TASKBARCREATED,OnTaskBarCreated)
END_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_REGISTERED_MESSAGE(WM_TASKBARCREATED,OnTaskBarCreated)
END_MESSAGE_MAP(CMainFrame, CFrameWnd)
LRESULT CMainFrame::OnTaskBarCreated(WPARAM wp, LPARAM lp)
{
VERIFY(InstallIcons());//调用恢复托盘图标函数
return 0;
}
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.12.11
------------------------------------------------------------------------------------
No.32 /*自定义状态栏(一)*/
1.申明状态栏分区:
static UINT indicators[] =
{
ID_SEPARATOR, // 菜单状态提示
ID_PROGRESSTEXT, //在Resource.h中自定义,用于输出文本,在String Table中也要定义
ID_PROGRESSAREA, //在Resource.h中自定义,用于放置进度条控件,在String Table中也要定义
//以下在本例中没有用到
ID_INDICATOR_CAPS, //大小写状态,即【Caps Lock】键状态
ID_INDICATOR_NUM, //小键盘状态,即【Num Lock】键状态
ID_INDICATOR_SCRL, //滚动状态,即【Scroll Lock】键状态
ID_INDICATOR_OVR, //插入/覆盖状态,即【Insert】键状态
ID_INDICATOR_EXT, //后缀名,extended selection indicator
ID_INDICATOR_REC, // record mode indicator
ID_INDICATOR_KANA // kana lock indicator
};
2.初始化状态栏
①创建状态栏及分区:
在CMainFrame::OnCreate() 或 CXXXDlg::OnInitDialog()中:
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
②设置每一列的宽度:
在CMainFrame::OnCreate() 或 CXXXDlg::OnInitDialog()中:
int pint[]={120,170,-1};
m_wndStatusBar.GetStatusBarCtrl().SetParts(3,pint);
或
for(int i=0;i<3;i++)
m_wndStatusBar.SetPaneInfo(i,indicators[i],SBPS_NORMAL,pint[i]);
3.更新操作:
①更新文本:
m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_PROGRESSTEXT),str);
②更新进度条:
m_wndStatusBar.GetItemRect(i,&rect); //获取某一栏的位置,i为栏号(从0计数)
CProgressCtrl m_Progress; //在MainFrm.h中定义
m_Progress.Create(WS_VISIBLE|WS_CHILD|PBS_SMOOTH,rect,&m_wndStatusBar,10);
m_Progress.SetRange(0,100); //设置滚动条范围
m_Progress.SetStep(1);
/*自定义状态栏(二) 见No.45*/
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.12.11
------------------------------------------------------------------------------------
No.33 /*客户区分栏*/
1.定义CSplitterWnd对象
在CMainFrame类中定义对象:
CSplitterWnd m_sp;
2.创建分区:
重载CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext),
调用BOOL CreateStatic( CWnd* pParentWnd, //父框架窗口指针,第一次分栏为this
//以后为外层的CSplitterWnd指针
int nRows, //行数。这个值必须不超过16。
int nCols, //列数。这个值必须不超过16。
DWORD dwStyle = WS_CHILD | WS_VISIBLE, //指定窗口的风格。
UINT nID = AFX_IDW_PANE_FIRST//此窗口的子窗口ID
//不是嵌套在另一个分隔器窗口中的
//可以是AFX_IDW_PANE_FIRSH
//否则,用父窗口对应分栏ID
//如m_SpFather.IdFromRowCol(0, 0)
);
如:
m_Sp3.CreateStatic(&m_sp,2,1,WS_CHILD|WS_VISIBLE, m_SpFather.IdFromRowCol(0, 0));
3.创建视图:
每一个分区对应一个视图:
virtual BOOL CreateView(
int row, //行号
int col, //列号
CRuntimeClass* pViewClass, //指定新视的CRuntimeClass
//用RUNTIME_CLASS(CXXXXView)获取
SIZE sizeInit, //指定新视的初始尺寸,如CSize(x,y)
CCreateContext* pContext ); //即OnCreateClient的参数
如:
m_sp.CreateView(0,0,RUNTIME_CLASS(CTest1View),CSize(cx*3/4,cy-324), pContext);
m_sp.CreateView(0,0,RUNTIME_CLASS(CControlWnd),CSize(400,400),pContext);
4.若想使分栏固定(即使分栏线不能左右移动)
应该写一个类继承自CSplitterWnd,重载函数:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
使它们什么都不做。
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.12.18
------------------------------------------------------------------------------------
No.34 /*改变屏幕分辨率及其它*/
1.获取当前屏幕分辨率及相关信息:
DEVMODE DevMode; //屏幕信息结构体
EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&DevMode); //获取当前的数据
int nCurrentWidth = DevMode.dmPelsWidth;
int nCurrentHeight = DevMode.dmPelsHeight;
2.修改分辨率:
DevMode.dmPelsWidth = 1280; //修改成你想要的分辨率
DevMode.dmPelsHeight = 768;
ChangeDisplaySettings(&DevMode, CDS_UPDATEREGISTRY); //设置生效
3.结构体DEVMODE的说明:
DEVMODE数据结构中包含了有关设备初始化和打印机环境的信息。
typedef struct _devicemode
{
TCHAR dmDeviceName[32]; //驱动程序支持的设备名称。
WORD dmSpecVersion; //指定了初始化数据的版本数字。
WORD dmDriverVersion; //打印机驱动程序版本号。
WORD dmSize; //DEVMODE结构的大小,以字节为单位;
//不包括dmDriverData(与设备有关)成员。
WORD dmDriverExtra; //包含了后面的私有驱动程序数据的数目。
DWORD dmFields; //DEVMODE结构的其余成员中哪些已被初始化
//第0位(定义为DM_ORIENTATION)代表dmOrientation
//第1位(定义为 DM_PAPERSIZE)代表dmPaperSize
short dmOrientation; //选择纸的方向。
//DMORIENT_PORTRAIT(1)
//DMORIENT_ LANDSCAPE(2)
short dmPaperSize; //选择将用于打印的纸张大小
short dmPaperLength; //重定义由dmPaperSize成员指定的纸张长度
short dmPaperWidth; //重载由dmPaperSize成员指定的纸张宽度
short dmScale; //指定了打印输出的缩放因子。
short dmCopies; //若设备支持多页拷贝,表示要打印的数目。
short dmDefaultSource; //保留,必须为0。
short dmPrintQuality; //指定了打印机的分辨率。
//DMRES_HIGH、DMRES_MEDIUM
//DMRES_LOW、DMRES_DRAFT
short dmColor; //对于彩色打印机,在彩色和单色之间切换。
//DMCOLOR_COLOR、DMCOLOR_MONOCHROME
short dmDuplex; //为支持双面打印的打印机选择双面打印方式
//DMDUP_SIMPLEX
//DMDUP_HORIZONTAL
//DMDUP_VERTICAL
short dmYResolution; //打印机在y方向的分辨率。
short dmTTOption; //指明如何打印TrueType字体。
//DMTT_BITMAP 把TrueType字体作为图形打印。
//DMTT_DOWNLOAD 将TrueType字体作为软字体下载。
//DMTT_SUBDEV 用TrueType字体替换设备字体。
short dmCollate; //在打印多份拷贝的时候是否使用校对。
TCHAR dmFormName[32]; //指定了要使用的格式名字。
WORD dmUnusedPadding; //用于将结构对齐到DWORD边界。
 
{
VERIFY(InstallIcons());//调用恢复托盘图标函数
return 0;
}
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.12.11
------------------------------------------------------------------------------------
No.32 /*自定义状态栏(一)*/
1.申明状态栏分区:
static UINT indicators[] =
{
ID_SEPARATOR, // 菜单状态提示
ID_PROGRESSTEXT, //在Resource.h中自定义,用于输出文本,在String Table中也要定义
ID_PROGRESSAREA, //在Resource.h中自定义,用于放置进度条控件,在String Table中也要定义
//以下在本例中没有用到
ID_INDICATOR_CAPS, //大小写状态,即【Caps Lock】键状态
ID_INDICATOR_NUM, //小键盘状态,即【Num Lock】键状态
ID_INDICATOR_SCRL, //滚动状态,即【Scroll Lock】键状态
ID_INDICATOR_OVR, //插入/覆盖状态,即【Insert】键状态
ID_INDICATOR_EXT, //后缀名,extended selection indicator
ID_INDICATOR_REC, // record mode indicator
ID_INDICATOR_KANA // kana lock indicator
};
2.初始化状态栏
①创建状态栏及分区:
在CMainFrame::OnCreate() 或 CXXXDlg::OnInitDialog()中:
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
②设置每一列的宽度:
在CMainFrame::OnCreate() 或 CXXXDlg::OnInitDialog()中:
int pint[]={120,170,-1};
m_wndStatusBar.GetStatusBarCtrl().SetParts(3,pint);
或
for(int i=0;i<3;i++)
m_wndStatusBar.SetPaneInfo(i,indicators[i],SBPS_NORMAL,pint[i]);
3.更新操作:
①更新文本:
m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_PROGRESSTEXT),str);
②更新进度条:
m_wndStatusBar.GetItemRect(i,&rect); //获取某一栏的位置,i为栏号(从0计数)
CProgressCtrl m_Progress; //在MainFrm.h中定义
m_Progress.Create(WS_VISIBLE|WS_CHILD|PBS_SMOOTH,rect,&m_wndStatusBar,10);
m_Progress.SetRange(0,100); //设置滚动条范围
m_Progress.SetStep(1);
/*自定义状态栏(二) 见No.45*/
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.12.11
------------------------------------------------------------------------------------
No.33 /*客户区分栏*/
1.定义CSplitterWnd对象
在CMainFrame类中定义对象:
CSplitterWnd m_sp;
2.创建分区:
重载CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext),
调用BOOL CreateStatic( CWnd* pParentWnd, //父框架窗口指针,第一次分栏为this
//以后为外层的CSplitterWnd指针
int nRows, //行数。这个值必须不超过16。
int nCols, //列数。这个值必须不超过16。
DWORD dwStyle = WS_CHILD | WS_VISIBLE, //指定窗口的风格。
UINT nID = AFX_IDW_PANE_FIRST//此窗口的子窗口ID
//不是嵌套在另一个分隔器窗口中的
//可以是AFX_IDW_PANE_FIRSH
//否则,用父窗口对应分栏ID
//如m_SpFather.IdFromRowCol(0, 0)
);
如:
m_Sp3.CreateStatic(&m_sp,2,1,WS_CHILD|WS_VISIBLE, m_SpFather.IdFromRowCol(0, 0));
3.创建视图:
每一个分区对应一个视图:
virtual BOOL CreateView(
int row, //行号
int col, //列号
CRuntimeClass* pViewClass, //指定新视的CRuntimeClass
//用RUNTIME_CLASS(CXXXXView)获取
SIZE sizeInit, //指定新视的初始尺寸,如CSize(x,y)
CCreateContext* pContext ); //即OnCreateClient的参数
如:
m_sp.CreateView(0,0,RUNTIME_CLASS(CTest1View),CSize(cx*3/4,cy-324), pContext);
m_sp.CreateView(0,0,RUNTIME_CLASS(CControlWnd),CSize(400,400),pContext);
4.若想使分栏固定(即使分栏线不能左右移动)
应该写一个类继承自CSplitterWnd,重载函数:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
使它们什么都不做。
------------------------------------------------------------------------------------
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
------------------------------------------------------------------------------------
2009.12.18
------------------------------------------------------------------------------------
No.34 /*改变屏幕分辨率及其它*/
1.获取当前屏幕分辨率及相关信息:
DEVMODE DevMode; //屏幕信息结构体
EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&DevMode); //获取当前的数据
int nCurrentWidth = DevMode.dmPelsWidth;
int nCurrentHeight = DevMode.dmPelsHeight;
2.修改分辨率:
DevMode.dmPelsWidth = 1280; //修改成你想要的分辨率
DevMode.dmPelsHeight = 768;
ChangeDisplaySettings(&DevMode, CDS_UPDATEREGISTRY); //设置生效
3.结构体DEVMODE的说明:
DEVMODE数据结构中包含了有关设备初始化和打印机环境的信息。
typedef struct _devicemode
{
TCHAR dmDeviceName[32]; //驱动程序支持的设备名称。
WORD dmSpecVersion; //指定了初始化数据的版本数字。
WORD dmDriverVersion; //打印机驱动程序版本号。
WORD dmSize; //DEVMODE结构的大小,以字节为单位;
//不包括dmDriverData(与设备有关)成员。
WORD dmDriverExtra; //包含了后面的私有驱动程序数据的数目。
DWORD dmFields; //DEVMODE结构的其余成员中哪些已被初始化
//第0位(定义为DM_ORIENTATION)代表dmOrientation
//第1位(定义为 DM_PAPERSIZE)代表dmPaperSize
short dmOrientation; //选择纸的方向。
//DMORIENT_PORTRAIT(1)
//DMORIENT_ LANDSCAPE(2)
short dmPaperSize; //选择将用于打印的纸张大小
short dmPaperLength; //重定义由dmPaperSize成员指定的纸张长度
short dmPaperWidth; //重载由dmPaperSize成员指定的纸张宽度
short dmScale; //指定了打印输出的缩放因子。
short dmCopies; //若设备支持多页拷贝,表示要打印的数目。
short dmDefaultSource; //保留,必须为0。
short dmPrintQuality; //指定了打印机的分辨率。
//DMRES_HIGH、DMRES_MEDIUM
//DMRES_LOW、DMRES_DRAFT
short dmColor; //对于彩色打印机,在彩色和单色之间切换。
//DMCOLOR_COLOR、DMCOLOR_MONOCHROME
short dmDuplex; //为支持双面打印的打印机选择双面打印方式
//DMDUP_SIMPLEX
//DMDUP_HORIZONTAL
//DMDUP_VERTICAL
short dmYResolution; //打印机在y方向的分辨率。
short dmTTOption; //指明如何打印TrueType字体。
//DMTT_BITMAP 把TrueType字体作为图形打印。
//DMTT_DOWNLOAD 将TrueType字体作为软字体下载。
//DMTT_SUBDEV 用TrueType字体替换设备字体。
short dmCollate; //在打印多份拷贝的时候是否使用校对。
TCHAR dmFormName[32]; //指定了要使用的格式名字。
WORD dmUnusedPadding; //用于将结构对齐到DWORD边界。