【轉】MFC學習總結

HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 if ((pWnd->GetDlgCtrlID() == IDC_EDIT1) && (nCtlColor == CTLCOLOR_EDIT))
 {
   COLORREF clr = RGB(255,0,0);
   pDC->SetTextColor(clr);  //設置紅色的文本
   clr = RGB(0,0,0);
   pDC->SetBkColor(clr);   //設置黑色的背景
   m_brMine = ::CreateSolidBrush(clr);
   return m_brMine; //作為約定,返回背景色對應的刷子句柄
 }
 else
 {
   HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
   return hbr;
 }
}

第二種方法(對應于IDC_EDIT2):
利用MFC 4.0的新特性: Message reflection。

1.利用向導添加一個新的類:CColorEdit,基類為CEdit;
2.在CColorEdit中添加一個數據成員: HBRUSH m_bkBrush;
3.利用向導映射CColorEdit的"=WM_CTLCOLOR"消息,產生函數:

HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor);

對其進行如下修改:

HBRUSH CColorEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
 COLORREF clr = RGB(0,0,0);
 pDC->SetTextColor(clr);  //設置黑色的文本
 clr = RGB(255,0,0);
 pDC->SetBkColor(clr);   //設置紅色的背景
 m_bkBrush = ::CreateSolidBrush(clr);
 return m_bkBrush; //作為約定,返回背景色對應的刷子句柄
}

4.利用向導為IDC_EDIT2生成一個數據成員CColorEdit m_coloredit;
5.在定義CAboutDlg的color.cpp文件中加入:#include "coloredit.h"

30. 如何防止密碼被非法獲取?

 [問題提出]
  這兩天大家比較專注在獲取Edit密碼框的密碼.在盜取時,我們如何防范呢?
 
 [解決方法]
  此方法針對于通過SendMessage向此窗口發送WM_GETTEXT或EM_GETLINE消息來取得密碼.跟我來.
 
 [程序實現]
  方法很簡單,用CWnd::DefWindowProc函數攔截得到的消息(向Edit發的).
  建立名為My的對話框工程.建立一個Edit控件ID=IDC_EDIT1.建一個新類名為CMyProtectEdit,派生于CEdit.
  在MyDlg.cpp中聲明全局變量:BOOL g_bIdentity;
  BOOL g_bIdentity;

  在MyProtecEdit.cpp中:
  extern BOOL g_bIdentity;

  響應CMyProtectEdit的DefWindowProc函數:
  LRESULT CMyProtectEdit::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  {
    // TODO: Add your specialized code here and/or call the base class
    // 對Edit的內容獲取必須通過以下兩個消息之一,不對其采用默認的處理:
    if(( message == WM_GETTEXT) || ( message == EM_GETLINE))
    {  //檢查是否為合法
     if(!g_bIdentity)
     {  //非法獲取,顯示非法信息
       AfxMessageBox(_T("不能讓你看我的密碼,:( !"));
       return 0;
     )
     g_bIdentity = FALSE;//合法獲取
    }
    
    return CEdit::DefWindowProc(message, wParam, lParam);
  }

  然后在MyDlg.cpp中
  void CMyDlg::DoDataExchange(CDataExchange* pDX)
  {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CGetPasswordDlg)
    // NOTE: the ClassWizard will add DDX and DDV calls here
    if( pDX->m_bSaveAndValidate)
    {
     g_bIdentity = TRUE;
    }   
    //}}AFX_DATA_MAP
  }
  即可.找個程序(盜取)的試試.

?
?2006-10-8 15:55:13??
huzunbo
?
??

?
?
31. 如何在編輯控件中以追加的方式添入字符?

 [問題提出]
  SetDlgItemText可以向Edit控件中輸入字符,發送更新的消息也可是Edit控件顯示與其關聯的變量的值,但若是向已有的Edit字符后追加字符,該如何做?
 [程序實現]
  建立名為My的對話框工程,添加一個Edit和一個Button控件.Edit的ID=IDC_EDIT1,Button的ID=IDC_BUTTON1.建立和IDC_BUTTON1的響應函數:OnButton1()
  void CMyDlg::OnButton1()
  {
    CString pText="你好";
    CEdit *m_Edit=(CEdit *)GetDlgItem(IDC_EDIT1);
    int nLen=m_Edit->GetWindowTextLength();
    m_Edit->SetFocus();
    m_Edit->SetSel(nLen, nLen);
    m_Edit->ReplaceSel(pText);
  }
  在Edit控件中輸入字符,想追加時按IDC_BUTTON1按鈕.看看效果.

32.屬性頁標題改名

我用CPropertySheet創建屬性頁,用的CPropertyPage對象只有一個,也就是每個屬性頁的內容一樣.現在的問題是:這樣每個屬性頁的標題都是一樣的,是對話框的標題!怎樣動態的改變這個標題,使每個屬性頁的標簽的名稱都不同??


CTabCtrl * pCtrl = pSheet->GetTabControl();
TCITEM tc;
tc.mask = TCIF_TEXT;
tc.pszText = "新標題";
pCtrl->SetItem(0,&tc);//0即是你要改的TAb的索引

33. 怎樣去掉屬性頁的Apply與Help按鈕?

//去掉Help
  m_psh.dwFlags |= PSH_HASHELP ;
  m_psh.dwFlags &= ~PSH_HASHELP ;
//除掉應用按鈕 m_psh.dwFlags|=PSH_NOAPPLYNOW;

34. 如何給樹控件加入工具提示

1.首先給樹控件加入TVS_INFOTIP屬性風格,如下所示:

if (!m_ctrlTree.Create(WS_CHILD|WS_VISIBLE|
  TVS_HASLINES|TVS_HASBUTTONS|TVS_LINESATROOT|TVS_SHOWSELALWAYS|TVS_INFOTIP, //加入提示TVS_INFOTIP,jingzhou xu(樹控件ID:100)
   CRect(0, 0, 0, 0), &m_wndTreeBar, 100))
  {
   TRACE0("Failed to create instant bar child\n");
   return -1;
  }

2.其次加入映射消息聲明,如下所示:

afx_msg void OnGetInfoTip(NMHDR* pNMHDR,LRESULT* pResult);    //樹控件上加入提示消息,jingzhou xu  

ON_NOTIFY(TVN_GETINFOTIP, 100, OnGetInfoTip)       //樹控件條目上加入提示,jingzhou xu

3.最后加入呼應涵數處理:

void CCreateTreeDlg::OnGetInfoTip(NMHDR* pNMHDR,
                  LRESULT* pResult)
 {
 *pResult = 0;
 NMTVGETINFOTIP* pTVTipInfo = (NMTVGETINFOTIP*)pNMHDR;
 LPARAM itemData = (DWORD) pTVTipInfo->lParam;
 //對應每個條目的數據
 HTREEITEM hItem = pTVTipInfo->hItem;
 CString tip;
 HTREEITEM hRootItem = m_chassisTree.GetRootItem();
 if (hRootItem != pTVTipInfo->hItem)
 {
  tip = "樹結點的提示";
 }
 else
 {
  tip = "樹根上的提示";
 }
 strcpy(pTVTipInfo->pszText, (LPCTSTR) tip);
}

35. 如何在TreeList中加圖標?

 [問題提出]
 請問treeview控件和treectrl控件的用法有何不同呢?向如何imagelist控件中加圖象呀?
 [解決方法]
 1)
  HICON hicon[8];
  m_imageList.Create(16,16,0,8,8);
  hicon[0]=AfxGetApp()->LoadIcon(IDI_ICON0);
  hicon[1]=AfxGetApp()->LoadIcon(IDI_ICON1);
  hicon[2]=AfxGetApp()->LoadIcon(IDI_ICON2);
  hicon[3]=AfxGetApp()->LoadIcon(IDI_ICON3);
  hicon[4]=AfxGetApp()->LoadIcon(IDI_ICON4);
  hicon[5]=AfxGetApp()->LoadIcon(IDI_ICON5);
  hicon[6]=AfxGetApp()->LoadIcon(IDI_ICON6);
  hicon[7]=AfxGetApp()->LoadIcon(IDI_ICON7);
  for(int n=0;n<8;n++)
    m_imageList.Add(hicon[n]);

  CTreeCtrl *pTree=(CTreeCtrl *)GetDlgItem(IDC_TREE);
  pTree->SetImageList(&m_imageList,TVSIL_NORMAL);

 2)
  CImageList cil1;
  cil1.Create(32,32,TRUE,2,2);
  cil1.Add(pApp->LoadIcon(IDI_DAO1));
  cil1.Add(pApp->LoadIcon(IDI_DAO2));
  cil1.Add(pApp->LoadIcon(IDI_DAO3));
  cil1.Add(pApp->LoadIcon(IDI_DAO4));
  cil1.Add(pApp->LoadIcon(IDI_DAO5));
  cil1.Add(pApp->LoadIcon(IDI_DAO6));
  cil1.Add(pApp->LoadIcon(IDI_DAO7));
  cil1.Add(pApp->LoadIcon(IDI_DAO8));
  cil1.Add(pApp->LoadIcon(IDI_DAO9));
  
  //設置圖象列表
  m_list.SetImageList(&cil1,LVSIL_NORMAL);

36. 如何雙擊列表框項啟動一個與文件關聯的程序?

有人問我如何雙擊列表框項啟動一個程序?其實這個問題很簡單,Windows中有一個API函數可以打開任何類型的文件:

ShellExecute(NULL,"open",lpFileName,NULL,NULL,SW_SHOWNORMAL);

參數 lpFileName 是文件的全路徑名。用這個變量你可以傳遞象“C:\\MyExcelFile.xls”或者“http://www.vckbase.com”啟動Excel程序或者瀏覽器程序。如果你只是想獲取與文件關聯的程序名,而不是要運行程序,那么調用::FindExecutable就可以了。

37. 如何防止在listbox中添加很多數據出現不停的刷新?

 [問題提出]
  在listbox添加很多數據的時候,由于控件不停的刷新,導致出現閃爍,如何解決?
 [解決方法]
  再添加數據以前,禁止控件刷新,數據添加完畢以后,再刷新一次。
 [程序實現](其中:m_ListBox是CListBox的控件類型的變量)
  m_ListBox.LockWindowUpdate();//禁止本listbox刷新。
  for(int i=0;i<9999;i++)
  {
     m_ListBox.AddString("test");
  }//添加數據。
  this->RedrawWindow(NULL,NULL,RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);

38. 如何得到CListBox所選擇項的String?

 [問題提出]
 如何得到CListBox所選擇項的String
 [解決方法]
 用到:CListBox::GetText()
 [程序實現]
 CString scInfo;
 pList->GetText( GetCurSel(),scInfo);

39. 用鼠標移動基于對話框的無標題欄程序的簡單方法

void CVCTestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
  //一句話解決問題
  SendMessage(WM_SYSCOMMAND,0xF012,0);
  CDialog::OnLButtonDown(nFlags, point);
}

40. 如何改變框對話或窗體視窗的背景顏色

調用CWinApp : : SetDialogBkColor可以改變所有應用程序的背景顏色。第一個參數指定了背景顏色,第二個參數指定了文本顏色。下例將應用程序對話設置為藍色背景和黃色文本。
BOOL CSampleApp : : InitInstance ( )
{

//use blue dialog with yellow text .
SetDialogBkColor (RGB (0, 0, 255 ), RGB ( 255 , 255 , 0 ) ) ;

}
需要重畫對話(或對話的子控件)時,Windows向對話發送消息WM_CTLCOLOR,通常用戶可以讓Windows選擇繪畫背景的刷子,也可重置該消息指定刷子。下例說明了創建一個紅色背景對話的步驟。
首先,給對話基類增加一人成員變量CBursh :
class CMyFormView : public CFormView
{

private :
CBrush m_ brush ; // background brush

} ;
其次, 在類的構造函數中將刷子初始化為所需要的背景顏色。
CMyFormView : : CMyFormView ( )
{
// Initialize background brush .
m_brush .CreateSolidBrush (RGB ( 0, 0, 255 ) )
}
最后,使用ClassWizard處理WM_CTLCOLOR消息并返回一個用來繪畫對話背景的刷子句柄。注意:由于當重畫對話控件時也要調用該函數,所以要檢測nCtlColor參量。
HBRUSH CMyFormView : : OnCtlColor (CDC* pDC , CWnd*pWnd , UINT nCtlColor )
{
// Determine if drawing a dialog box . If we are , return +handle to
//our own background brush . Otherwise let windows handle it .
if (nCtlColor = = CTLCOLOR _ DLG )
return (HBRUSH) m_brush .GetSafeHandle ( ) ;
return CFormView : : OnCtlColor (pDC, pWnd , nCtlColor );
}

?
?2006-10-8 15:55:47??
huzunbo
?
??

?
?
41.如何禁止對話框關閉按鈕和浮動工具條上的系統菜單

1、禁止對話框中的關閉按鈕有二種方法。
第一種方法,用ModiftMenu()涵數來實現:

CMenu* pMenu = this->GetSystemMenu(FALSE);
pMenu->ModifyMenu(SC_CLOSE,MF_BYCOMMAND | MF_GRAYED );

第二種方法,用EnableMenuItem()涵數來實現:

CMenu* pMenu = this->GetSystemMenu(FALSE);
pMenu->EnableMenuItem( SC_CLOSE, MF_BYCOMMAND|MF_GRAYED);

2、禁止浮動工具條上的系統菜單。
新建一個CToolBar的派生類CxxToolBar,在新類中的左鍵雙擊(CxxToolBar::OnLButtonDblClk(...))
和左鍵單擊(CxxToolBar:: OnLButtonDown(...))涵數中分別加入下面代碼既可:
if (IsFloating()) //工具條正在浮動狀態中
{
  CWnd* pMiniFrame;
  CWnd* pDockBar;

  pDockBar = GetParent();
  pMiniFrame = pDockBar->GetParent();

  //去除其上系統菜單
  pMiniFrame->ModifyStyle(WS_SYSMENU, NULL);

  //重繪工具條
  pMiniFrame->ShowWindow(SW_HIDE);
  pMiniFrame->ShowWindow(SW_SHOW);
}

3、禁止窗口最大化按鈕
在PreCreateWindow()涵數中去掉WS_MAXIMIZEBOX風格顯示既可。
BOOL CxxFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
  cs.style &= ~WS_MAXIMIZEBOX;
  return CFrameWnd::PreCreateWindow(cs);
}

42.如何拷貝一個工程的對話框資源到另一個工程中?

 有兩種方法可以實現:
 
 1)你可以直接拷貝resource,用VC++以文本的方式或者直接用文本編輯器打開.rc文件,將有關的片段從
一個工程拷貝到另一個工程.你可以通過查找如下字樣的片段(此片段用來定義對話框資源)來拷貝你要
的部分:
 
 IDD_MYDIALOG_ID DIALOG DISCARDABLE 0, 0, 235, 55
 
 這里的IDD_MYDIALOG_ID是你的對話框的ID,將到此片段結尾的部分全拷下來,通常你還要給新的工程
加一個ID(通過DevStudio的工具或者直接修改resource.h文件).

 2)可以通過DevStudio的copy/paste功能.首先,在編輯器以"auto"模式打開.rc文件,這時resource
正確的顯示出來.然后,選中要拷貝的對話框的ID,在Edit菜單里選Copy或者按住Ctrl+C.然后打開目標
resource文件,在Edit菜單里選Paste或者按住Ctrl+V.

43.如何實現點一下對話框外面的區域,自動隱藏對話框?

 [問題提出]
  如果想在點擊對話框外面的地方使得對話框關閉,該如何做?

 [解決方法]
  試試下面的代碼,原理是在激活對話框時,捕獲鼠標的動作,當鼠標點擊時判斷是否點擊在對話框外,是的話就釋放對話框.

 [程序實現]
  建立名為My的對話框程序.實現如下步驟:
  在MyDlg.h中加入:

  class CShowWindow1Dlg : public CDialog
  {
   // Construction
   public:
     int m_cx;
     int m_cy;
     ......
  };

  在MyDlg.cpp中:

  //定義消息映象,處理鼠標單擊及激活
  BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    //{{AFX_MSG_MAP(CMyDlg)
    ON_WM_LBUTTONDOWN()
    ON_WM_ACTIVATE()
    //}}AFX_MSG_MAP
  END_MESSAGE_MAP()

  void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)
  {
    CRect rect;
    GetClientRect(&rect);
    rect.InflateRect(m_cx, m_cy);
 
    //Release dialog if the user click outside it.
    if(!rect.PtInRect(point))
    {
      EndDialog(IDCANCEL);
    }

    CDialog::OnLButtonDown(nFlags, point);
  }

  void CMyDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
  {
    CDialog::OnActivate(nState, pWndOther, bMinimized);

    if( nState == WA_ACTIVE || nState == WA_CLICKACTIVE)
      SetCapture();
    else
      ReleaseCapture();
  }

  BOOL CMyDlg::OnInitDialog()
  {
    CDialog::OnInitDialog();
    .....
    
    OSVERSIONINFO info;
    memset((char*)&info, 0, sizeof(OSVERSIONINFO));
    info.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    if(GetVersionEx(&info))
    { //we don't run on Win32s, so check only two values
      if(info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
      { //On windows 95
       m_cx = GetSystemMetrics(SM_CXFIXEDFRAME);
       m_cy = GetSystemMetrics(SM_CYFIXEDFRAME);
      }
      else
      { //On NT
       m_cx = GetSystemMetrics(SM_CXDLGFRAME);
       m_cy = GetSystemMetrics(SM_CYDLGFRAME);
      }
    }
  }

   說明:
   1)WM_ACTIVATE消息在ClassWizard中沒有,按如下步驟添加,右擊CMyDlg類,選Add Windows Message Handle,接著在Filter for messages available to中選Window,在New Windows messages/events列表中就會出現WM_ACTIVATE,選中,點擊Add Handler
   2)SM_CXDLGFRAME,SM_CYDLGFRAME  NT中取得有WS_DLGFRAMEstyle風格的窗口的高和寬 95中已經廢棄而采用SM_CX_FIXEDFRAME和SM_CYFIXEDFRAME

44. 初始化應用程序的大小

如果想使應用程序界面(文檔)在開始運行是按你的尺寸展現在屏幕上,
 添加代碼如下:
 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
 {
   int xsize=::GetSystemMetrics(SM_CXSCREEN);
   int ysize=::GetSystemMetrics(SM_CYSCREEN);
   cs.cx=xsize*5/10;
   cs.cy=ysize*5/10;
   cs.x=(xsize-cs.cx)/2;
   cs.y=(ysize-cs.cy)/2; 

 }
 其中的5/10是你的初始界面占屏幕的百分比,可以自己修改。如果想使應用程序大小固定添加cs.style&=~WS_THICKFRAME;

45. 如何得到視圖指針?

[問題提出]
  現在你有一個多線程的Demo,你想在多線程里處理視圖指針里的函數,我們給這個函數起個名字:Put();該如何實現呢?
  //有兩種方法可以實現你的要求:
  //1)第一種方法:
  //要是多線程不是在App.cpp里出現,那么要在多線程的.cpp中加上extern CYourApp theApp;
  //獲得文檔模板:
  POSITION curTemplatePos = theApp.GetFirstDocTemplatePosition();
  CDocTemplate *m_doc=theApp.GetNextDocTemplate(curTemplatePos);

  //獲得文檔:
  curTemplatePos=m_doc->GetFirstDocPosition();
  CYourDoc *m_pdoc=(CA8Doc*)m_doc->GetNextDoc(curTemplatePos);
 
  //獲得視圖:
  curTemplatePos=m_pdoc->GetFirstViewPosition();
  CYourView *m_pview=(CYourView*)m_pdoc->GetNextView(curTemplatePos);

  //調用視圖函數:
  m_pview->Put();

  //2)第二種方法:
  //獲得窗體指針:
  CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;

  //獲得與該窗體符合的視圖:
  CYourView *m_pView = (CYourView *) pFrame->GetActiveView();

  //調用視圖函數:
  m_pView->Put();

46. 如何使我的程序在啟動時不創建一個新文檔?

[問題]
如何使我的程序在啟動時不創建一個新文檔?
[解答]
在程序的InitInstance中的ProcessShellCommand函數之前加入: cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing

47. 如何將標題欄上的右鍵菜單屏蔽掉?

 [解決方法]
  右鍵菜單是系統菜單,只要將其WS_SYSMENU的屬性去掉即可.
 [程序實現]
  int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  {
     ........
  long style = GetWindowLong(m_hWnd, GWL_STYLE);
     style &= ~WS_SYSMENU;
     SetWindowLong(m_hWnd, GWL_STYLE, style);

  return 0;
  }

48.如何全屏顯示(沒有標題,沒有菜單,沒有工具條)

 [解決方法]
  重載CMainFrame的ActivateFrame函數:
  void CMainFrame::ActivateFrame(int nCmdShow)
  {
     CRect cRectdesktop;
     WINDOWPLACEMENT windowplacement;
     ::GetWindowRect(::GetDesktopWindow(),&cRectdesktop);
     ::AdjustWindowRectEx(&cRectdesktop,GetStyle(),TRUE,GetExStyle());
     windowplacement.rcNormalPosition=cRectdesktop;
     windowplacement.showCmd=SW_SHOWNORMAL;
     SetWindowPlacement(&windowplacement);

     CFrameWnd::ActivateFrame(nCmdShow);
  }

49.如何設置有背景顏色的文本
(1)[解決方法]
  用到了CDC::SetBkMode();
 
 [程序實現]
  void CMyView::OnDraw(CDC* pDC)
  {
    CMyDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    CRect rcView;//加這兩句
    GetClientRect(rcView);
    // TODO: add draw code for native data here
    CString str (_T("Perfect Text..."));
    pDC->SetBkMode(TRANSPARENT);
    rcView.OffsetRect (1,1);
    pDC->SetTextColor(RGB (0,0,0));
    pDC->DrawText(str,str.GetLength(),rcView,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    rcView.OffsetRect(-1,-1);
    pDC->SetTextColor(RGB (255,0,0));
    pDC->DrawText(str,str.GetLength(),rcView,DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  }
(2) 建立名為My的SDI或MDI,并響應WM_ERASEBKGND.
  BOOL CMyView::OnEraseBkgnd(CDC* pDC)
  {
   // TODO: Add your message handler code here and/or call default
   CBrush Brush (RGB(114,147,171));
   // Select the brush into the device context .
   CBrush* pOldBrush = pDC->SelectObject(&Brush);
   // Get the area that needs to be erased .
   CRect ViewClip;
   pDC->GetClipBox(&ViewClip);
   //Paint the area.
   pDC->PatBlt(ViewClip.left,ViewClip.top,ViewClip.Width(),ViewClip.Height(),PATCOPY);
   //Unselect brush out of device context .
   pDC->SelectObject (pOldBrush );
   // Return nonzero to half fruther processing .

   return TRUE;
   return CView::OnEraseBkgnd(pDC);
  }
  此方法也適合基類是EditView的SDI或MDI的情況,但是字體的顏色和底色不行.建議用WM_CTLCOLOR.

50.串太長時往讓其末尾顯示一個省略號(在SDI或MDI的View中)

 [問題提出]
  如何在串太長時往讓其末尾顯示一個省略號(在SDI或MDI的View中)?
 [程序實現]
  建立名為My的SDI或MDI工程.
  void CMyView::OnDraw(CDC* pDC)
  {
    CMyDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    pDC->DrawText(CString("It's a long string,so we will add a '...' at the end."),CRect (110, 110, 180, 130),DT_LEFT | DT_END_ELLIPSIS);
    //Add ellpsis to middle of string if it does not fit
    pDC->DrawText(CString("It's a long string,so we will add a '...' at the end."),CRect (110, 140, 300, 160),DT_LEFT | DT_PATH_ELLIPSIS);
  }

?
?2006-10-8 15:56:20??
huzunbo
?
??

?
?
51. 如何獲得其他程序的圖標,并顯示在View中

 [問題提出]
 有的時候,如:類資源管理器會遇到獲得程序圖標并顯示的操作,如何實現呢?
 [解決方法]
 SDK函數SHGetFileInfo來獲得有關文件的很多信息:如大小圖標,屬性,類型等.
 [程序實現]
 建立名為My的SDI工程.在OnPaint()函數中加入:
 void CMyView::OnPaint()
 {
  CPaintDC dc(this); // device context for painting
  HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0);
  if (hIcon && hIcon!=(HICON)-1)
  dc.DrawIcon(10,10,hIcon);

  // TODO: Add your message handler code here
  // Do not call CView::OnPaint() for painting messages
 }
 說明:_T("NotePad.exe")指的是要獲得什么程序的圖標.
 或者在OnDraw()中(此時必須保證沒有OnPaint()函數,想想為何?)
 void CMyView::OnDraw(CDC* pDC)
 {
  CMyDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
  // TODO: add draw code for native data here
  HICON hIcon=:: ExtractIcon(AfxGetInstanceHandle(),_T("NotePad.exe"),0);
  if (hIcon &&hIcon!=(HICON)-1)
  pDC->DrawIcon(10,10,hIcon);
 }

52 .RichEdit
在Dialog(FormView中打開)中加入CRichEdit控件后,這個dialog 為什么打不開如何處理?
 [解決方法]
 在函數:InitInstance的第一句加入AfxInitRichEdit();

53. 如何使FormView中顯示dialog時,不是凹的?

 [問題提出]
 為什么FormView中顯示dialog時,是凹的,能不能不這樣
 [解決方法]
 在Dialog的屬性中:
  增加屬性WS_BORDER  或者 WS_EX_WINDOWEDGE
 用程序實現:
 pView->ModifyStyle(,WS_BORDER) 或者pView->ModifyStyleEx(,WS_EX_WINDOWEDGE )

54. 如何改變窗口標題?

 [問題提出]
  在應用程序的不同運行時期,要反映當前狀態往往會修改應用程序標題.

 [解決方法]
  在MFC類庫中提供了CWnd::SetWindowText函數,通過該函數可以改變任何窗體(包括控件)的標題.
  改變主窗體的標題:
  CWnd *m_pMainWnd;
  m_pMainWnd=AfxGetMainWnd();
  m_pMainWnd->SetWindowText(_T("改變標題"));
  當改變多視MDI的子窗口的標題時,用:
  GetParentFrame()->SetWindowText(_T("MDI Child改變標題"));
  當改變按鈕的標題時(假設按鈕的ID=IDC_BUTTON1):
  GetDlgItem(IDC_BUTTON1)->SetWindowText(_T("Button 改變標題"));
  運行看看.

55.圖標透明

(1).Windows中的圖標其實是有兩個圖像組成的,其中一個用于與它要顯示的位置的圖像做“AND”操作,另一個作“XOR”操作。
透明:用“白色”AND,用“黑色”XOR
反色:用“白色”AND,用“白色”XOR
正常色:用“黑色”AND,用正常顏色XOR.
(2). WIN9X中好像是對像素的操作實現透明的
WIN2K中就有API直接實現透明了!
WIN2K中
GetWindowLong
SetWindowLong
SetLayeredWindowAttributes
三個API就可以實現透明了!
(3)
::DrawIconEx(pDC->GetSafeHdc(),point.x,point.y,icon,icosize,icosize,0,NULL,DI_NORMAL);

56.ASSERT()是干什么用的

ASSERT()是一個調試程序時經常使用的宏,在程序運行時它計算括號內的表達式,如果表達式為FALSE (0), 程序將報告錯誤,并終止執行。如果表達式不為0,則繼續執行后面的語句。這個宏通常原來判斷程序中是否出現了明顯非法的數據,如果出現了終止程序以免導致嚴重后果,同時也便于查找錯誤。例如,變量n在程序中不應該為0,如果為0可能導致錯誤,你可以這樣寫程序:
  ......
  ASSERT( n != 0);
  k = 10/ n;
  ......
  ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略。
  assert()的功能類似,它是ANSI C標準中規定的函數,它與ASSERT的一個重要區別是可以用在Release版本中。

56. 將RADIO控件初始狀態設置成為選中

1、"在OnInitialDialog中用CButton::CheckRadioButton(...)
2、"在OnInitialDialog中用CButton::SetCheck(...)
3、"關聯一個整型值,在構造函數中設為0。

57.獲得視圖

CFrameWnd* pFrameWnd = (CFrameWnd*)theApp.GetMainWnd();
CMyView* pView = (CMyView*)pFrameWnd->GetActiveView();

58.如何得到屏幕的真實尺寸

[問題提出]
我的屏幕是1024*800,如何得到屏幕的真實大小,我用GetSystemMetrics(SM_CYFULLSCREEN)得到的高度總是小于800
[問題解答]
GetSystemMetrics(SM_CYFULLSCREEN)得到的只是屏幕用戶區的大小。要得到屏幕的真實大小需要使用
GetDeviceCaps函數,該API函數原型是這樣的:

int GetDeviceCaps(
 HDC hdc,   // handle to DC
 int nIndex  // index of capability
);
///得到屏幕尺寸的代碼如下
void CMyDlg::OnPaint()
{
  CPaintDC dc(this);
  int cx = ::GetDeviceCaps(dc.m_hDC,HORZRES);///得到寬度
  int cy = ::GetDeviceCaps(dc.m_hDC,VERTRES);///得到高度
  CDialog::OnPaint();

59. 修改標題欄高度

NONCLIENTMETRICS nm
調用SystemParametersInfo(SPI_GETNONCLIENTMETRICS,sizeof(nm),&nm,0)
重設SystemParametersInfo(SPI_SETNONCLIENTMETRICS,sizeof(nm),&nm,0)

60. 如何實現“氣球式”工具提示。

本程序介紹一個與CToolTipCtrl相似的類CTooolTipWnd。
使用該類的方法如下:
1. 增加ToolTipWnd.cpp到工程文件。
2. 在頭文件中添加#include "ToolTipWnd.h" 。 
3. 在類聲明中添加:
CToolTipWnd m_BalloonToolTip;
4. 在OnInitDialog(對話框)或OnInitialUpdate(表單視)中添加下面代碼:
  m_BalloonToolTip.Create(this);
  m_BalloonToolTip.AddTool(GetDlgItem(), , [text color]);
eg.
  m_BalloonToolTip.AddTool(GetDlgItem(IDC_EDIT1),"Tooltip", RGB(255,0,0));
  第三個參數為可選,缺省為RGB(0, 0, 0)。缺省文本顏色可以用SetDefTextColor進行設置。
4. 重載PreTranslateMessage并添加下面代碼:
  if(m_BalloonToolTip) 
    m_BalloonToolTip.RelayEvent(pMsg);

?
?2006-10-8 15:56:44??
huzunbo
?
??

?
?
61. dlg 上建立View的方法:

OnInitDialog()
{
 CDialog:;OnInitDialog();

CRect rectWindows;
GetWinodwRect(&rectWindows);
CRuntimeClass *pViewClass=RUNTIME_CLASS(CXXXView);
CCreateContext *pContext=new CCreateContext;
pContext->m_pCurrentDoc=NULL;
pContext->m_pCurrentFrame=NULL;
pContext->m_pLastView=NULL;
pContext->m_pNewDocTemplate=NULL;
pContext->m_pNewViewClass=pViewClass;

CWnd *pWnd=DYNAMIC_DOWNCAST(CWnd,pviewClass->CreateObject());
pWnd->Create(NULL,NULL,AFX_WS_DEFAULT_VIEW,CRect(0,0,0,0),this,pContext);
delete pContext;
CXXXView *pView=DYUNAMIC_DOWNCAST(CXXXView,pWnd);
...............
}

62. 窗口最大化、最小化及關閉的消息是什么?如何截獲?

最大化、最小化將發送WM_SYSCOMMAND消息。要處理該消息,可以這么做:
  1、在Form的頭文件中添加:
   void __fastcall RestrictMinimizeMaximize(TMessage &Msg);
  
   BEGIN_MESSAGE_MAP
   MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, RestrictMinimizeMaximize)
   END_MESSAGE_MAP(TForm)
  2、在Form的單元文件中添加:
  
   void __fastcall TForm1::RestrictMinimizeMaximize(TMessage& Msg)
   {
   if (Msg.WParam == SC_MINIMIZE)
   {
   //catches minimize...
   }
   else if (Msg.WParam == SC_MAXIMIZE)
   {
   //catches maximize...
   }
   TForm::Dispatch(&Msg);
   // or "else TForm::Dispatch(&Msg)" to trap
   }
  關閉窗口的消息為WM_CLOSE,C++Builder提供了OnClose事件。

63. 如何遍歷整個目錄樹查找文件
  
在應用程序的開發過程中,會遇到如何查找某一文件以確定此文件路徑的問題。利用CFileFind類可以比較方便地在當前目錄下進行文件查找,但卻不能對其子目錄中的文件進行搜尋。而實際應用中往往需要對某一整個目錄樹,甚至是整個C盤或D盤驅動器進行文件搜尋。通過實踐,我們在Visual C++ 6.0中編程實現了如何遍歷任意目錄樹,以查找某一特定的文件。
  在下面的具體陳述中可以看到,在確定要查找的文件名和要進行搜索的目錄的名稱后,將調用函數Search_Directory進行文件的查找。首先依次查找當前目錄下的每一個實體(文件或是子目錄),如果是某一子目錄,則進入該子目錄并遞歸調用函數Search_Dirctory進行查找,查找完畢之后, 再返回上一級目錄;如果不是子目錄而是某一文件,則判斷其是否就是我們要查找的文件,如果是則輸出其完整的文件路徑。這樣,通過Search_Directory函數的反復遞歸調用,就可以實現對整個目錄,包括子目錄的遍歷搜索。下面將舉例詳細講述如何在VC++中編程實現在整個目錄樹中的文件查找。
  1. 在Visual C++ 6.0(VC++ 5.0與之類似)中用默認方式創建了一基于對話框的應用程序Search。在主窗口對話框上放置一命令按鈕,其Caption為“Search File”,ID為ID_BUTTON_SEARCH。單擊此按鈕將完成文件的查找工作。
  2. 利用ClassWizard為“Search File”按鈕的BN_CLICKED 事件添加處理函數OnButtonSearch,代碼如下:

#include 〈direct.h〉
#include 〈io.h〉
void CSearchDlg::OnButtonSearch()
{
  // TODO: Add your control notification handler code here
 
  char szFilename[80];
  // 字符串 szFilename 表示要查找的文件名

  strcpy(szFilename,"Mytext.txt");

  _chdir("d:\\"); // 進入要查找的路徑(也可為某一具體的目錄)
  // 查找文件, 如果查到則顯示文件的路徑全名
  Search_Directory(szFilename);
  // 為CSearchDlg類的一成員函數
  MessageBox(″查找文件完畢!″);
  // 顯示查找完畢的信息
}


  3. 在CSearchDlg類中增加成員函數Search_Directory,它將完成具體的文件查找工作,代碼如下:
void CSearchDlg::Search_Directory(char* szFilename)
{
  long handle;
  struct _finddata_t filestruct;
  //表示文件(或目錄)的信息
  char path_search[_MAX_PATH];
  //表示查找到的路徑結果
  // 開始查找工作, 找到當前目錄下的第一個實體(文件或子目錄),
  // "*"表示查找任何的文件或子目錄, filestruct為查找結果
  handle = _findfirst("*", &filestruct);
  // 如果handle為-1, 表示當前目錄為空, 則結束查找而返回
  if((handle == -1)) return;
  // 檢查找到的第一個實體是否是一個目錄(filestruct.name為其名稱)
  if( ::GetFileAttributes(filestruct.name) & FILE_ATTRIBUTE_DIRECTORY )
  {
   // 如果是目錄, 則進入該目錄并遞歸調用函數Search_Dirctory進行查找,
   // 注意: 如果目錄名的首字符為'.'(即為"."或".."), 則不用進行查找
   if( filestruct.name[0] != '.' )
   {
     _chdir(filestruct.name);
     Search_Directory(szFilename);
     // 查找完畢之后, 返回上一級目錄
     _chdir("..");
   }
  }
  else // 如果第一個實體不是目錄, 則檢查是否是要查找的文件
  {
   // stricmp對兩字符串進行小寫形式的對比, 返回為0表示完全一致
   if( !stricmp(filestruct.name, szFilename) )
   {
     // 先獲得當前工作目錄的全路徑
     _getcwd(path_search,_MAX_PATH);
     // 再獲得文件的完整的路徑名(包含文件的名稱)
     strcat(path_search,"\\");
     strcat(path_search,filestruct.name);
     MessageBox(path_search); //輸出顯示
   }
  }
  // 繼續對當前目錄中的下一個子目錄或文件進行與上面同樣的查找
  while(!(_findnext(handle,&filestruct)))
  {
   if( ::GetFileAttributes(filestruct.name) & FILE_ATTRIBUTE_DIRECTORY )
   {
     if(*filestruct.name != '.')
     {
      _chdir(filestruct.name);
      Search_Directory(szFilename);
      _chdir("..");
     }
   }
   else
   {
     if(!stricmp(filestruct.name,szFilename))
     {
      _getcwd(path_search,_MAX_PATH);
      strcat(path_search,"\\");
      strcat(path_search,filestruct.name);
      MessageBox(path_search);
     }
   }
  }
  _findclose(handle);
  // 最后結束整個查找工作
}
  這樣我們就可以對整個目錄進行遍歷搜索,查找某一特定的文件,并輸出顯示其完整的文件路徑。以上的程序在Visual C++ 6.0中已調試通過。

64. Richedit control的設置背景圖片辦法

1:繼承CRichEditCtrl::OnEraseBkgnd(CDC* pDC)消息事件中,給Richedit控件繪制上背景圖片:m_bmpBackground.DrawDIB(pDC, 0, 0, rc.Width(), rc.Height());當然也可以通過subclass richedit window之后,在回調函數中處理WM_ERASEBKGND消息。
2:設置了Richedit控件的透明屬性;
3:依照kenwhale所說的,Hook了GDI32.DLL中的ExtTextOut函數,將RichEdit的text-output options去除ETO_OPAQUE style
。綜上所述,即可實現RichEdit控件的背景圖片效果。
據此,我還實現了RichEdit控件背景繪制AVI動畫效果。

65. MFC程序中如何創建多級目錄

BOOL mkdirEx(const char* lpPath)
{
CString pathname = lpPath;
if(pathname.Right(1) != "\")
pathname += "\" ;
int end = pathname.ReverseFind('\');
int pt = pathname.Find('\');
if (pathname[pt-1] == ':')
pt = pathname.Find('\', pt+1);
CString path;
while(pt != -1 && pt<=end)
{
path = pathname.Left(pt+1);
if(_access(path, 0) == -1)
_mkdir(path);
pt = pathname.Find('\', pt+1);
}
return true;
}

66. 解決外部符號錯誤:_main,_WinMain@16,__beginthreadex

在創建MFC項目時, 不使用MFC AppWizard向導, 如果沒有設置好項目參數, 就會在編譯時產生很多連接錯誤, 如error LNK2001錯誤, 典型的錯誤提示有:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol
_WinMain@16
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
下面介紹解決的方法:
1). Windows子系統設置錯誤, 提示:
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Windows項目要使用Windows子系統, 而不是Console, 可以這樣設置:
[Project] --> [Settings] --> 選擇"Link"屬性頁,
在Project Options中將/subsystem:console改成/subsystem:windows
2). Console子系統設置錯誤, 提示:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol
_WinMain@16
控制臺項目要使用Console子系統, 而不是Windows, 設置:
[Project] --> [Settings] --> 選擇"Link"屬性頁,
在Project Options中將/subsystem:windows改成/subsystem:console
3). 程序入口設置錯誤, 提示:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol
_WinMain@16
通常, MFC項目的程序入口函數是WinMain, 如果編譯項目的Unicode版本, 程序入口必須改為wWinMainCRTStartup, 所以需要重新設置程序入口:
[Project] --> [Settings] --> 選擇"C/C++"屬性頁,
在Category中選擇Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可
4). 線程運行時庫設置錯誤, 提示:
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex
這是因為MFC要使用多線程時庫, 需要更改設置:
[Project] --> [Settings] --> 選擇"C/C++"屬性頁,
在Category中選擇Code Generation,
再在Use run-time library中選擇Debug Multithreaded或者multithreaded
其中,
Single-Threaded單線程靜態鏈接庫(release版本)
Multithreaded多線程靜態鏈接庫(release版本)
multithreaded DLL多線程動態鏈接庫(release版本)
Debug Single-Threaded單線程靜態鏈接庫(debug版本)
Debug Multithreaded多線程靜態鏈接庫(debug版本)
Debug Multithreaded DLL多線程動態鏈接庫(debug版本)
單線程: 不需要多線程調用時, 多用在DOS環境下
多線程: 可以并發運行
靜態庫: 直接將庫與程序Link, 可以脫離MFC庫運行
動態庫: 需要相應的DLL動態庫, 程序才能運行
release版本: 正式發布時使用
debug版本: 調試階段使用
67. 創建包含多個子目錄的目錄
void CreateAllDirectories(CString strDir)
{
//remove ending / if exists
if(strDir.Right(1)=="\\")
 strDir=strDir.Left(strDir.GetLength()-1);

// base case . . .if directory exists
if(GetFileAttributes(strDir)!=-1)
 return;

// recursive call, one less directory
int nFound = strDir.ReverseFind('\\');
CreateAllDirectories(strDir.Left(nFound));

// actual work
CreateDirectory(strDir,NULL);
}
68. ReverseFind()
#include <STDIO.H>
#include <AFX.H>
int main()
{
  CString s;
  s.Format("abcdefghijk");
  int nPos = s.ReverseFind('a');
  printf("nPos is %d\n",nPos);
  return 0;
}
其中,'a'對應的nPos是0,'h'對應的nPos是7,以此類推。但是:s.ReverseFind('a')和s.Find('a')的結果是一樣的。
問題是:ReverseFind() 和 Find() 有什么區別呢:
對于ReverseFind(),查找順序是從后往前,找到后的nPos是按前后順序排列的。
而Find()是從前往后查的,找到后的nPos也是按前后順序排列的。
69. MDI中如何只屏蔽掉子框架的右上角的關閉按鈕
int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
    return -1;
。。。
  CMenu* pSysMenu = GetSystemMenu(FALSE);
  pSysMenu->EnableMenuItem(SC_CLOSE,MF_BYCOMMAND |MF_DISABLED|MF_GRAYED);
  return 0;
}
70. 程序如何刪除自己
/
 
int WINAPI WinMain(HINSTANCE h, HINSTANCE b, LPSTR psz, int n) {
 
// Is this the Original EXE or the clone EXE?
// If the command-line 1 argument, this is the Original EXE
// If the command-line >1 argument, this is the clone EXE
 
if (__argc == 1) {
 
// Original EXE: Spawn clone EXE to delete this EXE
// Copy this EXEcutable image into the user''s temp directory
 
TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];
GetModuleFileName(NULL, szPathOrig, _MAX_PATH);
GetTempPath(_MAX_PATH, szPathClone);
GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);
CopyFile(szPathOrig, szPathClone, FALSE);
 
//***注意了***:
// Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE
HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL, OPEN_EXISTI
NG, FILE_FLAG_DELETE_ON_CLOSE, NULL);
 
// Spawn the clone EXE passing it our EXE''s process handle
// and the full path name to the Original EXE file.
TCHAR szCmdLine[512];
HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId());

wsprintf(szCmdLine, __TEXT("%s %d \"%s\""), szPathClone, hProcessOrig, szPat
hOrig);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
CloseHandle(hProcessOrig);
CloseHandle(hfile);
 
// This original process can now terminate.
} else {
// Clone EXE: When original EXE terminates, delete it
HANDLE hProcessOrig = (HANDLE) _ttoi(__targv[1]);
WaitForSingleObject(hProcessOrig, INFINITE);
CloseHandle(hProcessOrig);
DeleteFile(__targv[2]);
// Insert code here to remove the subdirectory too (if desired).
 
// The system will delete the clone EXE automatically
// because it was opened with FILE_FLAG_DELETE_ON_CLOSE
}
return(0);
}
  這一段程序思路很簡單:不是不能在運行時直接刪除本身嗎?好,那么程序先復制(CLONE)一個自己,用復制品起動另一個進程,然后自己結束運行,則原來的EXE文件不被系統保護.這時由新進程作為殺手刪除原來的EXE文件,并且繼續完成程序其他的功能。

  新進程在運行結束后,復制品被自動刪除。這又是值得介紹的一個把戲了,注意:

// Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE
HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL,OPEN_EXISTIN
G, FILE_FLAG_DELETE_ON_CLOSE, NULL);
  這里面的FILE_FLAG_DELETE_ON_CLOSE標志,這個標志是告訴操作系統,當和這個文件相關的所有句柄都被關閉之后(包括上面這個CREATEFILE創建的句炳),就把這個文件刪除。幾乎所有的臨時文件在創建時,都指明了這個標志。另外要注意的是:在復制品進程對原始程序操刀之前,應該等待原進程退出.在這里用的是進程同步技術.用HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,GetCurrentProcessId());得到原進程句柄.SYNCHRONICE標志在NT下有效,作用是使OpenProcess得到的句柄可以做為同步對象.復制品進程用WaitForSingleObject函數進行同步,然后一個DeleteFile,以及進行其它銷毀證據(比如刪目錄)的工作,一切就完事了。
 
  程序是基于CONSOLE的,通過傳入的參數確定是原始的進程還是復制品新進程,并且得到需要操作的目標文件的信息(主要是路徑),復制品放在系統的TEMP目錄(GetTempPath得到),你也可以隨便找個你認為安全的地方(比如:WINDOWS\SYSTEM32等等)。這里面沒有甚么深的技術.再看其他的一些實現刪除自己的例子,比如說在進程退出前,用fwrite等方法輸出一個.BAT文件,在里面寫幾句DEL,然后WINEXEC一下這個BAT文件即可.玩兒過DOS的蟲蟲大多都會。

?
71. 隱藏標題欄和菜單欄
隱藏標題欄 ModifyStyle(WS_CAPTION,0)
隱藏菜單欄 SetMenu(NULL)
72. InflateRect
InflateRect這個函數用于增大或減小一個矩形的大小.
如m_graphRect.InflateRect(-70, -30, -30, -50);
將矩形左邊坐標加70,上面加30,右邊減30,下面減50。
73. 怎么讓無模式對話框顯示在主窗口后面
要解決這個問題的關鍵在于CDialog的Create并不能建立一個無屬主的窗口.必須用另外方式建窗口. 
  
 比如你的對話框類叫CDlgNoOwner,在CMainFrame中加一個CDlgNoOwner類的成員變量, 
 彈出這個對話框的消息處理函數為 
  
 void  CMainFrame::OnNoowner()  
 { 
CDlgNoOwner  *m_dlgTest=new  CDlgNoOwner(this); 
 HWND  hwndDlg=::CreateDialog(AfxGetInstanceHandle(),MAKEINTRESOURCE(CDlgNoOwner::IDD),NULL/*owner*/,NULL/*dlgproc*/); 
 //注意此處DLGPROC為NULL,并不要緊,因為接下要subclass啦 
 m_dlgTest->SubclassWindow  (hwndDlg);//掛接到成員變量! 
 m_dlgTest->ShowWindow  (SW_SHOW); 
 //這時可以看到一個"自由"的對話框彈出,和你的主窗口是平起平坐的. 
 } 
  
 當然不要忘了在對話框關閉時DestroyWindow()..那都是在對話框類中的標準處理了.
74. 隱藏窗口(子窗口沒有焦點時)

在程序啟動時  InitDialog  中使用  SetWindowPos  將窗體設置到屏幕以外
然后再隱藏
1.在OnInitDialog()函數里設置定時器:(WINDOWS  API里面響應消息WM_INITDIALOG) 
  
 SetTimer(1,  1,  NULL); 
  
 2.添加處理WM_TIMER的消息處理函數OnTimer,添加代碼: 
  
 if(nIDEvent  ==  1) 
  
 { 
  
 DeleteTimer(1); 
  
 ShowWindow(SW_HIDE); 
  
 } 
75.修改視圖背景
How do I change the background color of a view?

To change the background color for a CView, CFrameWnd, or CWnd object, process the WM_ERASEBKGND message. The following code shows how:

BOOL CSampleView::OnEraseBkgnd(CDC* pDC)
{
  // Set brush to desired background color.
  CBrush backBrush(RGB(255, 128, 128));
  // Save old brush.
  CBrush* pOldBrush = pDC->SelectObject(&backBrush);
  CRect rect;
  pDC->GetClipBox(&rect);   // Erase the area needed.
  pDC->PatBlt(rect.left, rect.top, rect.Width(),
  rect.Height(), PATCOPY);
  pDC->SelectObject(pOldBrush);
  return TRUE;
}

I solved the problem like this:

HBRUSH dlgtest::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
  switch (nCtlColor)
  {
    case CTLCOLOR_BTN:
    case CTLCOLOR_STATIC:
    {
      pDC->SetBkMode(TRANSPARENT);
    }
    case CTLCOLOR_DLG:
    {
      CBrush*   back_brush;
      COLORREF  color;
      color = (COLORREF) GetSysColor(COLOR_BTNFACE);
      back_brush = new CBrush(color);
      return (HBRUSH) (back_brush->m_hObject);
    }
  }
  return(CFormView::OnCtlColor(pDC, pWnd, nCtlColor));
}
76. 如何實現點擊對話框外的地方使對話框到主窗口的后面
只能將桌面做為父窗口
pMDlg = new CMDlg;
pMDlg->Create(IDD_M_DIALOG,CWnd::GetDesktopWindow()/* 設置父窗口 */);
pMDlg->ShowWindow(SW_SHOW);
然后在任務欄里隱藏對話框程序
如何讓對話框應用程序在在任務欄上不出現,并且不隱藏窗口。
[解決方法]
  把對話框的擴展屬性修改成為WS_EX_TOOLWINDOW。
[程序實現]
  把對話框的屬性設置成為toolwindow,然后在需要的地方執行本代碼。
  DWORD Style = ::GetWindowLong(AfxGetMainWnd()->m_hWnd,GWL_EXSTYLE);
  Style = WS_EX_TOOLWINDOW ;
  AfxGetMainWnd()->ShowWindow(FALSE);
  ::SetWindowLong(AfxGetMainWnd()->m_hWnd,GWL_EXSTYLE,Style);
  AfxGetMainWnd()->ShowWindow(TRUE);

?

77. 想在程序一啟動時就自動關閉窗口,不在任務欄里顯示
用CTRL+W打開ClassWizard;
點擊Class Info頁,類名是工程名Dlg,
再在左下方的"Filter"中選擇"Windows";
回到Message Maps頁,就可以看到消息中有WM_WINDOWPOSCHANGING,
加入代碼,如上所示.
這樣運行*.EXE,不但看不到主界面,任務欄也沒有,就是任務管理器中的"應用程序"中也不列出,那該如何關閉它?
在任務管理器的"進程"中可以找到它,這是黑客程序常用的方法.
如果需要的話,連"進程"中也看不到.這樣要終止它就是問題了.
78.修改打印預覽的ToolBar

為AFX_IDD_PREVIEW_TOOLBAR這個ID創建一個DialogBar。則系統就會用新創建的DialogBar代替系統默認的那個

79. 如何實現SDI與MDI的轉換?

我想將一個編好的SDI應用程序轉換為MDI,很明顯要有多處的改變。
你可以這樣做:建立一個繼承于CMDIChidWnd的類,不防設為CChldFrm.在CWinApp中作如下變化。

InitInstance()
{
. ...
  //instead of adding CSingleDocTemplate
  // Add CMultiDocTemplate.
  pDocTemplate = new CMultiDocTemplate(
      IDR_MAINFRAME,
      RUNTIME_CLASS(CSDIDoc),
      RUNTIME_CLASS(CChldFrm),
// For Main MDI Frame change this frame window from
// CFrameWnd derivative ( i.e. CMainFrame )
// to your CMDIChildWnd derived CChldFrm.
      RUNTIME_CLASS(CSDIView));
/// After this it is required to create the main frame window
// which will contain all the child windows. Now this window is
// what was initially frame window for SDI.
  CMainFrame* pMainFrame = new CMainFrame;
  if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
      return FALSE;
   m_pMainWnd = pMainFrame;
.....
}
在從CMDIFrameWnd中繼承的類CMainFrame代替CFramWnd后,所有的類都將從CMDIFrame繼承,而不是CFrameWnd,編譯運行后你就會發現程序已經從SDI變換到MDI。
注意:在CMainFram中必須將構造函數從private改為public.否則會出錯。

80. CDC中的豎排文本?

在OnDraw成員函數中我想讓文本豎直對齊,但CDC類似乎不支持該處理
方法一:如果你的豎直對齊是指旋轉文本的話,下面的代碼會對你有幫助:該代碼檢查一個Check box控制,查看文本是否需要旋轉.
// m_pcfYTitle is a CFont* to the selected font.
// m_bTotateYTitle is a bool (==TRUE if rotated)
void CPage1::OnRotateytitle()
{
LOGFONT lgf;
m_pcfYTitle->GetLogFont(&lgf);
m_bRotateYTitle=
    ((CButton*)GetDlgItem(IDC_ROTATEYTITLE))->GetCheck()>0;
// escapement is reckoned clockwise in 1/10ths of a degree:
lgf.lfEscapement=-(m_bRotateYTitle*900);
m_pcfYTitle->DeleteObject();
m_pcfYTitle->CreateFontIndirect(&lgf);
DrawSampleChart();
}
注意如果你從CFontDialog中選擇了不同的字體,你應該自己設定LOGFONT的lfEscapement成員.將初始化后的lfEscapement值傳到CFontDialog中.
方法二:還有一段代碼可參考:
LOGFONT LocalLogFont;
strcpy(LocalLogFont.lfFaceName, TypeFace);
LocalLogFont.lfWeight = fWeight;
LocalLogFont.lfEscapement = Orient;
LocalLogFont.lfOrientation = Orient;
if (MyFont.CreateFontIndirect(&LocalLogFont))
  {
  cMyOldFont = cdc->SelectObject(&MyFont);
  }

81. 如何用鍵盤滾動分割的視口?

我的問題是當我用鼠標滾動分割窗口時,視口滾動都很正常,但用鍵盤時,卻什么也沒有發生.
在你的視圖繼承類中加入如下兩個函數,假定該類為CScrollerView:
void CScrollerView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    BOOL processed;
    for (unsigned int i=0;i< nRepCnt&&processed;i++)
        processed=KeyScroll(nChar);
    if (!processed)
      CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}
BOOL CScrollerView::KeyScroll(UINT nChar)
{
    switch (nChar)
        {
        case VK_UP:
            OnVScroll(SB_LINEUP,0,NULL);
            break;
        case VK_DOWN:
            OnVScroll(SB_LINEDOWN,0,NULL);
            break;
        case VK_LEFT:
            OnHScroll(SB_LINELEFT,0,NULL);
            break;
        case VK_RIGHT:
            OnHScroll(SB_LINERIGHT,0,NULL);
            break;
        case VK_HOME:
            OnHScroll(SB_LEFT,0,NULL);
            break;
        case VK_END:
            OnHScroll(SB_RIGHT,0,NULL);
            break;
        case VK_PRIOR:
            OnVScroll(SB_PAGEUP,0,NULL);
            break;
        case VK_NEXT:
            OnVScroll(SB_PAGEDOWN,0,NULL);
            break;
        default:
            return FALSE; // not for us
               // and let the default class
               // process it.
        }
  return TRUE;
}

82. 如何改變默認的光標形狀?

我試著將光標改變為其它的形狀和顏色,但卻沒有變化.
在對話框/窗口/你需要的地方加上對WM_SETCURSOR消息的處理.
BOOL MyDialog::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
  // TOD Add your message handler code here and/or call default
  ::SetCursor(AfxGetApp()->LoadCursor(IDC_MYCURSOR));
  return TRUE;
  //return CDialog::OnSetCursor(pWnd, nHitTest, message);
}
你沒有成功的原因是因為窗口類光標風格不能為NULL.

83. 如何選擇CTreeCtrl中的節點文本進行編輯?

在向CTreeCtrl中加入一項后,有什么方法可以編輯該節點的文本呢?
首先設置你的CcompTreeCtrl具有TVS_EDITLABELS屬性.在設計時用控件屬性來設置在運行時用GetStyle()/SetStyle()成員函數來設置.然后請看下述代碼:
HTREEITEM CCompTreeCtrl::AddSet()
{
static int setCnt =3D 1;
HTREEITEM hItem;
CString csSet;
//create text for new note: New Set 1, New Set 2 ...
csSet.Format( _T( "New Set %d" ), setCnt++ );
hItem =3D InsertItem( csSet, IMG_CLOSEDFOLDER, IMG_CLOSEDFOLDER );
if( hItem !=3D NULL )
      EditLabel( hItem );
return hItem;
}

84. CListCtrl中選擇變化時如何獲得通知?

我在Report View中使用了一個CListCtrl(自繪制類型),我想知道什么時候選擇項發生了改變.
在選擇項變化時,可以使用按鈕有效或失效,按如下操作:
 加入LVN_ITEMCHANGED消息處理.
void CYourClassNameHere::OnItemchangedEventList(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
*pResult = 0;
if (pNMListView->uChanged == LVIF_STATE)
{
 if (pNMListView->uNewState)
  GetDlgItem(IDC_DELETE)->EnableWindow(TRUE);
 else
  GetDlgItem(IDC_DELETE)->EnableWindow(FALSE);
}
}

85. List控件中整欄選擇?

我在處理List控件時碰到了麻煩,我想創建一個ListView,來依據Tree控件的選擇同時在ListView和ReportView中顯示列表的信息.以下是相關的代碼:
// Set full line select
ListView_SetExtendedListViewStyle(m_plstCustomers->GetSafeHwnd(),
LVS_EX_FULLROWSELECT);
按如下方法處理:
// -------------------- begin of snippet --------------------------------
bool CCommCtrlUtil32::ListCtrl_ModifyExtendedStyle(CListCtrl& p_rListCtrl,
                  const DWORD p_dwStyleEx,
                  const bool p_bAdd)
{
  HWND t_hWnd = p_rListCtrl.GetSafeHwnd();
  DWORD t_dwStyleEx = ListView_GetExtendedListViewStyle(t_hWnd);
  if(p_bAdd)
  {
    if(0 == (p_dwStyleEx & t_dwStyleEx))
    {
      // add style
      t_dwStyleEx |= p_dwStyleEx;
    }
  }
  else
  {
    if(0 != (p_dwStyleEx & t_dwStyleEx))
    {
      // remove style
      t_dwStyleEx &= ~p_dwStyleEx;
    }
  }
  ListView_SetExtendedListViewStyle(t_hWnd, t_dwStyleEx);
  return true;
}

86. 如何限制mdi子框架最大化時的大小?

用ptMaxTrackSize代替prMaxSize,如下所示:
void CChildFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
{
  // TOD Add your message handler code here and/or call default
  CChildFrame::OnGetMinMaxInfo(lpMMI);
  lpMMI->ptMaxTrackSize.x = 300;
  lpMMI->ptMaxTrackSize.y = 400;
}

87. 怎樣實現3D效果?

在對話框中怎樣實現Edit和Listboxes控件的3D效果?(環境95/NT VC5.0)
1). 使用帶WS_EX_CLIENTEDGE標志的::CreateWindowEx來替換::CreateWindow 或者用CWnd::CreateEx替換CWnd::Create.
2).在建立控件之后,調用ModifyStyleEx(0, WS_EX_CLIENTEDGE).

88. How do I update the text of a pane in a status bar?

By default, a CStatusBar pane is not enabled when the pane is created. To activate a pane, you must call the ON_UPDATE_COMMAND_UI() macro for each pane on the status bar and update the panes. Because panes do not send WM_COMMAND messages, you cannot use ClassWizard to activate panes; you must type the code manually. For example, suppose one pane has ID_INDICATOR_PAGE as its identifier and that it contains the current page number in a document. To make the ID_INDICATOR_PAGE pane display text, add the following to a header file (probably the MAINFRM.H file):

afx_msg void OnUpdatePage(CCmdUI *pCmdUI);

Add the following to the application message map:

ON_UPDATE_COMMAND_UI(ID_INDICATOR_PAGE, OnUpdatePage)

Add the following to a source code file (probably MAINFRM.CPP):

void CMainFrame::OnUpdatePage(CCmdUI *pCmdUI)
{
  pCmdUI->Enable();
}

To display text in the panes, either call SetPaneText() or call CCmdUI::SetText() in the OnUpdate() function. For example, you might want to set up an integer variable m_nPage that contains the current page number. Then, the OnUpdatePage() function might read as follows:

void CMainFrame::OnUpdatePage(CCmdUI *pCmdUI)
{
  pCmdUI->Enable();
  char szPage[16];
  wsprintf((LPSTR)szPage, "Page %d", m_nPage);
  pCmdUI->SetText((LPSTR)szPage);
}

This technique causes the page number to appear in the pane during idle processing in the same manner that the application updates other indicators.

89. 動態修改對話框的大小

 [問題提出]
  關于如何動態改變對話框的大小,我做了個Demo,大家看看.

 [程序實現]
   //本函數使用方法:
   //第一個參數:如果是TRUE表示顯示擴展的對話框,如果是FALSE,表示縮小對話框。
   //第二個參數:表示本對話框的HWND,
   //第三個參數:表示縮小后大小的控件的ID
  void COptionDlg::ExpandBox(BOOL fExpand, HWND hwnd, int nIDDefaultBox)
  {
     CWnd *pWndBox=GetDlgItem(nIDDefaultBox);
     RECT rcDefaultBox,rcChild,rcIntersection,rcWnd;
     pWndBox->GetWindowRect(&rcDefaultBox);
     HWND hwndChild = ::GetTopWindow(hwnd);
     for (; hwndChild != NULL; hwndChild = ::GetNextWindow(hwndChild,GW_HWNDNEXT))
     {
         ::GetWindowRect(hwndChild, &rcChild);
         if (!IntersectRect(&rcIntersection, &rcChild, &rcDefaultBox))
              ::EnableWindow(hwndChild, fExpand);
     }
     ::GetWindowRect(hwnd, &rcWnd);
     if (GetWindowLong(hwnd, GWL_USERDATA) == 0)
     {
         SetWindowLong(hwnd, GWL_USERDATA,
              MAKELONG(rcWnd.right - rcWnd.left,
              rcWnd.bottom - rcWnd.top));
         ::ShowWindow(pWndBox->m_hWnd, SW_HIDE);
     }
     ::SetWindowPos(hwnd, NULL, 0, 0,
         rcDefaultBox.right - rcWnd.left,
         rcDefaultBox.bottom - rcWnd.top,
         SWP_NOZORDER | SWP_NOMOVE);
     if(fExpand)
     {
         DWORD dwDims = GetWindowLong(hwnd, GWL_USERDATA);
         ::SetWindowPos(hwnd, NULL, 0, 0,
              LOWORD(dwDims), HIWORD(dwDims), SWP_NOZORDER | SWP_NOMOVE);
         ::SendMessage(hwnd, DM_REPOSITION, 0, 0);
     }
  }

90. 用DoModal()調用模態對話框,總是顯示在正中,我重載了它,并添加了MoveWindow(),可是其m_hWnd是一串零,調用失敗。請問有何方法可使調用的模態對話框顯示于自定義位置?多謝
  我不清楚你把MoveWindow()加在什么地方了,正確的方法是在OnInitDialog中添加MoveWindow,如:
   MoveWindow(0, 1, 300, 200);
  需要注意的是前兩個參數不能都為0。如果你確實希望把窗口放在(0, 0)處,可以在對話框設計窗口的屬性中選中Absolute Align,然后再加入
   MoveWindow(0, 0, 300, 200);
  為什么會是這樣?你看了MFC的源程序就會明白。原來MFC在調用你的OnInitDialog之后,會調用CDialog::CheckAutoCenter()(在dlgcore.cpp中)檢查是否需要將窗口居中,你看了這個函數后就明白為什么需要上面那么做了。

轉載于:https://www.cnblogs.com/lscheng/archive/2011/10/31/2230704.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/380129.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/380129.shtml
英文地址,請注明出處:http://en.pswp.cn/news/380129.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NHibernate初學體驗進階篇

在上篇《NHibernate初學體檢記》中&#xff0c;我參照NHibernate官方快速指南寫了兩個示例項目&#xff0c;在示例2的源碼中充斥了如下類似的代碼&#xff1a;<?XML:NAMESPACE PREFIX O />Configuration cfg new Configuration(); cfg.AddAssembly("…

eclipse快捷鍵

Java開發工具(Eclipse的視窗和視圖概述) A:視窗 每一個基本的窗體被稱為視窗 PackageExplorer 顯示項目結構&#xff0c;包&#xff0c;類&#xff0c;及資源Outline 顯示類的結構&#xff0c;方便查找&#xff0c;識別&#xff0c;修改Console 程序運行的結果在該窗口顯示Hie…

【匯編語言】除法(DIV/IDIV)

除法&#xff08;DIV/IDIV&#xff09; 目錄除法&#xff08;DIV/IDIV&#xff09;DIV(unsigned divide)無符號數除法IDIV(signed divide)有符號數除法DIV(unsigned divide)無符號數除法 格式&#xff1a;DIV SRC 操作&#xff1a; SRCSRCSRC為字節時&#xff0c;(AL)←(AX)/…

java 方法 示例_Java集合syncedSortedSet()方法與示例

java 方法 示例集合類SynchronizedSortedSet()方法 (Collections Class synchronizedSortedSet() method) synchronizedSortedSet() method is available in java.util package. java.util軟件包中提供了sharedSortedSet ()方法 。 synchronizedSortedSet() method is used to …

遠控免殺專題(17)-Python-Rootkit免殺

免殺能力一覽表 幾點說明&#xff1a; 1、上表中標識 √ 說明相應殺毒軟件未檢測出病毒&#xff0c;也就是代表了Bypass。 2、為了更好的對比效果&#xff0c;大部分測試payload均使用msf的windows/meterperter/reverse_tcp模塊生成。 3、由于本機測試時只是安裝了360全家桶…

項目管理軟件應用淺析(轉)

項目管理是在一定的約束條件下&#xff0c;以高效率地實現項目業主的目標為目的&#xff0c;以項目經理個人負責制為基礎和以項目為獨立實體進行經濟核算&#xff0c;并按照項目內在的邏輯規律進行有效的計劃、組織、協調、控制的系統管理活動。項目管理的核心技術是網絡計劃技…

斜視角的討論(轉)

http://school.ogdev.net/listshow.asp?page4&typeid0&categoryid5&id0&ListType2 目 錄 1.1 地圖和地表 1.2 斜視角游戲中的視角 1.3 Tile圖片的拼接 1.4 不同地表間的過渡 1.5 地圖數據結構的定義 --------------------------------------------------…

計算機網絡(湖科大教書匠)

計算機網絡&#xff08;湖科大教書匠&#xff09; 本文檔為教學視頻【計算機網絡微課堂&#xff08;有字幕無背景音樂版&#xff09;_嗶哩嗶哩_bilibili】的摘錄 目錄計算機網絡&#xff08;湖科大教書匠&#xff09;一、緒論1.2 因特網概述1.2.1 網絡、互連網&#xff08;互聯…

經緯度

題目描述 給定地球的兩個經緯度坐標&#xff0c;問這兩個點的直線距離。假設地球為球體&#xff0c;半徑為6371009米。 輸入描述: 第一行一個整數T表示數據組數。 接下來n行&#xff0c;每行四個數lat1, lng1, lat2, lng2分別表示兩個點的經緯度。 正數表示北緯和東經。 …

遠控免殺專題(18)-ASWCrypter免殺

免殺能力一覽表 幾點說明&#xff1a; 1、上表中標識 √ 說明相應殺毒軟件未檢測出病毒&#xff0c;也就是代表了Bypass。 2、為了更好的對比效果&#xff0c;大部分測試payload均使用msf的windows/meterperter/reverse_tcp模塊生成。 3、由于本機測試時只是安裝了360全家桶…

Hibernate 筆記4 實現對數據庫的增刪改查

1 準備 首先在mysql數據庫中建表User,并添加相關信息。 user表結構如下。 ---------------------------------------------------------| Field | Type | Null | Key | Default | Extra |------------------------------------------------…

Direct3D中的繪制(3)

立方體——只比三角形稍微復雜一點&#xff0c;這個程序渲染一個線框立方體。 這個簡單的繪制和渲染立方體的程序的運行結果如下圖所示&#xff1a; 源程序&#xff1a; /************************************************************************************** Renders a …

遠控免殺專題(19)-nps_payload免殺

免殺能力一覽表 幾點說明&#xff1a; 1、上表中標識 √ 說明相應殺毒軟件未檢測出病毒&#xff0c;也就是代表了Bypass。 2、為了更好的對比效果&#xff0c;大部分測試payload均使用msf的windows/meterperter/reverse_tcp模塊生成。 3、由于本機測試時只是安裝了360全家桶…

VS2005中使用WebDeploymentProject的問題

近來做Web項目&#xff0c;VS2005中發布網站時默認發布大批的程序集&#xff0c;這給升級網站時造成很大麻煩&#xff0c;所以偶從MS下載了個WebDeploymentProject的插件&#xff08;下載地址http://download.microsoft.com/download/c/c/b/ccb4877f-55f7-4478-8f16-e41886607a…

操作系統中的多級隊列調度

多級隊列調度 (Multilevel queue scheduling) Every algorithm supports a different class of process but in a generalized system, some process wants to be scheduled using a priority algorithm. While some process wants to remain in the system (interactive proce…

編寫一程序,輸入一個字符串,查找該字符串中是否包含“abc”。

import java.lang.String.*;//這里調用java.long.String.contains()方法&#xff1b; import java.util.Scanner; public class shit {public static void main(String[] args) {Scanner wsq new Scanner(System.in);String str wsq.next();boolean status str.contains(&qu…

顯示消息提示對話框(WebForm)

1: /// <summary>2: /// 顯示消息提示對話框。3: /// Copyright (C) Maticsoft4: /// </summary>5: public class MessageBox6: { 7: private MessageBox()8: { 9: }10: 11: …

借助格式化輸出過canary保護

0x01 canary保護機制 棧溢出保護是一種緩沖區溢出攻擊緩解手段&#xff0c;當函數存在緩沖區溢出攻擊漏洞時&#xff0c;攻擊者可以覆蓋棧上的返回地址來讓shellcode能夠得到執行。當啟用棧保護后&#xff0c;函數開始執行的時候會先往棧里插入cookie信息&#xff0c;當函數真…

什么叫灰度圖

任何顏色都有紅、綠、藍三原色組成&#xff0c;假如原來某點的顏色為RGB(R&#xff0c;G&#xff0c;B)&#xff0c;那么&#xff0c;我們可以通過下面幾種方法&#xff0c;將其轉換為灰度&#xff1a; 1.浮點算法&#xff1a;GrayR*0.3G*0.59B*0.11 2.整數方法&#xff1a;Gra…

各抓包軟件的之間差異_系統軟件和應用程序軟件之間的差異

各抓包軟件的之間差異什么是軟件&#xff1f; (What is Software?) Software is referred to as a set of programs that are designed to perform a well-defined function. A program is a particular sequence of instructions written to solve a particular problem. 軟件…