我的MFC/C++学习笔记

作者在 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 /*文件处理之搜索文件*/
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;
}
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();
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);
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
#define VK_BACK           0x08
#define VK_TAB            0x09
#define VK_CLEAR          0x0C
#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_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_ESCAPE         0x1B
#define VK_CONVERT        0x1C
#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
// 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_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_NUMLOCK        0x90
#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
#if(WINVER >= 0x0400)
#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 SC_ICON         SC_MINIMIZE
#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 当用户在气球提示上或托盘图标上单击鼠标(此时气球处于显示状态)时发送此消息
------------------------------------------------------------------------------------
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)
 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边界。
  
学习笔记 | 阅读 10152 次
文章评论,共1条
CrystalFan(作者)
2012-01-04 19:38
1
好歹说两句再走啊~~<br />
<img src="http://ftphi.bccn.net/003/201201/4/385612_1325677101rnRO.jpg">
游客请输入验证码