📄 windows系统控制.htm
字号:
m_AnimateIcons = new HICON[Number];<Br> CopyMemory(m_AnimateIcons, hIcon, Number * sizeof(HICON));<Br> m_AnimateIconsNumber = Number;<Br> return TRUE;<Br>}<Br></Br>BOOL CTrayIcon::Animate(UINT Index)<Br>{//动画TrayIcon<Br> UINT i = Index % m_AnimateIconsNumber;<Br> return ChangeIcon(m_AnimateIcons[i]);<Br>}<Br></Br>在应用程序中添加相应的菜单和函数(请参考下面的例子):<Br></Br>void CMainFrame::OnMenuAnimate()<Br>{//动画TrayIcon,设置图标及定时器<Br> SetTimer(1, 500, NULL);<Br> HICON hIcon[3];<Br> hIcon[0] = AfxGetApp()->LoadIcon(IDR_MAINFRAME);<Br> hIcon[1] = AfxGetApp()->LoadIcon(IDR_MYTURNTYPE);<Br> hIcon[2] = AfxGetApp()->LoadStandardIcon(IDI_HAND);<Br> trayicon.SetAnimateIcons(hIcon, 3);<Br>}<Br></Br>void CMainFrame::OnTimer(UINT nIDEvent)<Br>{//动画TrayIcon<Br> UINT static i;<Br> i += 1;<Br> trayicon.Animate(i);<Br></Br> CMDIFrameWnd::OnTimer(nIDEvent);<Br>}<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="2">使用拖放的简单方法</a></font></td></tr><tr><td><p></Br>如果要为窗口增加接受Drag&Drop的功能,请按照以下步骤:<Br></Br>1、在OnCreate(...)中调用AcceptDrag(TRUE)。<Br></Br>2、增加消息映射<Br></Br>BEGIN_MESSAGE_MAP(……)<Br> //{{AFX_MSG_MAP(CDropEdit)<Br> ON_WM_CREATE()<Br> ON_WM_DROPFILES() // 关于Drag&Drop的消息<Br> //}}AFX_MSG_MAP<Br>END_MESSAGE_MAP()<Br></Br></Br>3、处理消息<Br></Br>void CXXXXX::OnDropFiles(HDROP dropInfo)<Br>{<Br> // 得到Drag&Drop的文件个数<Br> WORD wNumFilesDropped = DragQueryFile(dropInfo, -1, NULL, 0);<Br></Br> CString firstFile="";<Br></Br> //<Br> for (WORD x = 0 ; x < wNumFilesDropped; x++) {<Br></Br> // 得到PathName的长度,由于第三个参数为NULL,所以调用会失败并返回所需长度<Br> WORD wPathnameSize = DragQueryFile(dropInfo, x, NULL, 0);<Br></Br> // 分配memory<Br> char * npszFile = (char *) LocalAlloc(LPTR, wPathnameSize += 1);<Br></Br> // 分配错<Br> if (npszFile == NULL) continue;<Br></Br> // 再次得到文件名<Br> DragQueryFile(dropInfo, x, npszFile, wPathnameSize);<Br></Br> firstFile=npszFile;<Br></Br></Br> // 如果是shortCut则进行转换得到正确的文件名,expandedFile为最后的文件名<Br> CString expandedFile = ExpandShortcut(firstFile);<Br></Br> // 释放memory<Br> LocalFree(npszFile);<Br> }<Br></Br> //完成<Br> DragFinish(dropInfo);<Br></Br>}<Br></Br></Br>4、关于ExpandShortcut(...)<Br></Br>CString CXXXXX::ExpandShortcut(CString &inFile)<Br>{<Br> CString outFile = "";<Br></Br>// Make sure we have a path<Br>ASSERT(inFile != _T(""));<Br></Br>IShellLink* psl;<Br>HRESULT hres;<Br>LPTSTR lpsz = inFile.GetBuffer(MAX_PATH);<Br></Br>// Create instance for shell link<Br>hres = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,<Br>IID_IShellLink, (LPVOID*) &psl);<Br>if (SUCCEEDED(hres))<Br>{<Br>// Get a pointer to the persist file interface<Br>IPersistFile* ppf;<Br>hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*) &ppf);<Br>if (SUCCEEDED(hres))<Br>{<Br>// Make sure it's ANSI<Br>WORD wsz[MAX_PATH];<Br>::MultiByteToWideChar(CP_ACP, 0, lpsz, -1, wsz, MAX_PATH);<Br></Br>// Load shortcut<Br>hres = ppf->Load(wsz, STGM_READ);<Br>if (SUCCEEDED(hres)) {<Br> WIN32_FIND_DATA wfd;<Br> // find the path from that<Br> HRESULT hres = psl->GetPath(outFile.GetBuffer(MAX_PATH),<Br> MAX_PATH,<Br> &wfd,<Br> SLGP_UNCPRIORITY);<Br></Br> outFile.ReleaseBuffer();<Br>}<Br>ppf->Release();<Br>}<Br>psl->Release();<Br>}<Br></Br> inFile.ReleaseBuffer();<Br></Br> // if this fails, outFile == ""<Br>return outFile;<Br>}<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="3">用MFC编制屏幕保护程序 <Br>作者:Ed Halley. 翻译:Yu Hail 1998</a></font></td></tr><tr><td><p></Br>编写屏幕保护<Br></Br>现代显示器的很多优点,如长寿命的显示屏,液晶和能源之星能源保护模式, 已经让屏幕保护程序的作用大大地降低. 但是,依然有大量的屏幕保护程序出现,尤其是共享软件.<Br></Br>这也许是因为写屏幕保护程序是一件非常有趣的事. 因为有CRect和CGdiObject类,这些类的绘图功能比单纯的C API函数容易得多, 所以,用MFC写屏幕保护程序会是一件更有趣的事.<Br></Br>简单地和"Hello, world."应用程序比较,它不需要WinMain()函数,例如:<Br>如果你发掘一下有哪些API函数支持产生一个屏幕保护程序,你会发现可利用的函数非常少. 例如:用C写屏幕保护程序,大多数情况下都不需要调用DefWindowProc函数,取而代之的是DefScreenSaverProc函数. 如果调用你自已的函数(一般也就是三个),你可以编出一个和标准的屏幕保护程序功能一样的屏保程序.<Br></Br>对所有的屏幕保护程序:<Br></Br>屏幕保护程序的名字和描述在字符串1中定义.<Br>屏幕保护程序的图标为ID_APP, 在<scrnsave.h>中定义为100.<Br>WINAPI函数ScreenSaverProc必须定义和调用.<Br>(CScreenSaverWnd模块为你填充这个API调用.)<Br>程序必需以.SCR为扩展名.<Br></Br>对于可设置的屏幕保护程序:<Br></Br>设置屏幕保护程序的对话框为DLG_SCRNSAVECONFIGURE,在<scrnsave.h>定义为2003.<Br>WINAPI函数ScreenSaverConfigureDialog必须被定义和调用.<Br>WINAPI函数RegisterDialogClasses必须被定义和调用.<Br>(CScreenSaverDlg模块为你填充这个API调用.)<Br></Br><hr><Br>某些MFC外部特性<Br></Br>所有这些简单的特性来源于MFC,以及它便利的应用程序框架. 一个屏幕保护程序并不真的是一个应用程序,它只不过是操作系统在你离开键盘后才调用的一段代码. 它甚至不需要WINMAIN函数,MFC程序似乎不可能完成这一点,因为它已经调用了WINMAIN函数. 如果你没有用过WINAPI来编写C程序,你可能不知道MFC已经在幕后调用了DefWindowProc过程.<Br></Br>你当然能用MFC来生成一个屏幕保护程序,对于上述的限制,你只要在MFC的基础上做一点点工作即可. 以下提供两个抽象类 CScreenSaverWnd和CScreenSaverDlg,它会考虑这种限制,并且让你很容易创建一个功能完全的屏幕保护程序.<Br></Br>建一个基于对话框的MFC应用程序.<Br>使用VC4.2或5.0为屏幕保护程序产生一个新工程,你可以使用开发环境提供的AppWizard, 建立一个新"Win32 MFC Application"程序.如果你选择链接时MFC为共享(linked with MFC in a shared DLL), 屏幕保护程序会小很多.当然,基于对话框的应用程序将会避免产生不需要用DOC/VIEW构架.<Br></Br>删除所以关于CWinApp的引用和它本身.<Br>删除所有CWinApp派生类的申明和定义,包括一个全局的instance.<Br></Br>产生一个CWnd的派生类.<Br>我们已经创建了一个基于对话框的应用程序,但是屏幕保护程序只是需要一个简单的CWnd派生类. 你可以使用ClassWizard来产生一个继承于 generic CWnd class的派生类.<Br></Br>选择父类.<Br>从下载的文件中拷贝CScreenSaverWnd和CScreenSaverDlg的相关文件,*.CPP和*.H (作者要求你能保留源代码中的版权信息). 在你的窗口类中查找CWnd,将其换成CScreenSaverWnd,将CDialog换为CScreenSaveDlg. 然后重新编译.<Br></Br>一个特定的对话框.<Br>用ClassWizard产生的CDialog的派生类,没有处理命令行参数的构造函数. 因为屏幕保护程序的设置部分是一个窗口,需要命令行设置, 因此,在此提供了一个可以使用命令行的构造和析构函数.<Br></Br>全局考虑.<Br>当删掉CWinApp的派生类对象时,也同时删掉了全局的instance, 因此,程序中CScreenSaverWnd的派生类需要有一个全局的instance. 同样,在CScreenSaverDlg的派生类中也要保留一个副本.<Br></Br>资源.<Br>如前所述,屏幕保护程序包含以下资源: 字符串1中的描述,不要超过20个字符,当用户选择屏幕保护程序时,在下拉框中就会出现这个字符串.将图标资源的ID改为100.将对话框资源的ID改为2003.<Br></Br>泡沫,清洗,重复.<Br>你已经做好一个框架,现在可以编译,调试和开发了. 你可以改变工程输出的文件扩展名为.SCR,从而能出现屏幕保护程序的设置对话框. 如果你想调试屏幕保护程序,在运行时你可以用命令行参数:"/save"<Br></Br>分析自带的示例.<Br>示例使用VC5.0,但应该兼容于VC4.2,展示了 CScreenSaverWnd和CScreenSaverDlg的用法, 并且使用了CImageList来调用一个图标库,在屏幕上产生动画,请查看源程序的注解.<Br></Br><hr><Br>代码<Br></Br>虽然CScreenSaverWnd不是CView的派生类,我觉得应该重载OnInitialUpdate和OnDraw.我也加入了三个特性,你可以使用,也可以不使用.<Br></Br>CScreenSaverWnd的默认状态是黑屏,这由函数OnEraseBkgnd()来完成,你可以在构造函数,OnCreate,OnInitalUpadte这三个地方的任一处调用SetAutoBlack(FALSE)来关掉该项.<Br>成员变量m_pPalette指向CPalette,将被用于OnDraw调用之前的调色板设置, 重载OnQueryNewPalette()和OnPaletteChanged()来正确地处理调色板, 将m_pPalette设置为NULL,意味着所有的调色板操作代码都由你自已来完成. (注意:使用16色时(如示例),你不需要做任何调色板的工作).<Br>虽然屏幕保护程序的设置对话框和屏幕保护程序不可能同时出现,但它们确实需要通讯. 重载SaveOptions和RestoreOptions将用来保存和恢复各项参数. 在什么地方保存这种参数取决于你,但保留在系统注册表中是个不错的选择.<Br></Br>以下是上述两个类的框架,源程序已经很好地做了注解.<Br></Br>// Implemented class CScreenSaverWnd<Br>class CScreenSaverWnd : public CWnd<Br>{<Br>public:<Br> CScreenSaverWnd();<Br>// Attributes<Br>public:<Br> BOOL IsAutoBlack() const;<Br> void SetAutoBlack(BOOL bAutoBlack = TRUE);<Br> CPalette* GetPalette() const;<Br> void SetPalette(CPalette* pPalette);<Br>// Overridables<Br>public:<Br> virtual void OnDraw(CDC* pDC);<Br> virtual void OnInitialUpdate();<Br> virtual void SaveOptions();<Br> virtual void RestoreOptions();<Br>//Implementation<Br>public:<Br> virtual ~ScreenSaverWnd();<Br>protected:<Br> virtual LRESULT WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);<Br> virtual LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);<Br> afx_msg BOOL OnEraseBkgnd(CDC* pDC);<Br> afx_msg void OnPaint();<Br> afx_msg BOOL OnQueryNewPalette();<Br> afx_msg void OnPaletteChanged(CWnd* pFocusWnd);<Br>};<Br>// Implemented class CScreenSaverDlg<Br>class CScreenSaverDlg : public CDialog<Br>{<Br>public:<Br> CScreenSaverDlg();<Br>// Overrides<Br>public:<Br> virtual BOOL OnInitDialog();<Br>//Implementation<Br>public:<Br> virtual ~ScreenSaverDlg();<Br>protected:<Br> virtual LRESULT WindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);<Br> virtual LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam);<Br>};<Br>// Implemented APIs<Br>LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT uMsg,<Br> WPARAM wParam, LPARAM lParam);<Br>BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT uMsg,<Br> WPARAM wParam, LPARAM lParam);<Br>BOOL WINAPI RegisterDialogClasses(HANDLE hInstance);<Br>};<Br></p></td></tr><tr><td><font color="0000FF"><a name="4">如何编程结束应用程序?如何编程控制windows的重新引导? </a></font></td></tr><tr><td><p></Br>这是个很简单又是编程中经常要遇到的问题.<Br></Br>第一问,向窗口发送 WM_CLOSE消息,调用 CWnd::OnClose成员函数.允许对用户提示<Br></Br>是否保存修改过的数据.<Br></Br>Example: AfxGetMainWindow()->SendMessage(WM_CLOSE);<Br></Br>还可以创建一个自定义的函数 Terminate Window<Br></Br>void Terminate Window(LPCSTR pCaption)<Br></Br>{<Br></Br>CWnd *pWnd=Cwnd::FindWindow(NULL,pCaption);<Br></Br>if (pWnd)<Br></Br>pWnd ->SendMessage(WM_CLOSE);<Br></Br>}<Br></Br>说明: FindWindow函数不是提倡的做法,因为它无法处理标题栏自动改变,比如我们要检测 Notepad是不是已运行而事先不知道Notepad的标题栏,这时 FindWindow就无能为力了,可以通过枚举 windows任务列表的办法来实现。 在 机械出版社"Windows 95 API开发人员指南"一书有比较详细的介绍,这里就不再多说乐。<Br></Br>第二问,Use ExitWindowsEx Function函数控制系统是重新引导,还是重启 windows.前面已经有人讲过乐,就不再提了。<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="5">确定应用程序的 路径 </a></font></td></tr>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -