📄 系统.htm
字号:
CBrush::FromHandle (::GetSysColorBrush (COLOR_INFOBK)));<Br></Br>//Draw the ellipse.<Br></Br>pDC->Ellipse (rcView);<Br></Br>//Restore original brush.<Br></Br>pDC->SelectObject (pOrgBrush);<Br></Br>}<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="12">如何获取GDI对象的属性信息 </a></font></td></tr><tr><td><p></Br>可以调用GDIObject:: GetObject。这个函数将指定图表设备的消息写入到缓冲区。下例创建了几个有用的辅助函数。<Br></Br>//Determine if font is bold.<Br></Br>BOOL IsFontBold (const CFont&font)<Br></Br>{<Br></Br>LOGFONT stFont;<Br></Br>font.GetObject (sizeof (LOGFONT), &stFont);<Br></Br>return (stFont.lfBold)? TRUE: FALSE;<Br></Br>}<Br></Br>//Return the size of a bitmap.<Br></Br>CSize GetBitmapSize (const CBitmap&bitmap)<Br></Br>{<Br></Br>BITMAP stBitmap;<Br></Br>bitmap.GetObject (sizeof (BITMAP), &stBitmap);<Br></Br>return CSize (stBitmap.bmWidth, stBitmap. bmHeight);<Br></Br>}<Br></Br>//Create a pen with the same color as a brush.<Br></Br>BOOL CreatePenFromBrush (Cpen&pen, cost Cbrush&brush)<Br></Br>{<Br></Br>LOGBRUSH stBrush;<Br></Br>brush.Getobject (sizeof (LOGBRUSH), &stBrush);<Br></Br>return pen. Createpen (PS_SOLID, 0, stBrush.ibColor);<Br></Br>}<Br></Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="13">VC1.5 如何调用进程? </a></font></td></tr><tr><td><p></Br>我用VC1.52编Windows程序,中间想执行一个其他Windows应用程序,并且让我的程序挂起等应用程序执行完后再继续,请问如何实现?<Br></Br>exec( ) 和 spawn( )与Windows不兼容,所以它们肯定不行了.<Br></Br>WinExec()<Br></Br>挂起的一个简单方法是得到新进程的主窗口句柄,然后进入死循环,直到此句柄变为无效。<Br></Br>不知道还有什么更漂亮一些的手法。<Br></Br>请问,怎么得到进程的主窗口句柄呢?<Br></Br>是呀,我也正想问呢.例如我执行的是PSpice for Windows.用WinExec()<Br></Br>可以如下:<Br></Br>int nWinRun = WinExec("wpspice test.cir", SW_SHOWNORMAL);<Br></Br>可是如何得到新进程的主窗口句柄呢?能不能截取新进程的消息呢<Br></Br>紧接着用 GetActiveWindow() 就可以.<Br></Br>当然还是在win3.1 下才有用....<Br></Br>win95 下由于有输入的局部化问题,所以只能得到本线程的Activate Window或Focus Window,对于其他情况返回都是NULL.这问题还是不知道怎么办,alas...<Br></Br>所 以 最 根 本 的 办 法 是 如 何 读 写 Windows 消 息 总 库 .<Br></Br>哪 位 高 手 看 得 懂 SPY 的 源 程 序 (在 C++ 或 Delphi 之 类 的 Sample 中 有 ).<Br></Br>Use "FindWindow()". according to window title, get window handle.<Br></Br>then use Window Declassing method. that is write your own procedure<Br></Br>to process the message you want to capture. "CallWindowProc() is<Br></Br>executed before DefWindowProc()". (sorry can not type chinese now.)<Br></Br>我在Vc 4.0 下用_exec, _spawn, 以及WinExec都没问题的!<Br></Br> <Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="14">VC++1.5编Win3.1程序能否实现全局跳转? </a></font></td></tr><tr><td><p></Br>setjmp即可,和DOS下一样。<Br></Br>用Windows API 中的 Catch() 和 Throw() 可能会更好些。不过我也不知道和setjmp有些什么区别。<Br></Br>setjmp 恐怕不行, 它好象只能用来编写 C 程序,而不能用来编写 C++ 程序!<Br></Br>我的感觉是,只要是代码段,可以不受函数和应用的限制,随便乱跳的。其实是数据段,也可以跳过去的。换句话说,在WINDOW中,可以跳到任何地方,只要我乐意。<Br></Br> <Br></Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="15">启动和等待进程结束<Br>闻怡洋</a></font></td></tr><tr><td><p></Br>我们在开发是经常需要在启动一个进程之后等待其结束后再继续运行。<Br></Br>在这里提供了一个名为Wait的函数,它会为你完成上面的功能。实现的思想是在启动进程后等待其结束,由于进程是一种资源,而资源的句柄在WIN32中可以作为核心量使用。你可以使用WaitForSingleObject等待核心量状态改变为有信号状态。对进程来讲当进程结束时其状态转变为有信号。<Br></Br>在本例中使用了一个单独的线程来启动进程并等待结束。<Br></Br>Wait()<Br>BOOL Wait(CString szCmdLine)<Br>{<Br> LPTHREADINFO pThreadInfo = new THREADINFO;<Br> CEvent *pThreadEvent = new CEvent(FALSE, TRUE);<Br> ASSERT_VALID(pThreadEvent);<Br> if(pThreadInfo)<Br> {<Br> pThreadInfo->pTermThreadEvent = pThreadEvent;<Br> pThreadInfo->strPathName = szCmdLine;<Br></Br> AfxBeginThread(LaunchAndWait, pThreadInfo);<Br> WaitForSingleObject(pThreadEvent->m_hObject, INFINITE);<Br> return TRUE;<Br> }<Br> return FALSE;<Br>}<Br></Br>LaunchAndWait()<Br>UINT LaunchAndWait(LPVOID pParam)<Br>{<Br> LPTHREADINFO pThreadInfo = (LPTHREADINFO) pParam;<Br> PROCESS_INFORMATION stProcessInfo;<Br> if(LaunchApplication(pThreadInfo->strPathName, &stProcessInfo))<Br> {<Br> HANDLE hThreads[2];<Br> hThreads[0] = pThreadInfo->pTermThreadEvent->m_hObject;<Br> hThreads[1] = stProcessInfo.hProcess;<Br> DWORD dwIndex = WaitForMultipleObjects(2, hThreads, FALSE, INFINITE);<Br> CloseHandle(stProcessInfo.hThread);<Br> CloseHandle(stProcessInfo.hProcess);<Br> pThreadInfo->pTermThreadEvent->SetEvent();<Br> if(pThreadInfo)<Br> delete pThreadInfo;<Br> }<Br> else<Br> pThreadInfo->pTermThreadEvent->SetEvent();<Br> return 0;<Br>}<Br></Br></Br>LaunchApplication()<Br>BOOL LaunchApplication(LPCTSTR pCmdLine, PROCESS_INFORMATION *pProcessInfo)<Br>{<Br> STARTUPINFO stStartUpInfo;<Br></Br> memset(&stStartUpInfo, 0, sizeof(STARTUPINFO));<Br></Br> stStartUpInfo.cb = sizeof(STARTUPINFO);<Br></Br> stStartUpInfo.dwFlags = STARTF_USESHOWWINDOW;<Br> stStartUpInfo.wShowWindow = SW_SHOWDEFAULT;<Br></Br> return CreateProcess(NULL, (LPTSTR)pCmdLine, NULL, NULL, FALSE,<Br> NORMAL_PRIORITY_CLASS, NULL,<Br> NULL, &stStartUpInfo, pProcessInfo);<Br>}<Br></Br></p></td></tr><tr><td><font color="0000FF"><a name="16">CRuntimeClass的应用</a></font></td></tr><tr><td><p></Br>闻怡洋<Br></Br>CRuntimeClass在MFC中的作用很重要,因为MFC利用它来进行类的动态确定,即是通过类变量来判定该变量是否为某一类的实例。由于指针的类型是可以转换的,所以时常会出现从A到B的转换导致错误。而在MFC的各种书籍中对CRuntimeClass的介绍是比较少的,在这里总结它的一些用法。<Br></Br>1、动态确定类<Br></Br>在MFC中CObject::IsKindOf( const CRuntimeClass* pClass ) 利用CRuntimeClass来进行判定,如果你生成的类是以CObject为基础的,你可以使用该成员函数来判定。下面举一个例子来加深了解。<Br></Br>class CAge:public CObject<Br>BOOL IsAge(CObject* pO)<Br>{<Br> return pO->IsKindOf( RUNTIME_CLASS( CAge ) );<Br>}<Br>BOOL IsAge2(CAge* pO)<Br>{<Br> return pO->IsKindOf( RUNTIME_CLASS( CAge ) );<Br>}<Br>void main(void)<Br>{<Br> CObject a;<Br> CAge b;<Br> IsAge(&a);//return FALSE<Br> IsAge(&b);//return TRUE<Br> IsAge2((CAge*)&a);//return FALSE,避免强制转换带来的错误<Br>}<Br>2、生成类<Br></Br>CObject CRuntimeClass::CreateObject(void)可以产生一个类变量。作用和new类似,但在某些特殊场合有独特的作用。下面举一个例子来加深了解。<Br></Br>假定有以下几个类定义<Br>class CWndA: public CWnd<Br>class CWndB: public CWnd<Br></Br>function1()<Br>{<Br> CRuntimeClass* pC=RUNTIME_CLASS( CWndA );<Br> CreateWnd(pC);<Br>}<Br></Br>CWnd* CreateWnd(CRuntimeClass* pClass)<Br>{<Br> return (CWnd*)pClass->CreateObject();<Br>}<Br>在上面例子中,CreateWnd返回的是CWnd* 其实它是一个CWndA*。你可以进行由父类到子类的强制转换而不必要担心出错。使用CRuntimeClass可以代替使用switch生产类实例的一些繁琐。(请好好想想它的用途,当你发现它的好处时,你一定会大吃一惊,M$使用宏来实现类的动态检测,如果谁有兴趣可以去看看MFC的源代码。)<Br></Br>注意:在类的定义中使用IMPLEMENT_DYNCREATE后方可生效。<Br></Br> <Br></p></td></tr></table><p align="center"><img src="/logo.gif" align="center"><a href="/co/index.htm">北京美达美科技有限公司</a> 版权所有: 1998-1999</a></p></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -