??xml version="1.0" encoding="utf-8" standalone="yes"?>中文字幕亚洲综合久久菠萝蜜,精品久久综合1区2区3区激情,国产69精品久久久久9999APGF http://www.shnenglu.com/huxiaofeng/zh-cnFri, 09 May 2025 03:48:53 GMTFri, 09 May 2025 03:48:53 GMT60CDCcd象的行ؓ(f)函数http://www.shnenglu.com/huxiaofeng/archive/2010/03/29/110922.html?/dc:creator>?/author>Mon, 29 Mar 2010 14:15:00 GMThttp://www.shnenglu.com/huxiaofeng/archive/2010/03/29/110922.htmlhttp://www.shnenglu.com/huxiaofeng/comments/110922.htmlhttp://www.shnenglu.com/huxiaofeng/archive/2010/03/29/110922.html#Feedback1http://www.shnenglu.com/huxiaofeng/comments/commentRss/110922.htmlhttp://www.shnenglu.com/huxiaofeng/services/trackbacks/110922.html     SetPixel()Q用指定的颜色在指定的坐标画一个点Q返回gؓ(f)RGB颜色|
                        函数原型 COLORREF SetPixel( int x, int y, COLORREF crColor );
                                          COLORREF
SetPixel( POINT point, COLORREF crColor );
     MoveTo()Q移动当前位|到指定的坐标,q回gؓ(f)以前位置的坐标;
                        函数原型  CPoint MoveTo( int x, int y );
                                          
CPoint MoveTo( POINT point );
     LineTo()Q从当前位置到指定位|画一条直U,成功q回?Q?br>                        函数原型  BOOL LineTo( int x, int y ); 
                                          BOOL LineTo( POINT point );
     Polyline()Q从当前位置Q绘d条曲U,成功q回?Q?br>                        函数原型 BOOL Polyline( LPPOINT lpPoints, int nCount/*数目*/ );
     Rectangle()Q根据指定参数绘制一个矩形,成功q回?Q?br>                        函数原型  BOOL Rectangle( int x1, int y1, int x2, int y2 );
                                          B
OOL Rectangle( LPCRECT lpRect );
     Ellipse()Q?Ҏ(gu)指定的矩形绘制一个内切椭圆,成功q回?Q?br>                        函数原型 BOOL Ellipse( int x1, int y1, int x2, int y2 );
                                         
BOOL Ellipse( LPCRECT lpRect );
     DrawIcon()Q在指定位置M个图标,成功q回?Q?br>                        函数原型 BOOL DrawIcon( int x, int y, HICON hIcon );
                                          BOOL DrawIcon( POINT point, HICON hIcon );
(2)、有x(chng)本处理的常用函数Q?br>     TextOut()Q在函数参数指定的位|显C文本串?br>                        函数原型 virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount );
                                          BOOL TextOut( int x, int y, const CString& str );
     DrawText()Q在函数参数指定的矩形区域内昄文本丌Ӏ?br>                        函数原型 virtual int DrawText( LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat /*cd*/);
                                         
int DrawText( const CString& str, LPRECT lpRect, UINT nFormat );
     SetTextColor()Q设|显C文本的颜色Q返回当前文本RGB颜色|
                         函数原型 virtual COLORREF SetTextColor( COLORREF crColor );
    
GetTextColor()Q获得当前文本颜Ԍ 函数原型 COLORREF GetTextColor( ) const;
     SetBkColor()Q设|显C文本的背景颜色Q返回当前文本背景RGB颜色|
                         函数原型 virtual COLORREF SetBkColor( COLORREF crColor );
     GetBkColor()Q获得当前文本背景颜Ԍ 函数原型 COLORREF GetBkColor( ) const;
     SetBkMode()Q设|文本的背景模式Q返回当前背景模式|
                         函数原型 int SetBkMode( int nBkMode /*模式*/); TRANSPARENT透明Q?strong>OPAQUE 不透明  
     GetBkMode()Q获得当前文本背景模式; 函数原型 int GetBkMode( ) const;
    
SetTextAlign()Q设|显C文本的寚w方式Q成功返回非0Q?br>                          函数原型  UINT SetTextAlign( UINT nFlags );
     GetTextAlign()Q获得文本的寚w方式Q函数原?UINT GetTextAlign( ) const;

]]>
如何实现属性表?/title><link>http://www.shnenglu.com/huxiaofeng/archive/2010/01/21/106180.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Thu, 21 Jan 2010 11:46:00 GMT</pubDate><guid>http://www.shnenglu.com/huxiaofeng/archive/2010/01/21/106180.html</guid><wfw:comment>http://www.shnenglu.com/huxiaofeng/comments/106180.html</wfw:comment><comments>http://www.shnenglu.com/huxiaofeng/archive/2010/01/21/106180.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/huxiaofeng/comments/commentRss/106180.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/huxiaofeng/services/trackbacks/106180.html</trackback:ping><description><![CDATA[概述Q创Z个属性表单,首先创徏一个CPropertySheet对象Qؓ(f)每一个属性表单创Z个CPropertyPage对象Q在CPropertySheetcMQ在CPropertySheetcȝ构造函CdAddPage函数d每个属性页Q最后在菜单函数中调用DoModal函数来显CZ个静(rn)态属性表单。属性页<br>是被d属性表单的Q也是_(d)属性表单是属性页的父H口。因此,可以通过GetParent()函数获得属性页父窗口的指针Q即属性表单的<br>指针Q但要经q类型{?br>步骤Q?br>1、创Z个或多个属性页Q基cMؓ(f)CPropertyPage?br>class CPropSet1 : public CPropertyPage<br>{<br>// Dialog Data<br> //{{AFX_DATA(CPropSet1)<br>  enum { IDD = IDD_PROP_SET1 };<br>  int  m_MAXVALUEX2;<br>  int  m_MINVALUEX2;<br> //}}AFX_DATA<br>}<br>2、徏立CProp表单Q基cMؓ(f)CPropertySheet?br>CPropSheet::CPropSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)<br> :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)<br>{<br>   AddPage(&m_propSet1); //军_page序<br>   AddPage(&m_propSet2);<br>}<br>3、菜单函敎ͼ(x)<br>void CDataView::OnPropsheet() <br>{<br> // TODO: Add your command handler code here<br>   CPropSheet propSheet("参数讄"); //表单名称Q其他ؓ(f)~省变量<br> <br>   propSheet.m_propSet1.m_MAXVALUEX2=m_XValueMax;<br>   propSheet.m_propSet1.m_MINVALUEX2=m_XValueMin;<br> <br> if( IDOK==propSheet.DoModal())<br> {<br>    m_ChartCtrl1.EnableRefresh(false);<br>    m_XValueMax=propSheet.m_propSet1.m_MAXVALUEX2;<br>    m_XValueMin=propSheet.m_propSet1.m_MINVALUEX2;<br>    m_ChartCtrl1.GetBottomAxis()->SetMinMax(m_XValueMin,m_XValueMax);<br>    m_ChartCtrl1.EnableRefresh(true);<br> }<br>}<br>4、徏立向|(x)<br>首先在调用属性表单对象的DoModal函数之前Q调用SetWizardMode函数?br>    propSheet.SetWizardMode();<br>然后通过SetWizardButtons函数讄向导对话框上的按钮?br> ((CPropSheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT);<br> ((CPropSheet*)GetParent())->SetWizardButtons(PSWIZB_NEXT | PSWIZB_BACK);<br> ((CPropSheet*)GetParent())->SetWizardButtons(PSWIZB_BACK | PSWIZB_FINISH);<br><br>注意点:(x)需Ҏ(gu)字种cdcd? <img src ="http://www.shnenglu.com/huxiaofeng/aggbug/106180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/huxiaofeng/" target="_blank">?/a> 2010-01-21 19:46 <a href="http://www.shnenglu.com/huxiaofeng/archive/2010/01/21/106180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现单打印预览功?/title><link>http://www.shnenglu.com/huxiaofeng/archive/2009/12/31/104562.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Thu, 31 Dec 2009 07:26:00 GMT</pubDate><guid>http://www.shnenglu.com/huxiaofeng/archive/2009/12/31/104562.html</guid><wfw:comment>http://www.shnenglu.com/huxiaofeng/comments/104562.html</wfw:comment><comments>http://www.shnenglu.com/huxiaofeng/archive/2009/12/31/104562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/huxiaofeng/comments/commentRss/104562.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/huxiaofeng/services/trackbacks/104562.html</trackback:ping><description><![CDATA[<p>打印预览实现程Q?br>     首先调用CFormView::OnFilePrintPreviewQ再依次调用自己的所重写的虚函数OnPreparePrinting(CPrintInfo* pInfo)、OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)、OnPrint(CDC* pDC, CPrintInfo* pInfo)、CFormView::OnPrint(pDC, pInfo);Q当关闭打印预览时调用OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)  Q结束打印?br>部分代码Q?br>  ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)<br>  BOOL CElectronValveView::OnPreparePrinting(CPrintInfo* pInfo)<br>{<br> // default preparation<br>  pInfo->SetMinPage(1); //讄打印文g起始?nbsp;<br>  pInfo->SetMaxPage(1); //讄打印文gl止?br>  return   DoPreparePrinting(pInfo);<br>}  <br>void CElectronValveView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)<br>{<br> // TODO: add extra initialization before printing<br>  m_ChartCtrl.GetBottomAxis()->GetGrid()->SetColor(BlackColor);//讄栅格颜色为黑Ԍ不然打印的时候太?br>  m_ChartCtrl.GetLeftAxis()->GetGrid()->SetColor(BlackColor);<br>}<br>void CElectronValveView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)<br>{<br> // TODO: add cleanup after printing<br> m_ChartCtrl.GetBottomAxis()->GetGrid()->SetColor(BlueColor);//恢复颜色Q不然控件中也是q个颜色?jin)?br> m_ChartCtrl.GetLeftAxis()->GetGrid()->SetColor(BlueColor);<br>}<br>void CElectronValveView::OnPrint(CDC* pDC, CPrintInfo* pInfo)<br>{<br> // TODO: add customized printing code here<br> CMainFrame* pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd <br> CDC *pCurrentDC = GetDC();        // will have dimensions of the client area<br> CSize PaperPixelsPerInch(pDC->GetDeviceCaps(LOGPIXELSX), pDC->GetDeviceCaps(LOGPIXELSY));<br> //获得打印U设备每英寸的像素数Q应该是一L(fng)?br>    CSize ScreenPixelsPerInch(pCurrentDC->GetDeviceCaps(LOGPIXELSX), pCurrentDC->GetDeviceCaps(LOGPIXELSY));<br> //应该是获得屏q的每英寸的像素敎ͼ应该是一L(fng)<br> <br> CSize m_PaperSize,m_LogicalPageSize;<br> m_PaperSize = CSize(pDC->GetDeviceCaps(HORZRES), pDC->GetDeviceCaps(VERTRES));<br> //把纸张所得的像素对应的屏q大得到?br> m_LogicalPageSize.cx = ScreenPixelsPerInch.cx * m_PaperSize.cx / PaperPixelsPerInch.cx * 3 / 4;<br> m_LogicalPageSize.cy = ScreenPixelsPerInch.cy * m_PaperSize.cy / PaperPixelsPerInch.cy * 3 / 4;<br> <br> //q里必须q样设,是ؓ(f)?jin)和ChartCtrl中的打印对应h?br>    pDC->SetMapMode(MM_ANISOTROPIC);<br>    pDC->SetWindowExt(m_LogicalPageSize);<br>    pDC->SetViewportExt(m_PaperSize);    <br>    pDC->SetWindowOrg(0, 0);   <br> <br> CRect rcClient,rcClient1;<br> GetClientRect(&rcClient1); //得到的仍然是打印预览昄客户区的大小<br> rcClient=pInfo->m_rectDraw;//打印U的客户?br> double ratioX,ratioY;<br> ratioX=(double)rcClient.right/(double)rcClient1.Width();<br> ratioY=(double)rcClient.bottom/(double)rcClient1.Height();<br> int nWid,left,right;<br> CFont *pOldFont;<br> CFont fnBig,fnBig1;<br> CPen Pen,*OldPen;<br> <br> //M?br> Pen.CreatePen(PS_SOLID,2,RGB(0,0,0));<br> OldPen=pDC->SelectObject(&Pen);<br> pDC->Rectangle(20,20,m_LogicalPageSize.cx-20,m_LogicalPageSize.cy-20);<br> pDC->SelectObject(OldPen);</p> <p> //L题栏<br> pDC->MoveTo(20,60);<br> pDC->LineTo(m_LogicalPageSize.cx-20,60);<br> pDC->MoveTo(20,85);<br> pDC->LineTo(m_LogicalPageSize.cx-20,85);<br> pDC->SelectObject(&Pen);<br> pDC->MoveTo(20,110);<br> pDC->LineTo(m_LogicalPageSize.cx-20,110);<br> pDC->SelectObject(OldPen);<br> pDC->MoveTo(196,60); <br> pDC->LineTo(196,110);<br> pDC->MoveTo(390,60); <br> pDC->LineTo(390,110);</p> <p> //ȝ果栏<br> pDC->MoveTo(20,430); <br> pDC->LineTo(m_LogicalPageSize.cx-20,430);<br> pDC->MoveTo(85,430); <br> pDC->LineTo(85,470);//量l果1分界U竖U?br> pDC->MoveTo((m_LogicalPageSize.cx-85-100)/4+85,430);//开启响应时间分界线 <br> pDC->LineTo((m_LogicalPageSize.cx-85-100)/4+85,470);<br> pDC->MoveTo((m_LogicalPageSize.cx-85-100)/4*2+85,430); <br> pDC->LineTo((m_LogicalPageSize.cx-85-100)/4*2+85,470);<br> pDC->MoveTo((m_LogicalPageSize.cx-85-100)/4*3+85,430); <br> pDC->LineTo((m_LogicalPageSize.cx-85-100)/4*3+85,470);<br> pDC->MoveTo((m_LogicalPageSize.cx-85-100)/4*4+85,430); <br> pDC->LineTo((m_LogicalPageSize.cx-85-100)/4*4+85,470);<br> pDC->MoveTo(20,450); <br> pDC->LineTo(m_LogicalPageSize.cx-20,450);<br> pDC->SelectObject(&Pen);<br> pDC->MoveTo(20,470); <br> pDC->LineTo(m_LogicalPageSize.cx-20,470); <br> pDC->SelectObject(OldPen);</p> <p>  //写标?br> fnBig.CreatePointFont(200,"黑体",pDC);<br> pOldFont=pDC->SelectObject(&fnBig);<br> <br> nWid=rcClient1.Width();<br> left=rcClient1.left;<br> right=rcClient1.right;<br> pDC->SetTextAlign(TA_CENTER);<br> pDC->TextOut(m_LogicalPageSize.cx/2,30,"XXX性能试报告");<br> fnBig.DeleteObject();<br> fnBig.CreatePointFont(110,"?hu)?,pDC);<br> pOldFont=pDC->SelectObject(pOldFont);<br> pOldFont=pDC->SelectObject(&fnBig);<br> pDC->SetTextAlign(TA_LEFT);<br> pDC->TextOut(25,67,"产品名称Q?+pMain->m_strProductName);<br> pDC->TextOut(25,92,"产品囑֏Q?+pMain->m_strProductPictureNo);<br> pDC->TextOut(201,67,"(g)时_(d)(x)"+pMain->m_strMeasureTime0);<br> pDC->TextOut(201,92,"生厂家Q?+pMain->m_strProductFactory);<br> pDC->TextOut(395,67,"产品~号Q?+pMain->m_strProductBianHao);<br> pDC->TextOut(395,92,"(g) ?员:(x)"+pMain->m_strMeasurerName);</p> <p> CString aa;<br> aa.Format("%d(ms)",m_iPreviousTime1);<br> fnBig.DeleteObject();<br> fnBig.CreatePointFont(85,"?hu)?,pDC);<br> pDC->SelectObject(&fnBig);<br> pDC->TextOut(25,420,"预置?sh)信h_(d)(x)"+aa);<br> aa.Format("%d",m_iCurveNumber1);<br> pDC->TextOut(150,420,"曲线数量Q?+aa);<br> fnBig1.CreatePointFont(100,"?hu)?,pDC);<br> pOldFont=pDC->SelectObject(&fnBig1);<br> pDC->TextOut(25,455,"试l果"); <br> pDC->TextOut(90,435,"开启响应时?ms)");<br> pDC->TextOut(120,455,m_strOpenResponseTime);<br> pDC->TextOut((m_LogicalPageSize.cx-85-100)/4+85+5,435,"开启换向时?ms)");<br> pDC->TextOut((m_LogicalPageSize.cx-85-100)/4+85+5+30,455,m_strOpenInvertTime);<br> pDC->TextOut((m_LogicalPageSize.cx-85-100)/4*2+85+5,435,"关闭响应旉(ms)");<br> pDC->TextOut((m_LogicalPageSize.cx-85-100)/4*2+85+5+30,455,m_strCloseResponseTime);<br> pDC->TextOut((m_LogicalPageSize.cx-85-100)/4*3+85+5,435,"关闭换向旉(ms)");<br> pDC->TextOut((m_LogicalPageSize.cx-85-100)/4*3+85+5+30,455,m_strCloseInvertTime); <br> pDC->TextOut((m_LogicalPageSize.cx-85-100)/4*4+85+10,435,"(g)结?);<br> <br> //最后一?br> fnBig.DeleteObject();<br> fnBig.CreatePointFont(130,"?hu)?,pDC);<br> pDC->SelectObject(&fnBig);<br> pDC->TextOut(m_LogicalPageSize.cx-180,m_LogicalPageSize.cy-20-20,"审核Q?);<br> pDC->SetTextAlign(TA_LEFT);</p> <p> CPoint offset(16,110);<br> m_ChartCtrl.Print1(offset,pDC,pInfo,0);//调用chartcL画表格和曲线<br> fnBig.DeleteObject();</p> <p> CFormView::OnPrint(pDC, pInfo);<br>}<br>本程序利用ChartCtrl来实现绘制表格和曲线?/p> <img src ="http://www.shnenglu.com/huxiaofeng/aggbug/104562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/huxiaofeng/" target="_blank">?/a> 2009-12-31 15:26 <a href="http://www.shnenglu.com/huxiaofeng/archive/2009/12/31/104562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>q如何实现简单预?/title><link>http://www.shnenglu.com/huxiaofeng/archive/2009/12/30/104486.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Wed, 30 Dec 2009 13:03:00 GMT</pubDate><guid>http://www.shnenglu.com/huxiaofeng/archive/2009/12/30/104486.html</guid><wfw:comment>http://www.shnenglu.com/huxiaofeng/comments/104486.html</wfw:comment><comments>http://www.shnenglu.com/huxiaofeng/archive/2009/12/30/104486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/huxiaofeng/comments/commentRss/104486.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/huxiaofeng/services/trackbacks/104486.html</trackback:ping><description><![CDATA[<p>步骤1Q添加新cCDIBStaticQ类型ؓ(f)MFC ClassQ基cMؓ(f)CStatic?br>步骤2Q在工程中加入CPictureObj.h和CPictureObj.cppQ及(qing)CIstream.h和CIstream.cpp?br>步骤3Q在cCDIBStatic加入头文?include "PictureObj.h"Q添加变量CPictureObj* m_pPicObj;Q用于读取和昄。CPictureObj中封装了(jin)IPicture接口?br>步骤4Q新ZDialogQ加入控件pictureQ类型ؓ(f)MFC ClassQ基cMؓ(f)CfileDlg?br>部分代码Q?br>CDIBStatic源代码:(x)<br>OOL CDIBStatic::LoadDib(LPCTSTR lpszFileName)//d<br>{<br> try//利用try语句当文件第一ơ打开时lpszFileName?x)出错,在catch中捕获将其设|ؓ(f)NULL<br>lpszFileName = lpszFileName;<br>  // 保文g存在q能打开<br>  CFile file(lpszFileName, CFile::modeRead);<br>  file.Close();</p> <p>// 创徏囑փ昄的对象ƈd囑փ文g<br>  m_pPicObj = new CPictureObj;<br>  if(!m_pPicObj->Load(lpszFileName))<br>  {<br>   // d文gp|Q清除对?br>   m_pPicObj = NULL;<br>   delete m_pPicObj;<br>   // 清除昄的图像ƈ昄错误提示<br>   PaintDib(IsValidDib());<br>   return FALSE;<br>  }<br>  PaintDib(IsValidDib());<br>  return TRUE;<br> }<br> catch (CFileException* e)<br> {<br>  m_lpszFileName = NULL;<br>  PaintDib(IsValidDib());<br>  e->Delete();<br>  return FALSE;<br> }<br>}</p> <p>void CDIBStatic::PaintDib(BOOL bDibValid)//昄<br>{<br> ASSERT_VALID(this);<br> ClearDib(); // 清除以前的图?br>  <br> CRect PaintRect;<br> // 获得昄区域<br> GetClientRect(&PaintRect);    <br> PaintRect.InflateRect(-1, -1);<br> CClientDC dc(this);</p> <p> if (bDibValid && m_bPreview)<br> {<br>  CSize size = m_pPicObj->GetSize(&dc);<br>  int nDestX, nDestY, nDestWidth, nDestHeight;<br>  if ((DWORD)size.cx < (DWORD)PaintRect.Width() && (DWORD)size.cy < (DWORD)PaintRect.Height())<br>  { // 囑փ寸于昄区域图像显C在中间<br>   nDestX = PaintRect.left + (PaintRect.Width() - size.cx)/2;<br>   nDestY = PaintRect.top + (PaintRect.Height() - size.cy)/2;<br>   nDestWidth = size.cx;<br>   nDestHeight = size.cy;<br>  }<br>  else<br>  { // 囑փ寸大于昄区域Q进行比例羃?<br>   if ((PaintRect.Width()/(float)size.cx) <= (PaintRect.Height()/(float)size.cy))<br>   { // 宽度限制<br>    nDestWidth = PaintRect.Width();<br>    nDestHeight = (nDestWidth*size.cy) / size.cx;<br>    nDestX = PaintRect.left;<br>    nDestY = PaintRect.top + (PaintRect.Height() - nDestHeight) /2;<br>   }<br>   else<br>   { // 高度限制  <br>    nDestHeight = PaintRect.Height();<br>    nDestWidth = (nDestHeight*size.cx) / size.cy;<br>    nDestX = PaintRect.left + (PaintRect.Width() - nDestWidth) /2;<br>    nDestY = PaintRect.top;<br>   }<br>  }</p> <p>  // 获得囑փ的显CZ|和大小<br>  CRect RectDest(nDestX, nDestY, nDestX+nDestWidth, nDestY+nDestHeight);<br>  // 昄囑փ<br>  m_pPicObj->Draw(&dc,&RectDest,&RectDest);<br>  // l图像加一外框<br>  CBrush*  pOldBrush  = (CBrush*)dc.SelectStockObject(NULL_BRUSH);   <br>  dc.Rectangle(RectDest);<br>  if(NULL != pOldBrush)  { dc.SelectObject(pOldBrush);  }<br> }<br> else<br> {<br>  // 昄错误提示信息<br>  CString strText = "不能识别的文件格?";<br>  if( m_lpszFileName == NULL || strlen(m_lpszFileName) <= 0 )<br>  {<br>   strText = "没有选择文g!";<br>  }<br>  if( !m_bPreview )<br>  {<br>   strText = "";<br>  }<br>  dc.DrawText(strText, strText.GetLength(), &PaintRect, DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_END_ELLIPSIS);<br> }<br>  <br> return;<br>}</p> <p>HBRUSH CDIBSatic::CtlColor(CDC* pDC, UINT nCtlColor)//用于重绘 <br>{<br> // TODO: Change any attributes of the DC here<br> PaintDib(IsValidDib());<br> return (HBRUSH)GetStockObject(NULL_BRUSH);<br>}<br>BOOL IsValidDib() const { return (m_pPicObj && m_pPicObj->m_pPict); }<br>void CDIBSatic::ClearDib()//清除囄<br>{<br> ASSERT_VALID(this);<br> <br> CClientDC dc(this);<br> CRect rectPaint;<br>    <br> GetClientRect(&rectPaint);    <br> rectPaint.InflateRect(-1,-1);<br>     <br> CBrush* pBrushWhite; //白画?br> pBrushWhite = CBrush::FromHandle((HBRUSH)::GetStockObject(WHITE_BRUSH));<br>    <br> dc.FillRect(&rectPaint, pBrushWhite);<br>}<br>void RemoveDib() { m_lpszFileName = NULL; delete m_pPicObj; m_pPicObj = NULL; PaintDib(IsValidDib()); }<br> void SetPreview(BOOL bPreview) { m_bPreview = bPreview; PaintDib(IsValidDib()); }<br>CPreviewFileDlg源代码:(x)<br>BOOL CPreviewFileDlg::OnInitDialog() <br>{<br> CFileDialog::OnInitDialog();<br> m_DIBStaticCtrl.SubclassDlgItem(IDC_IMAGE, this);<br> CWnd* pParent = GetParent();<br> CRect rcParent;<br> pParent->GetClientRect(&rcParent);<br> CRect rcPrev;<br> GetDlgItem(IDC_PREVIEW)->GetClientRect(&rcPrev); //复选框<br> CRect rc;<br> m_DIBStaticCtrl.GetClientRect(&rc); <br> int height = rc.Height();<br> rc.top = rcPrev.bottom - 10;//囑փ框设|?br> rc.bottom = rc.top + height ;<br> rc.left = 50;<br> rc.right = rcParent.Width() - rc.left;<br> m_DIBStaticCtrl.MoveWindow(&rc, true);</p> <p> GetDlgItem(IDC_PREVIEW)->SendMessage(BM_SETCHECK, (m_bPreview) ? 1 : 0);<br> <br> return TRUE;  // return TRUE unless you set the focus to a control<br>               // EXCEPTION: OCX Property Pages should return FALSE<br>}<br>void CPreviewFileDlg::OnFileNameChange()<br>{<br> CFileDialog::OnFileNameChange();<br> if (m_bPreview)<br> {<br>  m_DIBStaticCtrl.SetPreview(m_bPreview);//昄囄<br>  m_DIBStaticCtrl.LoadDib(GetPathName()); //加蝲<br> }</p> <p>}//当点?yn)L件时调用<br>void CPreviewFileDlg::OnFolderChange()<br>{<br> CFileDialog::OnFolderChange();<br> m_DIBStaticCtrl.RemoveDib();//清除<br>}<br>菜单栏源代码Q?br>void CPreviewDlg::OnPreview() <br>{<br> // TODO: Add extra validation here<br>    static char BASED_CODE szFilter[] = "Bitmap(*.bmp)|*.bmp|JPEG(*.jpg)|*.jpg|GIF(*.gif)|*.gif|WMF(*.wmf)|*.wmf|ICON(*.ico)|*.ico||";<br> CString strDefName;</p> <p> char szPath[MAX_PATH];//最大目录大?br> <br>    CPreviewFileDlg FileDlg(TRUE,"*.*",NULL,<br>                        OFN_FILEMUSTEXIST|OFN_NONETWORKBUTTON|<br>                        OFN_PATHMUSTEXIST,szFilter);<br> FileDlg.m_ofn.lpstrInitialDir = szPath;<br>    if( FileDlg.DoModal() != IDOK )<br>  return;</p> <p>    // To get the selected file's path and name<br>    CString strFileName;<br>    strFileName = FileDlg.GetPathName();</p> <p>    if(strFileName.IsEmpty())<br>    {<br>  return;<br> }<br>}</p> <img src ="http://www.shnenglu.com/huxiaofeng/aggbug/104486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/huxiaofeng/" target="_blank">?/a> 2009-12-30 21:03 <a href="http://www.shnenglu.com/huxiaofeng/archive/2009/12/30/104486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谈malloc()和free()http://www.shnenglu.com/huxiaofeng/archive/2009/12/03/102452.html?/dc:creator>?/author>Thu, 03 Dec 2009 03:50:00 GMThttp://www.shnenglu.com/huxiaofeng/archive/2009/12/03/102452.htmlhttp://www.shnenglu.com/huxiaofeng/comments/102452.htmlhttp://www.shnenglu.com/huxiaofeng/archive/2009/12/03/102452.html#Feedback0http://www.shnenglu.com/huxiaofeng/comments/commentRss/102452.htmlhttp://www.shnenglu.com/huxiaofeng/services/trackbacks/102452.html一?/span>malloc()?/span>free()的基本概念以?qing)基本用法?x)

1、函数原型及(qing)说明Q?/span>

void *malloc(long NumBytes)Q?/span>

该函数分配了(jin)NumBytes个字节,q返回了(jin)指向q块内存的指针。如果分配失败,则返回一个空指针Q?/span>NULLQ?/span>

关于分配p|的原因,应该有多U,比如说空间不_是一U?/span>

void free(void *FirstByte)Q?/span>

该函数是之前用malloc分配的空间还l程序或者是操作pȝQ也是释放?jin)这块内存,让它重新得到自由?/span>

2、函数的用法Q?/span>

      其实q两个函数用h倒不是很难,也就?/span>malloc()之后觉得用够?jin)就甩?jin)它把它给free()?jin),举个单例子:(x)

E序代码Q?/span>

         // Code...

         float *YValue;

         YValue=(float *)malloc(DataNumberMax*sizeof(float));  //动态分配内?/strong>

         if (NULL == YValue)   exit (1);

         gets(YValue);

         // code...

         free(YValue);

         YValue= NULL;

         // code...

     是q样Q当?dng)具体情况要具体分析以及(qing)具体解冟뀂比如说Q你定义?jin)一个指针,在一个函数里甌?jin)一块内存然后通过函数q回传递给q个指针Q那么也?dng)R放这块内存这工作就应该留给其他函数?jin)?/span>

3、关于函C用需?strong>注意的一些地方:(x)

A、申请了(jin)内存I间后,必须(g)?/strong>是否分配成功?/span>

B、当不需要再使用甌的内存时Q记?strong>释放Q释攑֐应该把指向这块内存的指针指向NULLQ防止程序后面不心(j)使用?jin)它?/span>

C、这两个函数应该?strong>配对。如果申请后不释攑ְ是内存泄Ԍ如果无故释放那就是什么也没有做。释攑֏能一ơ,如果释放两次?qing)两ơ以上?x)出现错误Q释攄指针例外Q释攄指针其实也等于啥也没做,所以释攄指针释放多少ơ都没有问题Q?/span>

D、虽?/span>malloc()函数的类型是(void *),Mcd的指针都可以转换?/span>(void *),但是最好还是在前面q行强制cd转换Q因样可以躲q一些编译器的检查?br>

二?/span>malloc()到底从哪里得来了(jin)内存I间Q?/span>

 

1?/span> malloc()到底从哪里得C(jin)内存I间Q?/span> {案是从堆里面获得空间?/span>也就是说函数q回的指针是指向堆里面的一块内?/strong>。操作系l中有一个记录空闲内存地址的链表。当操作pȝ收到E序的申hQ就?x)遍历该链表Q然后就LW一个空间大于所甌I间的堆l点Q然后就该l点从空闲结炚w表中删除Qƈ该l点的空间分配给E序。就是这P

2?strong>什么是堆:(x)堆是大家共有的空_(d)分全局堆和局部堆?/strong>全局堆就是所有没有分配的I间Q局部堆是用户分配的空间。堆在操作系l对q程 初始化的时候分配,q行q程中也可以向系l要额外的堆Q但是记得用完了(jin)要还l操作系l,要不然就是内存泄漏?/span>

    什么是栈:(x)栈是U程独有的,保存其运行状态和局部自动变量的?/span>栈在U程开始的时候初始化Q每个线E的栈互相独立。每个函数都有自q栈,栈被用来在函C间传递参数?/strong>操作pȝ在切换线E的时候会(x)自动的切换栈Q就是切?/span>SS/ESP寄存器。栈I间不需要在高语言里面昑ּ的分配和释放?/span>

    通过上面Ҏ(gu)늚描述Q可以知道:(x)

    栈是q译器自动分配释放Q存攑և数的参数倹{局部变量的值等?/span>操作方式cM于数据结构中的栈?/span>

    堆一般由E序员分配释放,若不释放Q程序结束时可能?/span>OS回收。注意这里说是可能,q一定。所以我惛_一ơ,记得要释放!

所以,举个例子Q如果你在函C面定义了(jin)一个指针变量,然后在这个函数里甌?jin)一块内存让指针指向它。实际上Q这个指针的地址是在栈上Q但是它所指向的内容却是在堆上面的Q这一点要注意Q所以,再想惻I在一个函数里甌?jin)空间后Q比如说下面q个函数Q?/span>

E序代码Q?/span>

    // code...

        void Function(void)

        {

         char *p = (char *)malloc(100 * sizeof(char));

     }

    p个例子,千万不要认ؓ(f)函数q回Q函数所在的栈被销毁指针也跟着销毁,甌的内存(sh)׃栯着销毁了(jin)Q这l对是错误的Q因?strong>甌的内存在堆上Q而函数所在的栈被销毁跟堆完全没有啥关系。所以,q是那句话:(x)记得释放Q?/span>

 

3?/span>free()到底释放?jin)什?/span>

    free()释放的是指针指向的内?/span>Q注意!释放的是内存Q不是指针!q点非常非常重要Q?strong>指针是一个变量,只有E序l束时才被销毁。释放了(jin)内存I间后,原来指向q块I间的指针还是存在!只不q现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,前面我已l说q了(jin)Q释攑ֆ存后把指针指?/span>NULLQ防止指针在后面不小?j)又被解引用了(jin)。非帔R要啊q一点!

 

三?/span>malloc()以及(qing)free()的机Ӟ(x)

    事实上,仔细看一?/span>free()的函数原型,也许也会(x)发现g很神奇,free()函数非常单,只有一个参敎ͼ只要把指向申L(fng)间的指针传?/span>

 

l?/span>free()中的参数可以完成释攑ַ作!q里要追t到malloc()的申请问题(sh)(jin)?strong>甌的时候实际上占用的内存要比申L(fng)大。因出的I间是用来记录对q块内存的管理信息?/strong>

malloc()甌的空间实际我觉得是分了(jin)两个不同性质的空间?strong>一个就是用来记录管理信息的I间Q另外一个就是可用空间了(jin)?/strong>而用来记录管理信息的实际上是一个结构体。在C语言中,用结构体来记录同一个对象的不同信息?/span>

下面看看q个l构体的原型Q?/span>

E序代码Q?/span>

    struct mem_control_block {

     int is_available;     //q是一个标讎ͼ

     int size;             //q是实际I间的大?/span>

     };

    对于size,q个是实际空间大。这里其实我有个疑问Q?/span>is_available是否是一个标讎ͼ因ؓ(f)我看?/span>free()的源代码之后对这个变量感觉有点纳P源代码在下面分析Q。这里还请大家指出!

    所以,free()是Ҏ(gu)q个l构体的信息来释?/span>malloc()甌的空_(d)而结构体的两个成员的大小我想应该是操作系l的事了(jin)。但是这里有一个问题,malloc()甌I间后返回一个指针应该是指向W二U空_(d)也就是可用空_(d)不然Q如果指向管理信息空间的话,写入的内容和l构体的cd有可能不一_(d)或者会(x)把管理信息屏蔽掉Q那没法释攑ֆ存空间了(jin)Q所以会(x)发生错误Q(感觉自己q里说的是废话)(j)

 

    好了(jin)Q下面看?/span>free()的源代码Q我自己分析?jin)一下,觉得比vmalloc()的源代码倒是Ҏ(gu)单很多。只是有个疑问,下面指出Q?/span>

E序代码Q?/span>

    // code...

   

        void free(void *ptr) 

     {

             struct mem_control_block *free;

             free = ptr - sizeof(struct mem_control_block);

             free->is_available = 1;

             return;

     }

    看一下函数第二句Q这句非帔R要和关键。其实这句就是把指向可用I间的指针倒回去,让它指向理信息的那块空_(d)因ؓ(f)q里是在g减去?jin)一个结构体的大!后面那一?/span>free->is_available = 1;我有点纳P我的x(chng)是:(x)q里is_available应该只是一个标记而已Q因Zq个变量的名UC来看Q?/span>is_available 译q来是“是可以用”。不要说我土Q我觉得变量名字可以反映一个变量的作用Q特别是严}的代码。这是源代码Q所以我觉得l对是严谨的Q!q个变量的值是1Q表明是可以用的I间Q只是这里我想了(jin)惻I如果把它改ؓ(f)0或者是其他g知道?x)发生什么事Q!但是有一Ҏ(gu)可以肯定Q就是释攄对不?x)那么顺利进行!因?f)q是一个标讎ͼ

 

    当然Q这里可能还是有Z(x)有疑问,Z么这样就可以释放呢?Q我刚才也有q个疑问。后来我惛_Q释放是操作pȝ的事Q那么就free()q个源代码来看,什么也没有释放Q对吧?但是它确实是定?jin)管理信息的那块内存的内宏V所以,free()只是记录?jin)一些信息,然后告诉操作pȝ那块内存可以去释放,具体怎么告诉操作pȝ的我不清楚,但我觉得q个已经出?jin)我q篇文章的讨围了(jin)?/span>

 

    那么Q我之前有个错误的认识,是认ؓ(f)指向那块内存的指针不移到那块内存(sh)的哪个位|都可以释放那块内存Q但是,q是大错牚wQ释放是不可以释放一部分的!首先q点应该要明白。而且Q从 free()的源代码看,ptr只能指向可用I间的首地址Q不?dng)减去l构体大之后一定不是指向管理信息空间的首地址。所以,要确保指针指向可用空间的首地址Q?br>E序代码Q?br>float *YValuePoint;
while ( !feof(file) && i<DataNumberMax)  //L
  {
   fscanf(file,"%f ",&data);      
   YValue[i]=data;
   sum+=YValue[i];
   pLineSerie->AddPoint(XValue++,YValue[i]);
   i++;
  }
  average=sum/DataNumberMax;
  max=*YValue;
  min=*(YValue+2);
 YValuePoint=YValue; //保存首地址
  for(int j=0;j<DataNumberMax;j++)
  {
      if(max <* YValue)
   {
        max =* YValue;
   }
   else
   {
    if(min > *YValue)  min = *YValue;
   }
   YValue++;              //YValue地址?1
  }

  free(YValuePoint);  //释放内存Q释放从该内存空间的首地址开?/strong>



]]>
钩子http://www.shnenglu.com/huxiaofeng/archive/2009/11/28/102174.html?/dc:creator>?/author>Sat, 28 Nov 2009 08:01:00 GMThttp://www.shnenglu.com/huxiaofeng/archive/2009/11/28/102174.htmlhttp://www.shnenglu.com/huxiaofeng/comments/102174.htmlhttp://www.shnenglu.com/huxiaofeng/archive/2009/11/28/102174.html#Feedback0http://www.shnenglu.com/huxiaofeng/comments/commentRss/102174.htmlhttp://www.shnenglu.com/huxiaofeng/services/trackbacks/102174.html阅读全文

]]>
指针的指?/title><link>http://www.shnenglu.com/huxiaofeng/archive/2009/11/22/101654.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Sun, 22 Nov 2009 14:31:00 GMT</pubDate><guid>http://www.shnenglu.com/huxiaofeng/archive/2009/11/22/101654.html</guid><wfw:comment>http://www.shnenglu.com/huxiaofeng/comments/101654.html</wfw:comment><comments>http://www.shnenglu.com/huxiaofeng/archive/2009/11/22/101654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/huxiaofeng/comments/commentRss/101654.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/huxiaofeng/services/trackbacks/101654.html</trackback:ping><description><![CDATA[指向另一指针的指针:(x)转自<strong><font size=4>风过无痕博客</font></strong><span id="ldonfkl" class=addtime> <div id="nviqzsx" class=logtxt><span id=ob_logd15950> <div id="pnrsjzi" class=digg_list style="DISPLAY: inline; BACKGROUND: url(/Images/digg.gif) no-repeat left top; FLOAT: right; MARGIN: 0px 10px 5px 0px; WIDTH: 45px; HEIGHT: 55px; TEXT-ALIGN: center"> <div id="tvitqlk" class=digg_submit style="PADDING-RIGHT: 0px; PADDING-LEFT: 6px; PADDING-BOTTOM: 0px; LINE-HEIGHT: 1; PADDING-TOP: 3px; LETTER-SPACING: 6px"> </div> </div> </span> <p><strong>一Q?回顾指针概念Q?/strong><br>早在本系列第二篇中我对指针的实质进行了(jin)阐述。今天我们又?a onclick="javascript:tagshow(event, '%D1%A7%CF%B0');" href="javascript:;" target=_self><u><strong><font color=#009999>学习(fn)</font></strong></u></a>一个叫做指向另一指针地址的指针。让我们先回一下指针的概念吧!<br>当我们程序如下申明变量:(x)<br>short int i;<br>char a;<br>short int * pi;<br>E序?x)在内存某地址I间上ؓ(f)各变量开辟空_(d)如下图所C?br>内存地址→6     7      8     9     10     11    12    13     14    15<br>-------------------------------------------------------------------------------------<br>…  |     |      |      |      |      |       |      |      |      |  <br>-------------------------------------------------------------------------------------<br>    |short int i |char a|      |short int * pi|<br>图中所CZ可看出:(x)<br>i 变量在内存地址5的位|,占两个字节?br>a变量在内存地址7的位|,占一个字节?br>pi变量在内存地址9的位|,占两个字节?注:(x)pi 是指针,我这里指针的宽度只有两个字节Q?2位系l是四个字节)<br>接下来如下赋?<br>i=50;<br>pi=&i;<br>l过上在两句的赋|变量的内存映象如?<br>内存地址→6     7      8     9     10     11    12    13      14     15<br>--------------------------------------------------------------------------------------<br>…  |    50      |      |      |    6         |      |      |       |  <br>--------------------------------------------------------------------------------------<br>    |short int i |char a|      |short int * pi|<br>看到没有Q短整型指针变量pi的gؓ(f)6Q它?yu)是I变量的内存v始地址。所以,q时当我们对*piq行d操作Ӟ其实是对i变量的读写操作。如Q?br>*pi=5;   //是{h(hun)于I=5;<br><br><strong>二. 指针的地址与指向另一指针地址的指?/strong><br>在上一节中Q我们看刎ͼ指针变量本n?a onclick="javascript:tagshow(event, '%C6%E4%CB%FC');" href="javascript:;" target=_self><u><strong><font color=#009999>其它</font></strong></u></a>变量一样也是在某个内存地址中的Q如pi的内存v始地址?0。同L(fng)Q我们也可能让某个指针指向这个地址?br>看下面代码:(x)<br>short int * * ppi;    //q是一个指向指针的指针Q注意有两个*?br>ppi=pi<br>W一句:(x)short int * * ppi;——申明了(jin)一个指针变量ppiQ这个ppi是用来存储(或称指向Q一个short int * cd指针变量的地址?br>W二句:(x)&pi那就是取pi的地址Qppi=pi是把pi的地址赋给?jin)ppi。即地址?0赋值给ppi。如下图Q?br>内存地址→6     7      8     9     10     11    12    13       14    15<br>------------------------------------------------------------------------------------<br>…  |    50     |      |      |      6       |       10      |      |  <br>------------------------------------------------------------------------------------<br>    |short int i|char a|      |short int * pi|short int ** ppi|<br>从图中看出,指针变量ppi的内容就是指针变量pi的v始地址。于?#8230;…<br>ppi的值是多少呢?—?0?br>*ppi的值是多少呢?—?,即pi的倹{?br>**ppi的值是多少呢?—?0,即I的|也是*pi的倹{?br>呵呵Q不用我说太多了(jin)Q我怿你应明白q种指针?jin)吧Q?br><br><strong>三. 一个应用实?/strong><br>1Q?设计一个函敎ͼ(x)void find1(char array[], char search, char * pi)<br><strong>要求Q?/strong>q个函数参数中的数组array是以0gؓ(f)l束的字W串Q要求在字符串array中查扑֭W是参数search里的字符。如果找刎ͼ函数通过W三个参敎ͼpaQ返回gؓ(f)array字符串中W一个找到的字符的地址。如果没扑ֈQ则为pa??br><strong>设计Q?/strong>依题意,实现代码如下?br>void find1(char array[] , char search, char * pa)<br>{<br>   int i;<br>   for (i=0;*(array+i)!=0;i++)<br>   {<br>      if (*(array+i)==search)<br>      {<br>        pa=array+i<br>        break;<br>      }<br>      else if (*(array+i)==0)<br>      {<br>        pa=0;<br>        break;<br>      }<br>   }<br>}<br>你觉得这个函数能实现所要求的功能吗Q?br><strong>调试Q?/strong><br>我下面调用这个函数试试?br>void main()<br>{<br>  char str[]={“afsdfsdfdf\0”};  //待查扄字符?br>  char a=’d’;   //讄要查扄字符<br>  char * p=0;  //如果查找到后指针p指向字W串中查扑ֈ的第一个字W的地址?br>  find1(str,a,p);  //调用函数以实现所要操作?br>  if (0==p )<br>  {<br>     printf (“没找刎ͼ\n”);//1.如果没找到则输出此句<br>  }<br>  else<br>  {<br>     printf(“扑ֈ?jin),p=%d”,p);  //如果扑ֈ则输出此?br>  }<br>}<br><strong>分析Q?/strong><br>上面代码Q你认ؓ(f)?x)是输出什么呢Q?br>q行试试?br>唉!怎么输出的是Q没有找刎ͼ<br>而不是:(x)扑ֈ?jin)?#8230;…?br>明明agؓ(f)’d’Q而str字符串的W四个字W是’d’Q应该找得到呀Q?br>再看函数定义处:(x)void find1(char array[] , char search, char * pa)<br>看调用处Qfind1(str,a,p);<br>依我在第五篇的分析方法,函数调用时会(x)Ҏ(gu)一个参数进行一个隐含的赋值操作?br>整个调用如下Q?br>   array=str;<br>   search=a;<br>   pa=p;    //h意:(x)以上三句是调用时隐含的动作?br>   int i;<br>   for (i=0;*(array+i)!=0;i++)<br>   {<br>      if (*(array+i)==search)<br>      {<br>        pa=array+i<br>        break;<br>      }<br>      else if (*(array+i)==0)<br>      {<br>        pa=0;<br>        break;<br>      }<br>   }<br>哦!参数pa与参数search的传递ƈ没有什么不同,都是g递嘛Q小语:(x)地址传递其实就是地址g递嘛Q!所以对形参变量pa|当然值是一个地址|(j)的修改ƈ不会(x)改变实参变量p|因此p的值ƈ没有改变(即p的指向ƈ没有被改??br>Q如果还有疑问,再看一看《函数参数的传递》了(jin)。)(j)<br><strong>修正Q?/strong><br>void find2(char [] array, char search, char ** ppa)<br>{<br>   int i;<br>   for (i=0;*(array+i)!=0;i++)<br>   {<br>      if (*(array+i)==search)<br>      {<br>        *ppa=array+i<br>        break;<br>      }<br>      else if (*(array+i)==0)<br>      {<br>        *ppa=0;<br>        break;<br>      }<br>   }<br>}<br>d数的调用处改如下Q?br>  find2(str,a,&p);  //调用函数以实现所要操作?br><strong>再分析:(x)</strong><br>q样调用函数时的整个操作变成如下Q?br>   array=str;<br>   search=a;<br>   ppa=&p;    //h意:(x)以上三句是调用时隐含的动作?br>   int i;<br>   for (i=0;*(array+i)!=0;i++)<br>   {<br>      if (*(array+i)==search)<br>      {<br>        *ppa=array+i<br>        break;<br>      }<br>      else if (*(array+i)==0)<br>      {<br>        *ppa=0;<br>        break;<br>      }<br>   }<br>看明白了(jin)吗?<br>ppa指向指针p的地址?br>?ppa的修改就是对p值的修改?br>下面看一下指向指针变量的指针变量怎样正确引用?br>用指向指针的指针变量讉K一l和二维数组?/p> <p>#include<stdio.h><br>#include<stdlib.h><br>main()<br>{<br>int a[3],b[2][2],*p1,*p2,**p3,i,j;</p> <p>printf("误入一l数l的?\n");<br>for(i=0;i<3;i++)<br>scanf("%d",&a[i]);/*一l数l的输入*/</p> <p>printf("误入二l数l的?\n");<br>for(i=0;i<2;i++)<br>for(j=0;j<2;j++)<br>scanf("%d",&b[i][j]);/*二维数组输入*/</p> <p>printf("用指针输Zl数l?\n");<br>for(p1=a,i=0;i<3;i++)     /* 用指针输Zl数l?/<br>{<br>    printf("%4d",*(p1+i));<br>}<br>printf("\n");</p> <p>printf("用指向指针的指针变量输出一l数l?1):\n");<br>for(p1=a,p3=&p1,i=0;i<3;i++)<br>printf("%4d",*(*p3+i));/*用指向指针的指针变量输出一l数l?/<br>printf("\n");<br>printf("用指向指针的指针变量输出一l数l?2):\n");<br>for(p1=a;p1-a<3;p1++)/*用指向指针的指针变量输出一l数l?/<br>{<br>p3=&p1;<br>printf("%4d",**p3);<br>}<br>printf("\n");</p> <p>printf("用指针输Zl数l?\n");<br>for(i=0;i<2;i++)   /*用指针输Zl数l?/<br>{<br>   p2=b[i] ;<br>   for(int j=0;j<2;j++)<br>  {<br>    printf("%4d",*(p2+j)) ;<br>  }<br>}<br>printf("\n");</p> <p>printf("用指向指针的指针变量输出二维数组(1):\n");<br>for(i=0;i<2;i++)/*用指向指针的指针变量输出二维数组*/<br>{<br>p2=b[i];<br>p3=&p2;<br>for(j=0;j<2;j++)<br>printf("%4d",*(*p3+j));</p> <p>利用指向指针的指针变量对二维字符数组的访问?/p> <p>#include<stdio.h><br>#include<stdlib.h><br>main()<br>{<br>int i;<br>char * ptr;<br>static char c[][16]={"clanguage","fox","computer","homepage"};<br>/*二维字符数组*/<br>static char *cp[]={c[0],c[1],c[2],c[3]};/*指针数组*/<br>static char **cpp;/*指向字符指针的指针变?/<br>cpp=cp;/*指针数l的首地址传递给指向字符指针的指针变?/</p> <p><br>for(i=0;i<4;i++)/*按行输出字符?/<br>printf("%s\n",*cpp++);<br>printf("-----------\n");</p> <p>for(i=0;i<4;i++)/*按行输出字符?/<br>{<br>cpp=&cp[i];<br>printf("%s\n",*cpp);<br>}<br>printf("-----------\n");</p> <p> <br> for(i=0;i<4;i++)<br> {<br>    ptr=c[i];<br>    printf("%s",ptr);<br>    printf("\n");<br> }<br> </p> <p>}</p> <p>}<br>printf("\n");</p> <p> printf("用指向指针的指针变量输出二维数组(2):\n");<br>for(i=0;i<2;i++)/*用指向指针的指针变量输出二维数组*/<br>{<br>p2=b[i];<br>for(p2=b[i];p2-b[i]<2;p2++)<br>{<br>p3=&p2;<br>printf("%4d",**p3);<br>}<br>printf("\n");<br>}</p> <p>}<br></p> </div> </span> <img src ="http://www.shnenglu.com/huxiaofeng/aggbug/101654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/huxiaofeng/" target="_blank">?/a> 2009-11-22 22:31 <a href="http://www.shnenglu.com/huxiaofeng/archive/2009/11/22/101654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中的接口与实?/title><link>http://www.shnenglu.com/huxiaofeng/archive/2009/11/21/101577.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Sat, 21 Nov 2009 12:20:00 GMT</pubDate><guid>http://www.shnenglu.com/huxiaofeng/archive/2009/11/21/101577.html</guid><wfw:comment>http://www.shnenglu.com/huxiaofeng/comments/101577.html</wfw:comment><comments>http://www.shnenglu.com/huxiaofeng/archive/2009/11/21/101577.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/huxiaofeng/comments/commentRss/101577.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/huxiaofeng/services/trackbacks/101577.html</trackback:ping><description><![CDATA[        所谓接口承,是zcdl承函数的接口,也就是声明;而实现承,是zcd时承函数的接口和实现?br>       我们都很清楚C++中有几个基本的概念,虚函数、纯虚函数、非虚函数?br><strong>       虚函?/strong>Q?br>       C++实现q行中的<strong>多态?/strong>是通过虚函数实现的Q而虚函数必须存在于承环境下?br>       因此Q虚函数是指一个类中你希望q行重蝲的成员函敎ͼ当你用一个基cL针或引用指向一个承类对象的时候,你调用一个虚函数Q实际调用的是承类的成员函数。虚函数用来表现基类和派生类的成员函C间的一U关pR虚函数的定义在基类中进行,在需要定义ؓ(f)虚函数的成员函数的声明前冠以关键字,?<strong>virtual void func()</strong> ?基类中的某个成员函数被声明ؓ(f)虚函数后,此虚函数可以在一个或多个zcM被重新定? 在派生类中重新定义时Q其函数原型,包括q回cd、函数名、参C数、参数类型及(qing)参数的先后顺序,都必M基类中的原型完全相同?br>        虚函数是<strong>重蝲</strong>的一U表现Ş式,是一U动态的重蝲方式?br>       只有cȝ普通成员函数可以定义ؓ(f)虚函敎ͼ全局函数?qing)?rn)态成员函敎ͼcL有)(j)不能声明函数?br><strong>       U虚函数Q?/strong><br>        U虚函数在基cM没有定义且只能在基类中定义,但未l出具体的函数定义体Q?strong>实现</strong>Q,它们被初始化?。Q何用U虚函数z的类Q都要自己提供该函数的具体实现?br>         定义U虚函数Q?strong>virtual void func() = 0;<br></strong>         定义?jin)纯虚函数的c被UC?strong>抽象c?/strong>。抽象类定义一族派生类的共?strong>接口</strong>Q而接口的完整<strong>实现</strong>Q即U虚函数的函CQ由zc自己定义?br>例:(x)//class Shape<br>       public:<br>                 virtual void area()=0Q?nbsp;// U虚函数<br>        //class Tringle : public Shape  //公有l承<br>       public:<br>                void area() {//}                /接口与实?br>         抽象cd以有多个U虚函数Q也可以定义其他虚函数。若zcL有重新定义纯虚函敎ͼ那么该派生类也称之ؓ(f)U虚函数?br>         U虚函不需要定义其实际操作Q它的存在只是ؓ(f)?jin)在zcM被重新定义,只是提供一?strong>多态接?/strong>?br><strong>       非虚函数</strong>Q?br>       一般成员函敎ͼ无virtual关键字修饰?br>        至于Z么要定义q些函数Q我们可以将虚函数、纯虚函数和非虚函数的功能与<strong>接口l承</strong>?strong>实现l承</strong>联系hQ?br>         如前所qͼ声明一个纯虚函敎ͼpure virtualQ的目的是ؓ(f)?jin)让zcdl承函数接口Q也是上面说的接口l承?br>        U虚函数一般是在不方便具体实现此函数的情况下用。也是说基cL法ؓ(f)l承c规定一个统一的缺省操作,但承类又必d有这个函数接口,q对其分别实现。但是,在C++中,我们是可以ؓ(f)U虚函数提供定义的,只不q这U定义对l承cL说没有特定的意义。因为承类仍然要根据各自需要实现函数?br>        通俗_(d)U虚函数是要求其承类必须含有该函数接口,q对其进行实现。是对承类的一U接口实现要求,但ƈ不提供缺省操作,各个l承cdd别实现自q操作?br>        声明非纯虚函敎ͼimpure virtualQ的目的是让l承cȝ承该函数的接口和~省实现?br>        与纯虚函数唯一的不同就是其为承类提供?jin)缺省操作,l承cd以不实现自己的操作而采用基cL供的默认操作?br>        声明非虚函数Qnon-virtualQ的目的是ؓ(f)?jin)o(h)l承cȝ承函数接口及(qing)一份强制性实现?br>        相对于虚函数来说Q非虚函数对l承c要求的更ؓ(f)严格Q承类不仅要承函数接口,而且也要l承函数实现。也是为承类定义?jin)一U行为?br><strong> ȝ</strong>Q?br>        U虚函数Q要求承类必须含有某个接口QƈҎ(gu)口函数实现?br>        虚函敎ͼ(x)l承cdd有某个接口,可以自己实现Q也可以不实玎ͼ而采用基cd义的~省实现?br>        非虚函数Q承类必须含有某个接口Q必M用基cȝ实现?br>         一个C++cL着两个重要的方面:(x)用于描述行ؓ(f)的公共接口,以及(qing)行ؓ(f)的私有实现?br>       大多数的l承都是公有l承Q派生类l承?jin)基cȝ接口和实现。不q,我们也可以进行有选择的承,x(chng)生类可以只承接口或实现。私有基c,只承实实现Q没有接口;公有l承基类Q承接口,但承的实现可能是不完整的或不存在的Q纯虚函敎ͼ(j)?br> 例:(x)<br>我们可以用函敎ͼ(x)<br> Triangle t;<br> t.area();<br>我们只是使用?jin)其接口Q但具体的实现可以不知道。void area() {......} <br><br> <img src ="http://www.shnenglu.com/huxiaofeng/aggbug/101577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/huxiaofeng/" target="_blank">?/a> 2009-11-21 20:20 <a href="http://www.shnenglu.com/huxiaofeng/archive/2009/11/21/101577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l承?/title><link>http://www.shnenglu.com/huxiaofeng/archive/2009/11/21/101545.html</link><dc:creator>?/dc:creator><author>?/author><pubDate>Sat, 21 Nov 2009 02:58:00 GMT</pubDate><guid>http://www.shnenglu.com/huxiaofeng/archive/2009/11/21/101545.html</guid><wfw:comment>http://www.shnenglu.com/huxiaofeng/comments/101545.html</wfw:comment><comments>http://www.shnenglu.com/huxiaofeng/archive/2009/11/21/101545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/huxiaofeng/comments/commentRss/101545.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/huxiaofeng/services/trackbacks/101545.html</trackback:ping><description><![CDATA[<p align=left>    通过l承机制Q可以利用已有的数据cd来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且q同时拥有旧的成员。我们称已存在的用来z新类的类为基c,又称为父cR由已存在的cL生出的新cȝ为派生类Q又UCؓ(f)子类?br>    在C++语言中,一个派生类可以从一个基cL生,也可以从多个基类z。从一个基cL生的l承UCؓ(f)单承;从多个基cL生的l承UCؓ(f)多ѝ?br>例:(x)</p> <p>#include <iostream.h><br>class Metal<br>{<br>public:<br> unsigned atomicNumber;<br> float atomicWeight;<br> float pricePerounce;<br>public:<br> Metal( unsigned Number=0,<br>         float Weight=0.000000,<br>         float Perounce=0.000000)<br> {<br> atomicNumber=Number;<br> atomicWeight=Weight;<br> pricePerounce=Perounce;<br> }<br> ~Metal() {}<br>    unsigned GetNumber(void) {return atomicNumber;}  //内联函数<br>    float GetWeight(void) {return atomicWeight;}<br>    float Getprice(void) {return pricePerounce;}<br> virtual void output()<br> {<br>  cout << "The atomic weight =" << atomicWeight << endl;<br>  cout << "The atomic number =" << atomicNumber << endl;<br>  cout << "Price per ounce =" << pricePerounce << endl;<br> }<br>};</p> <p>class Pb : public Metal  //公有l承Q单l承<br>{<br>public:<br> Pb (unsigned Number=82,float Weight=207,float Perounce=0.01):Metal(Number,Weight,Perounce) {}<br> //子类构造首先调用基cL造函?br>};</p> <p>class Au : public Metal<br>{<br>public:<br> Au (unsigned Number=79,float Weight=196.9665,float Perounce=450.75):Metal(Number,Weight,Perounce) {}<br> Au (Pb& lemp)  //拯函数<br> {<br>       atomicNumber=lemp.GetNumber()-3;<br>       atomicWeight=lemp.GetWeight()-10.2335;<br>       pricePerounce=lemp.Getprice()+450.74;<br> }<br>};</p> <p>void main ()<br>{<br>    Pb m;<br> Au n=m;     //拯<br> n.output();<br>}</p> 注:(x) <p align=left>  zcȝ三种l承方式Q公有?public)、私有?private)、保护?protected)是常用的三种l承方式Q?br>        公有l承Ӟ水^讉K和垂直访问对基类中的公有成员?sh)受限制Q?br>        U有l承Ӟ水^讉K和垂直访问对基类中的公有成员?sh)不能访问?br>        保护l承Ӟ对于垂直讉K同于公有l承Q对于水q问同于私有ѝ?br><o:p>        对于基类中的U有成员Q只能被基类中的成员函数和友元函数所讉KQ不能被其他的函数访问?br>        如果通过公有l承来生基c,那么q个zcd该是其基cȝ特化?br>        如果zcM间的区别在于属性,则用数据成员来表C;如果在于行ؓ(f)Q则用虚函数来表C?br><br><span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.25pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">   M一个类都可以派生出一个新c,zcM可以再派生出新类?/span></o:p></p> <p align=left> </p> <img src ="http://www.shnenglu.com/huxiaofeng/aggbug/101545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/huxiaofeng/" target="_blank">?/a> 2009-11-21 10:58 <a href="http://www.shnenglu.com/huxiaofeng/archive/2009/11/21/101545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何讄按钮控g点击弹出新菜单栏http://www.shnenglu.com/huxiaofeng/archive/2009/11/19/101379.html?/dc:creator>?/author>Thu, 19 Nov 2009 06:03:00 GMThttp://www.shnenglu.com/huxiaofeng/archive/2009/11/19/101379.htmlhttp://www.shnenglu.com/huxiaofeng/comments/101379.htmlhttp://www.shnenglu.com/huxiaofeng/archive/2009/11/19/101379.html#Feedback0http://www.shnenglu.com/huxiaofeng/comments/commentRss/101379.htmlhttp://www.shnenglu.com/huxiaofeng/services/trackbacks/101379.html函数介绍QCButtonST应用
DWORD CButtonST::SetMenu(UINT nMenu, HWND hParentWnd, BOOL bRepaint)
{
 
HINSTANCE hInstResource = NULL;

 // Destroy any previous menu
 if (m_hMenu)
 {
         ::DestroyMenu(m_hMenu);
         m_hMenu = NULL;
         m_hParentWndMenu = NULL;
         m_bMenuDisplayed = FALSE;
 } // if

 // Load menu
 if (nMenu)
 {
  // Find correct resource handle
  hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nMenu), RT_MENU);
  // Load menu resource
  m_hMenu = ::LoadMenu(hInstResource, MAKEINTRESOURCE(nMenu));
  m_hParentWndMenu = hParentWnd;
  // If something wrong
  if (m_hMenu == NULL) return BTNST_INVALIDRESOURCE;
 } // if

 // Repaint the button
     if (bRepaint)  Invalidate();

     return BTNST_OK;
} // End of SetMenu

DWORD CButtonST::SetMenu(UINT nMenu, HWND hParentWnd, BOOL bWinXPStyle, UINT nToolbarID, CSize sizeToolbarIcon, COLORREF crToolbarBk, BOOL bRepaint)    //除前两个参数Q其他参数都有初始?br>{
 BOOL bRetValue = FALSE;

 // Destroy any previous menu
 if (m_menuPopup.m_hMenu)
 {
    m_menuPopup.DestroyMenu();
    m_hParentWndMenu = NULL;
    m_bMenuDisplayed = FALSE;
 } // if

 // Load menu
 if (nMenu)
 {
     m_menuPopup.SetMenuDrawMode(bWinXPStyle);
  // Load menu
     bRetValue = m_menuPopup.LoadMenu(nMenu);
  // If something wrong
  if (bRetValue == FALSE) return BTNST_INVALIDRESOURCE;

  // Load toolbar
  if (nToolbarID)
  {
   m_menuPopup.SetBitmapBackground(crToolbarBk);
   m_menuPopup.SetIconSize(sizeToolbarIcon.cx, sizeToolbarIcon.cy);

   bRetValue = m_menuPopup.LoadToolbar(nToolbarID);
   // If something wrong
   if (bRetValue == FALSE)
   {
    m_menuPopup.DestroyMenu();
    return BTNST_INVALIDRESOURCE;
   } // if
  } // if

  m_hParentWndMenu = hParentWnd;
 } // if

 // Repaint the button
 if (bRepaint) Invalidate();

 return BTNST_OK;
} // End of SetMenu

通过#ifdef BTNST_USE_BCMENU  来判断选择哪个函数?br>
E序q程Q?br>   头文Ӟ(x)
CButtonST m_btnHelp;
   源文Ӟ(x)
1Q在当前对话cȝ初始化函CdQ?br>OnInitDialog()
 m_btnHelp.SetIcon(IDI_HELP, (int)BTNST_AUTO_GRAY);           //讄图标Q未点击时变?br> m_btnHelp.SetTooltipText(_T("Help"));                                             //输出文字
#ifdef BTNST_USE_BCMENU
 m_btnHelp.SetMenu(IDR_MENU, m_hWnd);                                  //点击时弹?gu)单?br>#else
 m_btnHelp.SetMenu(IDR_MENU, m_hWnd);
#endif
2Q设|控件交换信息:(x)
DoDataExchange(CDataExchange* pDX)函数?br> DDX_Control(pDX,IDC_BUTTON1,m_btnHelp);  //输出
3Q新菜单栏响应函敎ͼ(x)
新徏一菜单栏:(x)IDR_MENUNEW,讄为POP-UP;
讄子菜单:(x)IDR_ITEM1.点击ClassWizardQ选择当前文档cȝ击ON_COMMAND讄响应函数?

]]>
˳վþ99ȹ| ҹƷþþþþapp| þþþѾƷ| þ| ƷȾþþø| 91Ʒþþþþ91| ۺϾþϵ| ɫþþۺ | ˸ŮѲžþþ| ޾Ʒþһ| ޾ƷƬþ| þۺɫˮ99ž| רþۺϾĻ | þþƷ99þþ| þþƷAV鶹| þþþAVƬ| Ʒþþþþø69| ݺɫۺϾþ| 94þù׾Ʒ| 99þþþ| һƷ˾þ| þþƷ| պþþþþ| Ʒþ99| þþѹ۳ӰԺ| þþþþþþþþþƷ| ۺպþóAV| þþƷ}Ů| Ʒþҹҹ³³| 99þþþþѿ | 99REþþƷﶼǾƷ | ݺۺϾþۺ88| Ʒպþ| www.þ.com| ޾Ʒ99þþþĻ| Ʒ99þþþƷ| avþþþòվ| þþƷav٤| þþƷһ| seguiþùƷ| þþƷ99Ʒ|