??xml version="1.0" encoding="utf-8" standalone="yes"?>99久久国产综合精品成人影院,久久99九九国产免费看小说,99久久精品费精品国产http://www.shnenglu.com/yishanhante/category/3726.htmlzh-cnFri, 23 May 2008 01:29:33 GMTFri, 23 May 2008 01:29:33 GMT60使用VC6.0实现H口的Q意分割[转]http://www.shnenglu.com/yishanhante/articles/20772.htmljayjayWed, 28 Mar 2007 07:20:00 GMThttp://www.shnenglu.com/yishanhante/articles/20772.htmlhttp://www.shnenglu.com/yishanhante/comments/20772.htmlhttp://www.shnenglu.com/yishanhante/articles/20772.html#Feedback0http://www.shnenglu.com/yishanhante/comments/commentRss/20772.htmlhttp://www.shnenglu.com/yishanhante/services/trackbacks/20772.html 一、关于CSplitterWndc?/b>
我们在用CuteFtp或者NetAnt{工L时候,一般都会被其复杂的界面所吸引Q在q些界面中窗口被分割q的区域Q真正做CH口的Q意分剌Ӏ?那么我们自己如何创徏cM的界面,也实现窗口的L的分割呢 Q在VC6.0中这需要用到CSplitterWndcRCSplitterWnd看上d是一U特D的框架H口Q每个窗口都被相同的或者不同的视图所填充。当H口被切分后用户可以使用鼠标Ud切分条来调整H口的相对尺寸。虽然VC6.0支持从AppWizard中创建分割窗口,但是自动加入的分割条L不能让我们满意,因此我们q是通过手工增加代码来熟悉这个类?
CSplitterWnd的构造函C要包括下面三个?

BOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,CCreateContext* pContext,DWORD dwStyle,UINT nID);
功能描述Q该函数用来创徏动态切分窗口?参数含义QpParentWnd 切分H口的父框架H口?nMaxRows,nMaxCols是创建的最大的列数和行数?sizeMin是窗格的现实大小?pContext 大多数情况下传给父窗口?nID是字H口的ID?
BOOL CreateStatic(CWnd* pParentWnd,int nRows,int nCols,DWORD dwStyle,UINT nID) 
功能描述Q用来创建切分窗口?参数含义同上?
BOOL CreateView (int row,int col,CruntimeClass* pViewClass,SIZE sizeinit,CcreateContext* pContext);
功能描述Qؓ静态切分的H口的网格填充视图。在视图于切分H口联系在一L时候必 d切分窗口创建好?
参数含义Q同上?br />从CSplitterWnd源程序可以看Z是使用动态创建Createq是使用静态创建CreateStaticQ在函数中都调用了一个保护函数CreateCommonQ从下面的CreateCommon函数中的关键代码可以看出创徏CSplitterWnd的实质是创徏了一pd的MDI子窗口?
DWORD dwCreateStyle = dwStyle & ~(WS_HSCROLL|WS_VSCROLL);
if (afxData.bWin4) 
       dwCreateStyle &= ~WS_BORDER; //create with the same wnd-class as MDI-Frame (no erase bkgnd) 
if (!CreateEx(0, _afxWndMDIFrame, NULL, dwCreateStyle, 
          0, 0, 0, 0,pParentWnd->m_hWnd, (HMENU)nID, NULL)) 
       return FALSE; // create invisible 
          

二、创建嵌套分割窗?/b>
2.1创徏动态分割窗?/b>
动态分割窗口用CreateҎ。下面的代码创?x2的窗根{?
m_wndSplitter.Create(this,2,2,CSize(100,100),pContext);

但是动态创建的分割H口的窗格数目不能超q?x2Q而且对于所有的H格Q都必须׃n同一个视图,所受的限制也比较多Q因此我们不动态创Z为重炏V我们的主要_֊攑֜静态分割窗口的创徏上?
2.2创徏静态分割窗?/b>
与动态创建相比,静态创建的代码要简单许多,而且可以最多创?6x16的窗根{不同的H格我们可以使用CreateView填充不同的视图?
在这里我们将创徏CuteFtp的窗口分剌ӀCuteFtp的分割情况如下:
CCuteFTPView
CView2
CView3
CView4

创徏步骤Q?
?在创Z前我们必d用AppWizard生成单文CuteFTPQ生成的视类?CCuteFTPView.同时在增加三个视cL者从视类l承而来的派生类CView2,CView3 CView4.
?增加成员Q?/b>
在Cmainfrm.h中我们将增加下面的代码:

CSplitterWnd wndSplitter1;
                  CSplitterWnd wndSplitter2;
?重蝲CMainFrame::OnCreateClient()函数Q?/b>
BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT  /*lpcs*/, CCreateContext* pContext) 
{ //创徏一个静态分栏窗口,分ؓ三行一?
     if(m_wndSplitter1.CreateStatic(this,3,1)==NULL) 
              return FALSE;
  //CCuteFTPViewq接??列窗g
     m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CCuteFTPView),CSize(100,100), pContext); 
     m_wndSplitter1.CreateView(2,0,RUNTIME_CLASS(CView4),CSize(100,100),pContext); 
  //CView4q接???
     if(m_wndSplitter2.CreateStatic(&m_wndSplitter,1,2,WS_CHILD|WS_VISIBLE, 
          m_wndSplitter.IdFromRowCol(1, 0))==NULL) 
               return FALSE; //第1?列再分开1??
  //CView2c连接到W二个分栏对象的0??
          m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CView2),CSize(400,300),pContext); 
  //CView3c连接到W二个分栏对象的0??
          m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CView3),CSize(400,300),pContext); 
               return TRUE; 
} 
2.3实现各个分割区域的通信
?b>有文相q的视图之间的通信
由AppWizard生成的CCuteFTPView是与文相连的,同时我们也让CView2与文相q,因此我们需要修改CCuteFTPApp的InitInstance()函数Q我们将增加下面的部分?br />
AddDocTemplate (new CMultiDocTemplate(IDR_VIEW2TYPE, 
          
          RUNTIME_CLASS(CMainDoc), 
          RUNTIME_CLASS(CMDIChildWnd), 
          RUNTIME_CLASS(CView2))); 
我们现在来实现CCuteFTPView与CView2之间的通信。由于跟文档cȝq的视图c?是不能安全的与除文档cM外的其余的视囄通信的。因此我们只能让他们都与文 c通信。在文中我们设|相应的指针以用来获的各个视图。我们重?CCuteFTPView::OnOpenDocument()函数Q?
CCuteFTPView* pCuteFTPView;
CView2* pView2; POSITION pos; CView* pView; while(pos!=NULL) { pView=GetNextView(pos); if(pView->IsKindOf(RUNTIME_CLASS(CCuteFTPView))==NULL) pCuteFTPView=(CCuteFTPView*)pView; else(pView->IsKindOf(RUNTIME_CLASS(CCuteFTPView))==NULL) pView2=(CView2*)pView; }
q样我们在文类中就L了跟它相q的所有的视图的指针?br />如果需要在 CCuteFTPView中调用CView2中的一个方法DoIt()则代码如下:
CCuteFTPDoc* pDoc=GetDocument();
CView2* pView2=pDoc->pView3;
pView3.DoIt();

?b>无文档视图与文档兌视图之间的通信
CView3和CView4都是不与文相关联的。我们现在实现CView3与CView2的通信.正如前面所_CView2只能安全的与CCuteFTPDoc通信Q因此,CView3如果需要跟CView2通信Q也必须借助于文档类。因此程序的关键是如何在CView3中获得文的指针。视囄中没有这LcL员可以用来直接访问文类。但是我们知道在ȝ口类MainFrame中我们可以获得程序的LH口cȝ指针。因此我们只要获得程序主H口了的指针Q就可以解决问题了。代码实现在CView3中访问CView2中的DoIt()Ҏ?br />
CView3中的代码如下Q?
CMainFrame* MainFrame=(CMainFrame*)this->GetParent()->GetParent(); 
          
          CCuteFTPDoc* Doc=(CCuteFTPDoc*)MainFrame->GetActiveDocument();
          if(Doc!=NULL) Doc->DoIt(); 
          
          CCuteFTPDoc中的相应的处理函数DoIt()代码如下Q?
          
          CView2* pView2; 
          POSITION pos; 
          CView* pView; 
          while(pos!=NULL) 
          { 
                  pView=GetNextView(pos);
                  if(pView->IsKindOf(RUNTIME_CLASS(CView2))==NULL) 
                  pView2=(CView2*)pView; 
          } 
          pView2->DoIt(); 
?b>无文档关联视图之间的通信
CView3和CView4都是不跟文相连的,如何实现他们之间的通信呢?正如我们在上面所说的那样Q由于在L架中我们可以讉KL的视图,因此我们的主要Q 务还是在E序中获得主框架的指针。在CView3中访问CView4中的ҎDoIt()?
CMainFrame* MainFrame=(CMainFrame*)this->GetParent()->GetParent(); 
          
          CView4* View4=(CView4*)MainFrame->m_wndSplitter1.GetPane(2,0); 
          View4->DoIt(); 

到现在我们已l实CCuteFTP的主H口的框架ƈ且能够实C们之间相互通信的框架?同样的我们可以实现其他的一些流行界面例如NetAntsQFoxmail的分剌Ӏ?

三、关于对话框的分?/b>
到目前ؓ止,只有Z文/视图的程序才能用CSplitterWndQ而基于对话框的应用程序却不支持CSplitterWnd,但是如果我们在承类中重载一些虚拟方法,也能使CSplitterWnd 在对话框E序中用。从MFC的源E序WinSplit.cpp中可以看出,Z获得父窗口的地方E序都调用了虚拟ҎGetParentFrame(),因此如果在对话框中用,我们必须它改ؓGetParent();因此我们CSplitterWnd的下面几个方法重载?br />
virtual void StartTracking(int ht); 
virtual CWnd* GetActivePane(int* pRow = NULL, int* pCol  = NULL); 
virtual void SetActivePane( int row, int col, CWnd* pWnd  = NULL ); 
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam); 
virtual BOOL OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult ); 
virtual BOOL OnWndMsg( UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult ); 
具体实现如下Q实C我将l出原有代码的主要部分以及修改后的代码以作对比?br />在cpp文g中加入下面的枚Dcd?
enum HitTestValue 
{ 
                  noHit = 0,//表示没有选中M对象
                  vSplitterBox = 1,
                  hSplitterBox = 2,
                  bothSplitterBox = 3,
                  vSplitterBar1 = 101,//代表各个方向的水q_割条
                  vSplitterBar15 = 115,
                  hSplitterBar1 = 201,//代表垂直方向的各个分割条
                  hSplitterBar15 = 215,
                  splitterIntersection1 = 301,//代表各个交叉?
                  splitterIntersection225 = 525
};
          
CWnd* CxSplitterWnd::GetActivePane(int* pRow, int* pCol) { ASSERT_VALID(this); //获得当前的获得焦点的H口 //下面注释_体的是原有的代码的主要部分? // CWnd* pView = NULL; //CFrameWnd* pFrameWnd = GetParentFrame(); //ASSERT_VALID(pFrameWnd); //pView = pFrameWnd->GetActiveView(); //if (pView == NULL) // pView = GetFocus(); CWnd* pView = GetFocus(); if (pView != NULL && !IsChildPane(pView, pRow, pCol)) pView = NULL; return pView; } void CxSplitterWnd::SetActivePane( int row, int col, CWnd* pWnd) { CWnd* pPane = pWnd == NULL ? GetPane(row, col) : pWnd; //下面加注释粗体的是原有代码的主要部分? //FrameWnd* pFrameWnd = GetParentFrame(); //ASSERT_VALID(pFrameWnd); //pFrameWnd->SetActiveView((CView*)pPane); pPane->SetFocus();//修改后的语句 } void CxSplitterWnd::StartTracking(int ht) { ASSERT_VALID(this); if (ht == noHit) return; // GetHitRect will restrict ''''m_rectLimit'''' as appropriate GetInsideRect(m_rectLimit); if (ht >= splitterIntersection1 && ht <= splitterIntersection225) { // split two directions (two tracking rectangles) int row = (ht - splitterIntersection1) / 15; int col = (ht - splitterIntersection1) % 15; GetHitRect(row + vSplitterBar1, m_rectTracker); int yTrackOffset = m_ptTrackOffset.y; m_bTracking2 = TRUE; GetHitRect(col + hSplitterBar1, m_rectTracker2); m_ptTrackOffset.y = yTrackOffset; } else if (ht == bothSplitterBox) { // hit on splitter boxes (for keyboard) GetHitRect(vSplitterBox, m_rectTracker); int yTrackOffset = m_ptTrackOffset.y; m_bTracking2 = TRUE; GetHitRect(hSplitterBox, m_rectTracker2); m_ptTrackOffset.y = yTrackOffset; // center it m_rectTracker.OffsetRect(0, m_rectLimit.Height()/2); m_rectTracker2.OffsetRect(m_rectLimit.Width()/2, 0); } else { // only hit one bar GetHitRect(ht, m_rectTracker); } //下面加注释的从E序中删厅R? //CView* pView = (CView*)GetActivePane(); //if (pView != NULL && pView->IsKindOf(RUNTIME_CLASS(CView))) //{ // ASSERT_VALID(pView); // CFrameWnd* pFrameWnd = GetParentFrame(); //ASSERT_VALID(pFrameWnd); //pView->OnActivateFrame(WA_INACTIVE, pFrameWnd); // } // steal focus and capture SetCapture(); SetFocus(); // make sure no updates are pending RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_UPDATENOW); // set tracking state and appropriate cursor m_bTracking = TRUE; OnInvertTracker(m_rectTracker); if (m_bTracking2) OnInvertTracker(m_rectTracker2); m_htTrack = ht; SetSplitCursor(ht); } BOOL CxSplitterWnd::OnCommand(WPARAM wParam, LPARAM lParam) { if (CWnd::OnCommand(wParam, lParam)) return TRUE; //下面_体的是原程序的语句 //return GetParentFrame()->SendMessage(WM_COMMAND, wParam, lParam); return GetParent()->SendMessage(WM_COMMAND, wParam, lParam); } BOOL CxSplitterWnd::OnNotify( WPARAM wParam, LPARAM lParam, LRESULT* pResult ) { if (CWnd::OnNotify(wParam, lParam, pResult)) return TRUE; //下面_体的是源程序的语句 //*pResult = GetParentFrame()->SendMessage(WM_NOTIFY, wParam, lParam); *pResult = GetParent()->SendMessage(WM_NOTIFY, wParam, lParam); return TRUE; } BOOL CxSplitterWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult) { // The code line below is necessary if using CxSplitterWnd in a regular dll // AFX_MANAGE_STATE(AfxGetStaticModuleState()); return CWnd::OnWndMsg(message, wParam, lParam, pResult); }
q样我们可以在对话框中使用CxSplitterWndcM?

四、CSplitterWnd的扩?/b>
CSplitterWnd扩展话题是很多的Q我们可以通过对原有方法的覆盖或者增加新的方法来扩展CSplitterWnd。我们在此仅举两个方面的例子?
4.1锁定切分?/b>
当用户创建好分割H口后,有时q不希望通过拖动切分条来调节H口的大。这时就必须锁定切分条。锁定切分条的最单的Ҏ莫过于不让CSplitterWnd来处理WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_SETCURSOR消息Q而是这些消息交lCWndH口q行处理Q从而屏蔽掉q些消息。拿WM_LBUTTONDOWN处理q程来说。修改ؓ如下Q?
void CXXSplitterWnd::OnLButtonDown(UINT nFlags,CPoint point) 
{ CWnd::OnLButtonDown(nFlags,point); }
其余的处理方法类伹{?
4.2切分条的定制
由Window自己生成的切分条L固定的,没有M的变化,我们在用一些Y件比如ACDSee的时候却能发现它们的切分条却是和自动生成的切分条不一L。那么如何定制自q切分条呢Q通过重蝲CSplitterWnd的虚ҎOnDrawSplitter和OnInvertTracker可以辑ֈq样的目的。下面的代码生成的效果是分割H口的边界颜色ؓU色Q分割条的颜色ؓl色.代码如下Q?br />
void CSplitterWndEx::OnDrawSplitter(CDC *pDC, ESplitType nType, const CRect &rectArg)
{
                  if(pDC==NULL) 
                  { 
                  RedrawWindow(rectArg,NULL,RDW_INVALIDATE|RDW_NOCHILDREN);
                  return;
                  } 
                  ASSERT_VALID(pDC);
                  CRect rc=rectArg;
                  switch(nType) 
                  { 
                  case splitBorder:
                  //重画分割H口边界,使之为红?
                          pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));
                          rc.InflateRect(-CX_BORDER,-CY_BORDER); 
                          pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0)); 
          
                          return; 
                  case splitBox:
                          pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
                          rc.InflateRect(-CX_BORDER,-CY_BORDER); 
                          pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
                          rc.InflateRect(-CX_BORDER,-CY_BORDER);
                          pDC->FillSolidRect(rc,RGB(0,0,0)); 
                          pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
                          return; 
                  case splitBar: 
                  //重画分割条,使之为绿?
                          pDC->FillSolidRect(rc,RGB(255,255,255));
                          rc.InflateRect(-5,-5); 
                          pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0)); 
          
                          return; 
                  default: 
                          ASSERT(FALSE); 
                  } 
                  pDC->FillSolidRect(rc,RGB(0,0,255));
} 
void CSplitterWndEx::OnInvertTracker(CRect &rect) 
{ 
                  ASSERT_VALID(this);
                  ASSERT(!rect.IsRectEmpty()); 
                  ASSERT((GetStyle()&WS_CLIPCHILDREN)==0);
                  CRect rc=rect; 
                  rc.InflateRect(2,2);
                  CDC* pDC=GetDC(); 
                  CBrush* pBrush=CDC::GetHalftoneBrush();
                  HBRUSH hOldBrush=NULL;
                  if(pBrush!=NULL) hOldBrush=(HBRUSH)SelectObject(pDC->m_hDC,pBrush->m_hObject);
                  pDC->PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),BLACKNESS); 
          
                  if(hOldBrush!=NULL) 
                  SelectObject(pDC->m_hDC,hOldBrush);
                  ReleaseDC(pDC); 
} 


jay 2007-03-28 15:20 发表评论
]]>
visual C++ 6.0开发工具与调试http://www.shnenglu.com/yishanhante/articles/18923.htmljayjayFri, 23 Feb 2007 07:13:00 GMThttp://www.shnenglu.com/yishanhante/articles/18923.htmlhttp://www.shnenglu.com/yishanhante/comments/18923.htmlhttp://www.shnenglu.com/yishanhante/articles/18923.html#Feedback0http://www.shnenglu.com/yishanhante/comments/commentRss/18923.htmlhttp://www.shnenglu.com/yishanhante/services/trackbacks/18923.html阅读全文

jay 2007-02-23 15:13 发表评论
]]>
VC中用于调试程序的?/title><link>http://www.shnenglu.com/yishanhante/articles/18922.html</link><dc:creator>jay</dc:creator><author>jay</author><pubDate>Fri, 23 Feb 2007 06:57:00 GMT</pubDate><guid>http://www.shnenglu.com/yishanhante/articles/18922.html</guid><wfw:comment>http://www.shnenglu.com/yishanhante/comments/18922.html</wfw:comment><comments>http://www.shnenglu.com/yishanhante/articles/18922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yishanhante/comments/commentRss/18922.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yishanhante/services/trackbacks/18922.html</trackback:ping><description><![CDATA[ <p style="LINE-HEIGHT: 12pt"> <strong> <span style="COLOR: red"> <font size="1"> <font face="Georgia">ASSERT()</font> </font> </span> </strong> </p> <p style="LINE-HEIGHT: 12pt"> <strong> <span style="COLOR: red"> </span> </strong> <font size="1"> <font face="Georgia">     ASSERT()被测试它的参敎ͼ若参Cؓ<span>0Q则中断执行q打CD说明消息。在 Release 版本的程序中它不起Q何作用。ASSERT()使用的时候必M证参数表辑ּ中不能有函数调用Q译者注QASSERT()宏在 Release 版本中不对表辑ּ求|Q因此对于Q何有函数调用的参数表辑ּQ应该用宏 VERIFY()Q以保证表达式中的函数调用在 Release 版本中会被正求倹{?/span></font> </font> </p> <p style="LINE-HEIGHT: 12pt"> <font size="1"> <font face="Georgia">断言<span>(assertion)用带断言信息(E序, 模块, assertion?的对话框执行. 对话框有3个按? "Break", "Repeat" ("Debug"), and "Continue" ("Ignore"). "Break" l束E序, "Continue" 忽略断言, 最有用的是"Repeat"按钮. 按下它在断言的地Ҏ开源代码编辑器. 在这里你可以试所有的变量值ƈ明白哪里Z问题?/span></font> </font> </p> <p style="LINE-HEIGHT: 12pt"> <span style="FONT-SIZE: 9pt"> <font size="1"> <font face="Georgia">例如QASSERT(pPointer);ASSERT(n>0 && n<100);ASSERT(0);</font> </font> </span> </p> <p style="LINE-HEIGHT: 12pt" align="left"> <font size="1"> <font face="Georgia">ASSERT在执行简单验证时很有用,但对?span>C++对象Q特别是由CObjectz的对象,则有更好的方法ASSERT_VALID来实现类似操作。作Z般规则,我们应在开始用每一个对象之前检查数据讹?</span></font> </font> </p> <p style="LINE-HEIGHT: 12pt" align="left"> <span> <font face="Georgia" size="1"> </font> </span> </p> <p style="LINE-HEIGHT: 12pt" align="left"> <span> <font size="1"> <font face="Georgia"> <strong>ASSERT_VALID</strong>宏得对CObject的派生类实现该操作非常简单?/font> </font> </span> </p> <p style="LINE-HEIGHT: 12pt"> <span style="FONT-SIZE: 9pt"> <font size="1"> <font face="Georgia">例如QASSERT_VALID(this);ASSERT_VALID(pView);</font> </font> </span> </p> <p style="LINE-HEIGHT: 12pt"> <span style="FONT-SIZE: 9pt"> <font face="Georgia" size="1"> </font> </span> </p> <p style="LINE-HEIGHT: 12pt" align="left"> <span style="COLOR: red"> <strong> <font size="1"> <font face="Georgia">VERIFY()</font> </font> </strong> </span> </p> <p style="LINE-HEIGHT: 12pt" align="left"> <span style="COLOR: red"> </span> <font face="Georgia"> <font size="1">    VERIFY()?span> ASSERT()很相|区别在于?Release 版本中它仍然有效Q译者注Q原作者在q里没有讲清楚,VERIFY()不会打印说明Q只是会对参数表辑ּ求|?</span></font> </font> </p> <p style="LINE-HEIGHT: 12pt" align="left"> <span> <font face="Georgia" size="1"> </font> </span> </p> <p style="LINE-HEIGHT: 12pt"> <span style="COLOR: red"> <strong> <font size="1"> <font face="Georgia">TRACE()</font> </font> </strong> </span> </p> <p style="LINE-HEIGHT: 12pt"> <span style="COLOR: red"> </span> <font size="1"> <font face="Georgia"> <font color="#ff0000"> <strong> </strong> </font>    TRACE()基本上就是函?<span>printf()</span>的一个复制品Q唯一的区别是它把l果输出到调试窗口。在 Release 版本中,它也是无效的。一般是用TRACE0(),TRACE1(),TRACE2()…而不用TRACE()?/font> </font> </p> <p style="LINE-HEIGHT: 12pt"> <font size="1"> <font face="Georgia"> 这三个宏在<span> Release 版本中都不会产生M实质性的影响Q它们是否v作用取决于是否定义了预定义了?_DEBUG。这是对 Microsoft Visual C++ 而言Q在其它的编译器中可能其它不同的宏?/span></font> </font> </p> <p style="LINE-HEIGHT: 12pt"> <span> <font face="Georgia" size="1"> </font> </span> </p> <p style="LINE-HEIGHT: 12pt"> <strong> <font size="1"> <font face="Georgia">常用用法Q?/font> </font> </strong> </p> <p style="LINE-HEIGHT: 12pt"> <strong> <font face="Georgia" size="1"> </font> </strong> </p> <p style="LINE-HEIGHT: 12pt"> <font size="1"> <font face="Georgia">Z控制传进的指?</font> </font> </p> <p> <font size="1"> <font face="Georgia">void SomeFun(SomeType* pPointer)</font> </font> </p> <p> <font size="1"> <font face="Georgia">{</font> </font> </p> <p style="LINE-HEIGHT: 12pt"> <span style="FONT-SIZE: 9pt"> <font size="1"> <font face="Georgia"> <strong> ASSERT(pPointer);</strong></font> </font> </span> </p> <p> <font size="1"> <font face="Georgia"> //some instructions.</font> </font> </p> <p> <font size="1"> <font face="Georgia">}</font> </font> </p> <p> <font face="Georgia" size="1"> </font> </p> <p style="LINE-HEIGHT: 12pt"> <font size="1"> <font face="Georgia">你可以在"switch" ?"if"操作中捕获奇怪的?br />例如:</font> </font> </p> <p style="LINE-HEIGHT: 12pt"> <font size="1"> <font face="Georgia">switch(nRGBColors){<br />  case nRed:   {//some instructions.} break;<br />  case nGreen: {//some instructions.} break;<br />  case nBlue:  {//some instructions.} break;<br />  <strong>default: ASSERT(0);</strong>    // we should have never come here!<br />}</font> </font> </p> <p style="LINE-HEIGHT: 12pt"> <font size="1"> <font face="Georgia">if(nWaterTemp >=0 && nWaterTemp < 50){<br />  //some instructions.<br />}<br />else if(nWaterTemp >= 50 && nWaterTemp <= 100){<br />  //some instructions.<br />}<br />else{<br />  <strong>ASSERT(0); </strong>   // we should have never come here!<br />}</font> </font> </p> <p style="LINE-HEIGHT: 12pt"> <font face="Georgia" size="1"> </font> </p> <p style="LINE-HEIGHT: 12pt"> <font size="1"> <font face="Georgia">对值的断言: <br />ASSERT(nSomeValue >= MinValue and nSomeValue <= MaxValue);<br />ASSERT(nOtherValue != 0);</font> </font> </p> <p style="LINE-HEIGHT: 12pt"> <strong> <font face="Georgia" size="1"> </font> </strong> </p> <p style="LINE-HEIGHT: 12pt"> <font size="1"> <font face="Georgia"> <strong>可爱?ASSERT 错误</strong> <br />ASSERT( m_MyWnd.Create() );</font> </font> </p> <p style="LINE-HEIGHT: 12pt"> <font size="1"> <font face="Georgia">? q是一个可怕的错误! E序在调试版中正常工? 在发行版中不工作. C: q是一个在发行版中被U除的宏. 以这U方法你的窗口将永远不会被创? 如果你用 MFC, q样?</font> </font> </p> <p style="LINE-HEIGHT: 12pt"> <strong> <font size="1"> <font face="Georgia">VERIFY( m_MyWnd.Create() );</font> </font> </strong> </p> <p> <font face="Georgia"> <font size="1"> <span style="FONT-SIZE: 10.5pt">它在调试版中?/span> <span style="FONT-SIZE: 10.5pt">ASSERT</span> <span style="FONT-SIZE: 10.5pt">一样ƈ且在发行版中执行</span> <span style="FONT-SIZE: 10.5pt">m_MyWnd.Create()</span> <span style="FONT-SIZE: 10.5pt">?/span> </font> </font> </p> <img src ="http://www.shnenglu.com/yishanhante/aggbug/18922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yishanhante/" target="_blank">jay</a> 2007-02-23 14:57 <a href="http://www.shnenglu.com/yishanhante/articles/18922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.woai858.cn" target="_blank">þ</a>| <a href="http://www.jsshunfu.com.cn" target="_blank">ŷ龫Ʒþþþ</a>| <a href="http://www.uyns.cn" target="_blank">þþþþþþ66ƷƬ</a>| <a href="http://www.csrencaiwd.cn" target="_blank">þ996ȾƷxxxx</a>| <a href="http://www.hzks666.cn" target="_blank"> þۺϾɫۺϾ99</a>| <a href="http://www.4o2ptp.cn" target="_blank">þþþavӰ</a>| <a href="http://www.qianzifu.net.cn" target="_blank">LƷþ</a>| <a href="http://www.u33g.cn" target="_blank">ŷսþþþþþ</a>| <a href="http://www.9bexgq.cn" target="_blank">þþþŷղAV </a>| <a href="http://www.fundmm.cn" target="_blank">Ůaaaþþü</a>| <a href="http://www.g753.cn" target="_blank">þþþþþþþþѾƷ</a>| <a href="http://www.meloful.cn" target="_blank">þٸ۲AV</a>| <a href="http://www.zheibvgsz.cn" target="_blank">þþþþúݺݶ</a>| <a href="http://www.woman365.cn" target="_blank">ۺϾþþƷ</a>| <a href="http://www.ekgb.cn" target="_blank">޹Ʒþþþ</a>| <a href="http://www.wwmw.com.cn" target="_blank">˾þô߽ۺ</a>| <a href="http://www.cqzmz.cn" target="_blank">þݹƷһ</a>| <a href="http://www.1118.org.cn" target="_blank">þþƷþһ</a>| <a href="http://www.u24373.cn" target="_blank">99þþù</a>| <a href="http://www.3828888.cn" target="_blank">Ļþ2020</a>| <a href="http://www.ampul.cn" target="_blank">þþƷѹƬС</a>| <a href="http://www.686t5w.cn" target="_blank">ŷ츾BBBþþ</a>| <a href="http://www.ki71.cn" target="_blank">99þѹƷػ</a>| <a href="http://www.ccka.cn" target="_blank">ŷ龫Ʒþþþþþþžž</a>| <a href="http://www.vyfx.cn" target="_blank">þۺϸϾþúݺݺ97ɫ </a>| <a href="http://www.vedz.cn" target="_blank">þþþþaŷa</a>| <a href="http://www.z-yh.cn" target="_blank">˾þô߽AVɫɫ </a>| <a href="http://www.ccka.cn" target="_blank">þþƷһapp</a>| <a href="http://www.anfubbs.cn" target="_blank">þ99һ</a>| <a href="http://www.tjppfdm.cn" target="_blank">ŷ츾XXXXԾþþ</a>| <a href="http://www.ywpc88.cn" target="_blank">ٸþĻ</a>| <a href="http://www.zgyuantong.com.cn" target="_blank">޹þþþþþ</a>| <a href="http://www.sgcx.net.cn" target="_blank">þùƷӰԺ</a>| <a href="http://www.gd44.cn" target="_blank">޾ƷþþþþĻ</a>| <a href="http://www.pass3d.cn" target="_blank">þþþùɫAVѹۿ</a>| <a href="http://www.adu123.cn" target="_blank">þùVһë</a>| <a href="http://www.td265.cn" target="_blank">þþƷƵ</a>| <a href="http://www.haowan.ac.cn" target="_blank">ŷƷרþ</a>| <a href="http://www.gfwi.cn" target="_blank">þɫۺһ</a>| <a href="http://www.xcfsfl.cn" target="_blank">ɫۺϾþ </a>| <a href="http://www.gkxee.cn" target="_blank">ٸþĻ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>