程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> MFC法式設計經常使用技能匯總

MFC法式設計經常使用技能匯總

編輯:關於C++

MFC法式設計經常使用技能匯總。本站提示廣大學習愛好者:(MFC法式設計經常使用技能匯總)文章只能為提供參考,不一定能成為您想要的結果。以下是MFC法式設計經常使用技能匯總正文


本文實例總結了MFC法式設計經常使用技能。分享給年夜家供年夜家參考。詳細以下:

1.屬性頁的添加:

創立對話框的類,該類要從CpropertyPage繼續;然後在要添加該對話框為屬性頁的類(頭文件)裡創立CpropertySheet類的一個對象m_tabsheet和新創立的對話框類的對象m_skatch;最初,在.cpp文件裡的OnInitDialog()之類的函數裡完成以下代碼:
m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, 0);
//使選項卡的按鈕鄙人面
if(m_tabsheet.m_hWnd)
m_tabsheet.ShowWindow(SW_MAXIMIZE);//顯示選項卡
//參加標簽,標簽名由各個子對話框的題目欄決議
m_tabsheet.AddPage(&m_skatch);
//用Create來創立一個屬性頁
m_tabsheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);
RECT rect;
m_tabsheet.GetWindowRect(&rect);
int width = rect.right - rect.left;
int height = rect.bottom - rect.top;
//調劑屬性頁的年夜小和地位
m_tabsheet.SetWindowPos(NULL, 225, 225, width-82, height,SWP_NOACTIVATE);
屬性頁的添加完成。假如要添加多個屬性頁,則只須要增長多個對象,以下:
m_tabsheet.AddPage(&m_skatch1);
m_tabsheet.AddPage(&m_skatch2);
. . . . . .

2.List Control中題目欄(Column)的添加:

創立一個List Control,其ID為IDC_LIST,在其Styles屬性項下的View項裡選擇Report、Align項裡選擇Top、Sort項裡選擇None.

然後在該List地點對話框的類(頭文件)裡創立ClistCtrl的一個對象m_list然後在.cpp文件的OnInitDialog()之類的函數裡完成以下代碼:
CString strname[3];
strname[0]="Screen Name";
strname[1]="Form ID";
strname[2]="Category Path";
for(int i=0;i<3;i++)
{
m_List.InsertColumn(i,strname[i],LVCFMT_LEFT,130);
}

在這之前也要將List Control的ID與ClistCtrl的對象m_list在DoDataExchange(CDataExchange* pDX)函數裡綁定,以下:

DDX_Control(pDX, IDC_LIST, m_List);

3.ToolBar和StatusBar中控件的添加:

辦法⑴.只能在ToolBar裡創立控件:起首,在ToolBar中創立一個Button,其ID為ID_TOOL_COMBO(我們要將創立的控件放在該Button的地位上).

其次,新創立一個類CMainToolBar,要從CToolBar繼續(創立進程年夜概以下:選擇工程/增長到工程/新的類;也能夠選擇工程的根,然後點擊右鍵,選擇新的類;或許CTL+W,選擇增長類/新的類 --- 然後在class type裡選擇Generic Class,在Name欄裡輸出新類的名字,Base class裡輸出CToolBar),創立勝利後在該類裡創立要增長的控件的對象,如:
CComboBox m_wndMyCombo;
CStatic m_wndCategory, m_wndCategoryPath;
CButton m_wndOpenButton;
Cedit m_wndEdit;
然後在結構函數裡初始化如:
m_wndMyCombo.m_hWnd = NULL;
m_wndCategory.m_hWnd = NULL;
m_wndCategoryPath.m_hWnd = NULL;
m_wndOpenButton.m_hWnd = NULL;
m_wndEdit.m_hWnd = NULL;
接著在CMainframe的頭文件裡創立CMainToolBar的一個對象m_wndToolBar,最初在.cpp文件的OnCreate函數的最初完成以下:
int index = 0;
CRect rect;  // 可界說在頭文件傍邊
// ComboBox
{
//找到指定的對象項
while(m_wndToolBar.GetItemID(index)!=ID_TOOL_COMBO)
index++;
//設置指定對象項的寬度並獲得新的區域 120是寬度
m_wndToolBar.SetButtonInfo(index, ID_TOOL_COMBO, TBBS_SEPARATOR, 120);
m_wndToolBar.GetItemRect(index, &rect);
//設置地位
rect.top+=1;
rect.bottom += 200;
// 創立並顯示控件
if(!m_wndToolBar.m_wndMyCombo.Create(WS_CHILD|WS_VISIBLE| CBS_AUTOHSCROLL|
CBS_DROPDOWNLIST | CBS_HASSTRINGS , rect, &m_wndToolBar, ID_TOOL_COMBO))
{ 
TRACE0("Failed to create combo-box\n");
return FALSE;
}
m_wndToolBar.m_wndMyCombo.ShowWindow(SW_SHOW);
//填充內容
m_wndToolBar.m_wndMyCombo.AddString("25%");
m_wndToolBar.m_wndMyCombo.AddString("50%");
m_wndToolBar.m_wndMyCombo.AddString("75%");
//選擇默許項
m_wndToolBar.m_wndMyCombo.SetCurSel(0);
//獲得到內容並MSGBOX顯示出來
CString strContent;
m_wndToolBar.m_wndMyCombo.GetWindowText(strContent);
index = 0;
}
其他控件都相似創立(只須要留意一下各自的Create函數的參數便可)。

辦法⑵.這類辦法創立不太輕易掌握:直接在CMainframe的頭文件中創立要增長的控件的對象,如CButton的對象m_wndAboutButton,然後創立CToolBar或許CstatusBar的對象,如:CstatusBar的對象_wndStatusBar;再增長幾個函數以下:

Protected:
virtual void RecalcLayout(BOOL bNotify = TRUE);
afx_msg void CMainFrame::OnViewStatusBar();
接著在.cpp文件中將StatusBar的ID和OnViewStatusBar 函數綁定在一路,以下所示:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  // {{AFX_MSG_MAP(CMainFrame)
  ON_COMMAND(ID_VIEW_STATUS_BAR, OnViewStatusBar)
  ON_WM_CREATE()
  // }}AFX_MSG_MAP
END_MESSAGE_MAP()
然後Create函數的最初(前往值之前)完成以下代碼:

CRect rc;
VERIFY(m_wndAboutButton.Create(_T("MyAbout"),
  WS_VISIBLE,rc,this,ID_APP_ABOUT));
// TODO: Remove this if you don't want tool tips or a resizeable toolbar
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

再在RecalcLayout函數裡完成:
CRect rc;
if (m_wndStatusBar.m_hWnd)
{
m_wndStatusBar.GetWindowRect(&rc);
ScreenToClient(&rc);
rc.right -= 50;
m_wndStatusBar.SetWindowPos(NULL,rc.left,rc.top,rc.Width(),rc.Height(),
SWP_NOZORDER);
rc.left = rc.right;
rc.right += 50;
m_wndAboutButton.SetWindowPos(NULL,rc.left,rc.top,rc.Width(),rc.Height(),
SWP_NOZORDER);
}
最初在OnViewStatusBar()裡完成:
BOOL bShow = m_wndStatusBar.GetStyle() & WS_VISIBLE;
m_wndAboutButton.SetWindowPos(NULL, 0, 0, 0, 0,
SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|
(bShow ? SWP_SHOWWINDOW : SWP_HIDEWINDOW));
ToolBar中的創立與此雷同,只需更改一下句柄便可。

4.經由過程Control創立的控件,對其屬性的靜態掌握:

在對話框類的頭文件裡創立所要轉變屬性的控件的對象,如要轉變一個Button(其ID為IDC_MyButton)的屬性,則需創立Cbutton的對象m_button。然後在.cpp中的DoDataExchange函數裡將Button的ID和創立的對象綁定在一路:
//{{AFX_DATA_MAP(CPrintDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
DDX_Control(pDX, IDC_MyButton, m_button);
//}}AFX_DATA_MAP
然後可以在該函數的最初停止初始化:
m_button.EnableWindow(FALSE);
到這裡曾經完成了轉變屬性。假如要靜態轉變其屬性,可以下完成(經由過程兩個Button的點擊轉變起屬性):
// RadioAll Button的點擊呼應函數
void CPrintDlg::OnRadioAll()
{
// TODO: Add your control notification handler code here
m_button.EnableWindow(TRUE);
}
// RadioSelect Button的點擊呼應函數
void CPrintDlg::OnRadioSelect()
{
// TODO: Add your control notification handler code here
m_button.EnableWindow(FALSE);
}
也能夠經由過程一個Check Button的點擊來轉變,在其點擊呼應函數裡完成:
m_button.EnableWindow(!m_button.IsWindowEnabled());
其他控件屬性的轉變都如斯。

5.窗口的朋分與停靠:
                       
1、新建一個類CMySplitter,基類為CSplitterWnd

2、重載該類的OnMouseMove函數:
void CMySplitter::OnMouseMove(UINT nFlags, CPoint point)
{
// 限制切分條的活動規模。
if(point.x<228||point.x>600)
{
CWnd::OnMouseMove(nFlags, point);
}
else
{
CSplitterWnd::OnMouseMove(nFlags, point);
}
}
3、 然後便可以跟普通的窗口朋分那樣去做了,if(point.x<228||point.x>600)這裡的規模可以隨你去設置了 ^_^,夠簡略吧。

4、切分窗口

在MaiFram.h樹立切分條對象:
protected:
CMySplitter m_wndSplitter; //切分窗口對象
//在MaiFram.cpp中完成窗口切分:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,CCreateContext* pContext)
{
// 創立拆分器窗口
if (!m_wndSplitter.CreateStatic(this, 1, 2))
return FALSE;
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView),CSize(228,100), pContext) ||!m_wndSplitter.CreateView(0,1, RUNTIME_CLASS(CDataEditView), CSize(100, 100), pContext))
{
m_wndSplitter.DestroyWindow();
return FALSE;
}
return TRUE;
}

6. ①如何在法式開端的時刻讓它最年夜化?
②vc++做出來的exe文件在窗體的右上方是沒有最年夜化和最小化按鈕的,如何完成這一功效?
③若何在顯示窗口時,使最年夜化按鈕變灰?
①在App類裡的C…App::InitInstance()中把m_pMainWnd->ShowWindow(SW_SHOW)改成m_pMainWnd->ShowWindow(SW_MAXIMIZE);
②在CreateWidnow時用WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX 作風.
③ 第一種辦法:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
// disable the maxmini box
cs.style &= ~WS_MAXIMIZEBOX;
return TRUE;
}
第二種辦法:
CMenu *pMenu=AfxGetApp()->m_pMainWnd->GetSystemMenu(FALSE);
     int x=pMenu->GetMenuItemCount( );
     UINT pID=pMenu->GetMenuItemID(x-1);
     pMenu->EnableMenuItem(pID, MF_DISABLED);
第三種辦法:
ModifyStyle(WS_MAXIMIZEBOX, 0);
這個函數也能夠是最年夜化按鈕掉效!
而且可以在法式中靜態的轉變窗口的作風

7. 更改屬性頁題目
void CProSheet::SetPageTitle(int nPage, int nImage, CString strTitle)
{
 TC_ITEM item;
 //item.mask = TCIF_TEXT|TCIF_IMAGE;  //設置圖標+文字
 item.mask = TCIF_IMAGE;    //只設置圖標
 item.iImage = nImage;
// item.pszText = strTitle.GetBuffer(0);  //設置文字
 GetTabControl ()->SetItem (nPage, &item);
//要設置文字時就將下面2行有正文符的代碼前的正文符去失落
}
8. 創立靜態菜單
void CMainFrame::OnSelectState(NMTOOLBAR* pnmtb, LRESULT *plr)
{
CMenu menu;
if(!menu.CreateMenu())
return;
menu.AppendMenu(MF_STRING,0,"開端");
menu.AppendMenu(MF_STRING,0,"停止");
CRect rc;
m_wndToolBar.SendMessage(TB_GETRECT, pnmtb->iItem, (LPARAM)&rc); 
m_wndToolBar.ClientToScreen(&rc);
menu.TrackMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL,
rc.left, rc.bottom, this, &rc);
//menu.DestroyMenu();
menu.detach();
}
9.關於打印
1.要打印哪一個視就
((CMainFrame*)AfxGetMainWnd())->m_wndSplitter.SetActivePane(...)
//要打印的誰人視對應的Pane
2.有一個單文檔工程,文檔窗口被切分:左視圖由CTreeView 的派生類治理,右視圖由CListView 的派生類CMyListView(其為作風為LVS_REPORT)治理,我想為右視圖添加打印和打印預覽,我在MyListView.cpp中添加了
ON_COMMAND(ID_FILE_PRINT,CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CListView::OnFilePrintPreview)還有
BOOL CMyListView::OnPreparePrinting(CPrintInfo* pInfo)
{
     // TODO: call DoPreparePrinting to invoke the Print dialog box
     // return CListView::OnPreparePrinting(pInfo);
     pInfo->SetMaxPage(2);
     BOOL bret=DoPreparePrinting(pInfo);
     pInfo->m_nNumPreviewPages=2;
     return bret;
}
3. 上面是從MSDN中摘出來的一段,是用來轉變新聞路由的。用了這段代碼以後,CView中的新聞(菜單,控件,子窗口)將先被CMyShape類來處置。不曉得你要的是否是如許的後果。
// This example illustrates extending the framework's standard command
// route from the view to objects managed by the view. This example
// is from an object-oriented drawing application, similar to the
// DRAWCLI sample application, which draws and edits "shapes".
BOOL CMyView::OnCmdMsg(UINT nID, int nCode, void* pExtra,AFX_CMDHANDLERINFO* pHandlerInfo)
{
      // Extend the framework's command route from the view to
      // the application-specific CMyShape that is currently selected
      // in the view. m_pActiveShape is NULL if no shape object
      // is currently selected in the view.
      if ((m_pActiveShape != NULL)
        && m_pActiveShape->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
       return TRUE;
      // If the object(s) in the extended command route don't handle
      // the command, then let the base class OnCmdMsg handle it.
      return CView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
     }
     // The command handler for ID_SHAPE_COLOR (menu command to change
     // the color of the currently selected shape) was added to
     // the message map of CMyShape (note, not CMyView) using ClassWizard. 
     // The menu item will be automatically enabled or disabled, depending
     // on whether a CMyShape is currently selected in the view, that is,
     // depending on whether CMyView::m_pActiveView is NULL. It is not
     // necessary to implement an ON_UPDATE_COMMAND_UI handler to enable
     // or disable the menu item. 
(CMyShape, CCmdTarget)
 //{{AFX_MSG_MAP(CMyShape)
 ON_COMMAND(ID_SHAPE_COLOR, OnShapeColor)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
假如你只是想挪用OnFilePrint( )函數,可以試一試上面的代碼,就和挪用其它類中的函數一樣。
CMDIFrameWnd *pFrame =
       (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
// Get the active MDI child window.
CMDIChildWnd *pChild =
       (CMDIChildWnd *) pFrame->GetActiveFrame();
// or CMDIChildWnd *pChild = pFrame->MDIGetActive();
// Get the active view attached to the active MDI child
// window.
CMyView *pView = (CMyView *) pChild->GetActiveView();
pView->OnFilePrint( );

4.
void CMyReportView::OnFileOpen()
{
char Filter[] = "Crystal Report files(*.rpt)|*.rpt|All files(*.*)|*.*||";
CRect rect;
CFileDialog OpenDlg(TRUE,0,0,OFN_HIDEREADONLY|OFN_FILEMUSTEXIST,(LPCTSTR)Filter,NULL);
if(OpenDlg.DoModal()!=IDOK) ///顯示文件對話框
return;
CString m_fName=OpenDlg.GetPathName(); ///獲得文件名
if(m_CrystalReport)
m_CrystalReport.DestroyWindow();
GetClientRect(rect);
///////////////////創立控件///////////////
if (!m_CrystalReport.Create(AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),WS_CHILD|WS_VISIBLE,rect,this,IDC_CRYSTALREPORT1))
{
AfxMessageBox("控件創立掉敗!");
return ;
}
m_CrystalReport.SetWindowParentHandle((long)(this->m_hWnd));///設置父窗口
m_CrystalReport.SetWindowBorderStyle(0); ///設置為沒有邊框
m_CrystalReport.SetWindowLeft(0); ///左空間
m_CrystalReport.SetWindowTop(0); ///頂部空間
m_CrystalReport.SetWindowControls(FALSE); ///不顯示對象條
m_CrystalReport.SetReportFileName(m_fName); ///設置報表文件
m_CrystalReport.SetWindowWidth(rect.Width()); ///設置窗口寬度
m_CrystalReport.SetWindowHeight(rect.Height()); ///設置窗口高度
m_CrystalReport.SetFormulas(0, "Company=\"VC常識庫\""); ///將報表中的Company變量的值設置為VC常識庫
m_CrystalReport.SetDestination(0); ///設置輸入對象是屏幕
m_CrystalReport.PrintReport(); ///顯示報表
}
void CMyReportView::OnFilePrint()
{
if(m_CrystalReport && m_CrystalReport.GetReportFileName() != "")
{
m_CrystalReport.SetDestination(1); ///設置輸入對象是打印機
m_CrystalReport.PrintReport(); ///打印
}
10. Scroll

創立一個基於CScrollview的SDI Project(在第6步當選CScrollview)
若你已創立了,這步可以省略。
然後:
改成如
void CTestView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = 1024; //改這兩個
sizeTotal.cy = 768;  //
SetScrollSizes(MM_TEXT, sizeTotal);
}
11. 修正主窗口作風

AppWizard生成的運用法式框架的主窗口具出缺省的窗口作風,好比在窗口題目條中主動添加文檔名、窗口是疊加型的、可轉變窗口年夜小等。要修正窗口的缺省作風,須要重載CWnd::PreCreateWindow(CREATESTRUCT& cs)函數,並在個中修正CREATESTRUCT型參數cs。
CWnd::PreCreateWindow 函數先於窗口創立函數履行。假如該函數被重載,則窗口創立函數將應用CWnd::PreCreateWindow 函數前往的CREATESTRUCT cs參數所界說的窗口作風來創立窗口;不然應用預界說的窗口作風。
CREATESTRUCT構造界說了創立函數創立窗口所用的初始參數,其界說以下:
typedef struct tagCREATESTRUCT {
LPVOID lpCreateParams; // 創立窗口的根本參數
HANDLE hInstance; // 具有將創立的窗口的模塊實例句柄
HMENU hMenu; // 新窗口的菜單句柄
HWND hwndParent; // 新窗口的父窗口句柄
int cy; // 新窗口的高度
int cx; // 新窗口的寬度
int y; // 新窗口的左上角Y坐標
int x; // 新窗口的左上角X坐標
LONG style; // 新窗口的作風
LPCSTR lpszName; // 新窗口的稱號
LPCSTR lpszClass; // 新窗口的窗口類名
DWORD dwExStyle; // 新窗口的擴大參數
} CREATESTRUCT;
CREATESTRUCT構造的style域界說了窗口的作風。好比,缺省的MDI主窗口的作風中就包含FWS_ADDTOTITLE(在題目條中顯示以後的任務文檔名)、FWS_PREFIXTITLE(把文檔名放在法式題目的後面)、WS_THICKFRAME(窗口具有可縮放的邊框)等作風。因為多種作風參數由邏輯或(“|”)組合在一路的,是以添加某種作風,就只需用“|”把對應的參數加到CREATESTRUCT構造的style域中;刪除已有的作風,則需用“&”銜接CREATESTRUCT構造的style域與該作風的邏輯非值。

CREATESTRUCT構造的x、y、cx、cy域分離界說了窗口的初始地位和年夜小,是以,在CWnd::PreCreateWindow 函數中給它們賦值,將能界說窗口的初始顯示地位和年夜小。

下例中的代碼將主框窗口的年夜小將固定為1/4屏幕,題目條中僅顯示窗口名,不顯示文檔名。
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
// 修正主窗作風
cs.style &= ~FWS_ADDTOTITLE; //去除題目條中的文檔名
cs.style &= ~WS_THICKFRAME; //去除可轉變年夜小的邊框
cs.style |= WS_DLGFRAME; //增長不克不及轉變年夜小的邊框
// 肯定主窗的年夜小和初始地位
int cxScreen = ::GetSystemMetrics(SM_CXSCREEN);//取得屏幕寬
int cyScreen = ::GetSystemMetrics(SM_CYSCREEN); //取得屏幕高
cs.x = 0; // 主窗位於左上角
cs.y = 0;
cs.cx = cxScreen/2; // 主窗寬為1/2屏幕寬
cs.cy = cxScreen/2; // 主窗高為1/2屏幕高
return CMDIFrameWnd::PreCreateWindow(cs);
}
12. 掌握轉動條
BOOL CDiagramShowView::PreTranslateMessage(MSG* pMsg)
{
CFileTreeDoc* pDoc = (CFileTreeDoc*)GetDocument();
CPoint point = GetScrollPosition();
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_LEFT:
if( point.x > 10)
{
EndPoint.x = EndPoint.x - 10;
EndPoint.y = EndPoint.y;
}
else
{
EndPoint.x = 0;
EndPoint.y = EndPoint.y;
}
ScrollToPosition(EndPoint);
InvalidateRect(NULL,TRUE);
break;
case VK_RIGHT:
if( point.x < pDoc->intDiagramColumnCount * pDoc->intColumnWidth - 10 )
{
EndPoint.x = EndPoint.x + 10;
EndPoint.y = EndPoint.y;
}
else
{
EndPoint.y = pDoc->intDiagramColumnCount * pDoc->intColumnWidth;
EndPoint.x = EndPoint.x;
}
ScrollToPosition(EndPoint);
InvalidateRect(NULL,TRUE);
break;
case VK_UP:
if( point.y > 10)
{
EndPoint.y = EndPoint.y - 10;
EndPoint.x = EndPoint.x;
}
else
{
EndPoint.y = 0;
EndPoint.x = EndPoint.x;
}
ScrollToPosition(EndPoint);
InvalidateRect(NULL,TRUE);
break;
case VK_DOWN:
if( point.y < pDoc->intDiagramRowCount * pDoc->intRowHeight - 10 )
{
EndPoint.y = EndPoint.y + 10;
EndPoint.x = EndPoint.x;
}
else
{
EndPoint.y = pDoc->intDiagramRowCount * pDoc->intRowHeight;
EndPoint.x = EndPoint.x;
}
ScrollToPosition(EndPoint);
InvalidateRect(NULL,TRUE);
break;
default:
break;
}
}
return FALSE;
}

// 經由過程正負號斷定是向上照樣向下轉動
if(zDelta==120) 
向上轉動
if(zDelta==-120)
向下轉動
BOOL CDiagramShowView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
CFileTreeDoc* pDoc = (CFileTreeDoc*)GetDocument();
CPoint point = GetScrollPosition();

if(zDelta==120)
{
if( point.y >= 20 )
{
EndPoint.x = point.x;
EndPoint.y = point.y;

EndPoint.x = EndPoint.x;
EndPoint.y = EndPoint.y - 20;
}
else
{
EndPoint.x = EndPoint.x;
EndPoint.y = 0;
}
}

if(zDelta==-120)
{
if( point.y <= pDoc->intDiagramRowCount * pDoc->intRowHeight - 20 )
{
EndPoint.x = point.x;
EndPoint.y = point.y;

EndPoint.x = EndPoint.x;
EndPoint.y = EndPoint.y + 20;
}
else
{
EndPoint.x = EndPoint.x;
EndPoint.y = EndPoint.y;
}
}

ScrollToPosition(EndPoint);
InvalidateRect(NULL,TRUE);
return CScrollView::OnMouseWheel(nFlags, zDelta, pt);
}
13. 屬性頁處置告訴新聞

CPropertyPageImpl有一個新聞映照處置WM_NOTIFY。假如告訴代碼是PSN_*的值,OnNotify()就會挪用響應的告訴處置函數。這應用了編譯階段虛函數機制,從而使得派生類可以很輕易的重載這些處置函數。
因為WTL 3和WTL 7設計的轉變,從而存在兩套分歧的告訴處置機制。在WTL 3中告訴處置函數前往的值與PSN_*新聞的前往值分歧,例如,WTL 3是如許處置PSN_WIZFINISH的:
case PSN_WIZFINISH:
lResult = !pT->OnWizardFinish();
break;
OnWizardFinish()希冀前往TRUE停止領導,FALSE阻攔封閉領導。這個辦法很粗陋,然則IE5的通用控件對PSN_WIZFINISH處置的前往值添加了新說明,他前往須要取得核心的窗口的句柄。WTL 3的法式將不克不及應用這個特征,由於它對一切非0的前往值都做雷同的處置。

在WTL 7中,OnNotify() 沒有轉變 PSN_* 新聞的前往值,處置函數前往任何文檔中劃定的正當數值和准確的行動。固然,為了向前兼容,WTL 3 依然應用以後默許的任務方法,要應用WTL 7的新聞處置方法,你必需在中including atldlgs.h一行之前添加一行界說:
#define _WTL_NEW_PAGE_NOTIFY_HANDLERS
編寫新的代碼沒有來由不應用WTL 7的新聞處置函數,所以這裡就不引見WTL 3的新聞處置方法。

CPropertyPageImpl 為一切新聞供給了默許的告訴新聞處置函數,你可以重載與你的法式有關的新聞處置函數完成特別的操作。默許的新聞處置函數和響應的行動以下:

int OnSetActive() - 許可頁面成為激活狀況
BOOL OnKillActive() - 許可頁面成為非激活狀況
int OnApply() - 前往 PSNRET_NOERROR 表現運用操作勝利完成
void OnReset() - 無響應的舉措
BOOL OnQueryCancel() - 許可撤消操作
int OnWizardBack() - 前往到前一個頁面
int OnWizardNext() - 停止到下一個頁面
INT_PTR OnWizardFinish() - 許可領導停止
void OnHelp() - 無響應的舉措
BOOL OnGetObject(LPNMOBJECTNOTIFY lpObjectNotify) - 無響應的舉措
int OnTranslateAccelerator(LPMSG lpMsg) - 前往 PSNRET_NOERROR 表現新聞沒有被處置
HWND OnQueryInitialFocus(HWND hWndFocus) - 前往 NULL 表現將按Tab Order次序的第一個控件設為核心狀況

14.使對象條上的按鈕點擊一次為按下,再點擊才彈起
bCheck=m_RtfEditToolBar.GetToolBarCtrl().IsButtonChecked(ID_TB_BOLD);
m_RtfEditToolBar.GetToolBarCtrl().CheckButton(ID_TB_BOLD, !bCheck);
15. VC中基於 Windows 的准確准時
  
在工業臨盆掌握體系中,有很多須要准時完成的操作,如准時顯示以後時光,准時刷新屏幕上的進度條,上位 機准時向下位機發送死令和傳送數據等。特殊是在對掌握機能請求較高的及時掌握體系和數據收集體系中,就更須要准確准時操作。
盡人皆知,Windows 是基於新聞機制的體系,任何事宜的履行都是經由過程發送和吸收新聞來完成的。 如許就帶來了一些成績,如一旦盤算機的CPU被某個過程占用,或體系資本重要時,發送到新聞隊列 中的新聞就臨時被掛起,得不到及時處置。是以,不克不及簡略地經由過程Windows新聞激發一個對准時請求 嚴厲的事宜。別的,因為在Windows中曾經封裝了盤算機底層硬件的拜訪,所以,要想經由過程直接應用 拜訪硬件來完成准確准時,也比擬艱苦。所以在現實運用時,應針對詳細准時精度的請求,采用相適 應的准時辦法。

VC中供給了許多關於時光操作的函數,應用它們掌握法式可以或許准確地完成准時和計時操作。本文具體引見了 VC中基於Windows的准確准時的七種方法.

方法一:VC中的WM_TIMER新聞映照能停止簡略的時光掌握。起首挪用函數SetTimer()設置准時 距離,如SetTimer(0,200,NULL)即為設置200ms的時光距離。然後在運用法式中增長准時呼應函數 OnTimer(),並在該函數中添加呼應的處置語句,用來完成達到准時時光的操作。這類准時辦法異常 簡略,可以完成必定的准時功效,但其准時功效好像Sleep()函數的延時功效一樣,精度異常低,最小 計時精度僅為30ms,CPU占用低,且准時器新聞在多義務操作體系中的優先級很低,不克不及獲得實時響 應,常常不克不及知足及時掌握情況下的運用。只可以用來完成諸如位圖的靜態顯示等對准時精度請求不高的情形。如示例工程中的Timer1。

方法二:VC中應用sleep()函數完成延時,它的單元是ms,如延時2秒,用sleep(2000)。精度異常 低,最小計時精度僅為30ms,用sleep函數的晦氣處在於延時代間不克不及處置其他的新聞,假如時光太 長,就好象逝世機一樣,CPU占用率異常高,只能用於請求不高的延時法式中。如示例工程中的Timer2。

方法三:應用COleDateTime類和COleDateTimeSpan類聯合WINDOWS的新聞處置進程來完成秒級延時。如示例工程中的Timer3和Timer3_1。以下是完成2秒的延時期碼:
COleDateTime start_time = COleDateTime::GetCurrentTime();
COleDateTimeSpan end_time= COleDateTime::GetCurrentTime()-start_time;
while(end_time.GetTotalSeconds()< 2) //完成延時2秒
{
       MSG  msg;
       GetMessage(&msg,NULL,0,0);
       TranslateMessage(&msg);
       DispatchMessage(&msg);
       
       //以上四行是完成在延時或准時時代能處置其他的新聞,
       //固然如許可以下降CPU的占領率,
       //但下降了延時或准時精度,現實運用中可以去失落。
       end_time = COleDateTime::GetCurrentTime()-start_time;
}//如許在延時的時刻我們也可以或許處置其他的新聞。   

方法四:在精度請求較高的情形下,VC中可以應用GetTickCount()函數,該函數的前往值是 DWORD型,表現以ms為單元的盤算機啟動後閱歷的時光距離。精度比WM_TIMER新聞映照高,在較 短的准時中其計時誤差為15ms,在較長的准時中其計時誤差較低,假如准時時光太長,就好象逝世機一樣,CPU占用率異常高,只能用於請求不高的延時法式中。如示例工程中的Timer4和Timer4_1。以下代碼可以完成50ms的准確准時:
DWORD dwStart = GetTickCount();
DWORD dwEnd  = dwStart;
do
{
     dwEnd = GetTickCount()-dwStart;
}while(dwEnd <50);
為使GetTickCount()函數在延時或准時時代能處置其他的新聞,可以把代碼改成:
DWORD dwStart = GetTickCount();
DWORD dwEnd  = dwStart;
do
{
       MSG  msg;
       GetMessage(&msg,NULL,0,0);
       TranslateMessage(&msg);
       DispatchMessage(&msg);
       dwEnd = GetTickCount()-dwStart;
}while(dwEnd <50);
固然如許可以下降CPU的占領率,並在延時或准時時代也能處置其他的新聞,但下降了延時或准時精度。

方法五:與GetTickCount()函數相似的多媒體准時器函數DWORD timeGetTime(void),該函數准時精 度為ms級,前往從Windows啟動開端經由的毫秒數。微軟公司在其多媒體Windows中供給了准確准時器的底 層API持,應用多媒體准時器可以很准確地讀出體系確當前時光,而且能在異常准確的時光距離內完成一 個事宜、函數或進程的挪用。分歧的地方在於挪用DWORD timeGetTime(void) 函數之前必需將 Winmm.lib 和 Mmsystem.h 添加到工程中,不然在編譯時提醒DWORD timeGetTime(void)函數不決義。因為應用該 函數是經由過程查詢的方法停止准時掌握的,所以,應當樹立准時輪回來停止准時事宜的掌握。如示例工程中的Timer5和Timer5_1。

方法六:應用多媒體准時器timeSetEvent()函數,該函數准時精度為ms級。應用該函數可以完成周期性的函數挪用。如示例工程中的Timer6和Timer6_1。函數的原型以下:

MMRESULT timeSetEvent( UINT uDelay,
                UINT uResolution,
                LPTIMECALLBACK lpTimeProc,
                WORD dwUser,
                UINT fuEvent )

該函數設置一個准時回調事宜,此事宜可所以一個一次性事宜或周期性事宜。事宜一旦被激活,便挪用指定的回調函數, 勝利後前往事宜的標識符代碼,不然前往NULL。函數的參數解釋以下:

uDelay:以毫秒指定事宜的周期。
Uresolution:以毫秒指定延時的精度,數值越小准時器事宜分辯率越高。缺省值為1ms。
LpTimeProc:指向一個回調函數。
DwUser:寄存用戶供給的回調數據。
FuEvent:指定准時器事宜類型:
TIME_ONESHOT:uDelay毫秒後只發生一次事宜
TIME_PERIODIC :每隔uDelay毫秒周期性地發生事宜。   

詳細運用時,可以經由過程挪用timeSetEvent()函數,將須要周期性履行的義務界說在LpTimeProc回調函數 中(如:准時采樣、掌握等),從而完成所需處置的事宜。須要留意的是,義務處置的時光不克不及年夜於周時代隔時光。別的,在准時器應用終了後, 應實時挪用timeKillEvent()將之釋放。

方法七:關於准確度請求更高的准時操作,則應當應用QueryPerformanceFrequency()和 QueryPerformanceCounter()函數。這兩個函數是VC供給的僅供Windows 95及厥後續版本應用的准確時光函數,並請求盤算機從硬件上支撐准確准時器。如示例工程中的Timer7、Timer7_1、Timer7_2、Timer7_3。
QueryPerformanceFrequency()函數和QueryPerformanceCounter()函數的原型以下:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter(LARGE_INTEGER *lpCount);

數據類型ARGE_INTEGER既可所以一個8字節長的整型數,也能夠是兩個4字節長的整型數的結合構造, 其詳細用法依據編譯器能否支撐64位而定。該類型的界說以下:
typedef union _LARGE_INTEGER
{
      struct
      {
       DWORD LowPart ;// 4字節整型數
       LONG HighPart;// 4字節整型數
      };
      LONGLONG QuadPart ;// 8字節整型數
     
}LARGE_INTEGER ;

在停止准時之前,先挪用QueryPerformanceFrequency()函數取得機械外部准時器的時鐘頻率, 然後在須要嚴厲准時的事宜產生之前和產生以後分離挪用QueryPerformanceCounter()函數,應用兩次取得的計數之差實時鐘頻率,盤算失事件經 歷的准確時光。以下代碼完成1ms的准確准時:
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;// 取得計數器的時鐘頻率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;// 取得初始值
do
{
     QueryPerformanceCounter(&litmp);
     QPart2 = litmp.QuadPart;//取得中斷值
     dfMinus = (double)(QPart2-QPart1);
     dfTim = dfMinus / dfFreq;// 取得對應的時光值,單元為秒
}while(dfTim<0.001);

其准時誤差不跨越1微秒,精度與CPU等機械設置裝備擺設有關。 上面的法式用來測試函數Sleep(100)的准確連續時光:
    LARGE_INTEGER litmp;
    LONGLONG QPart1,QPart2;
    double dfMinus, dfFreq, dfTim;
    QueryPerformanceFrequency(&litmp);
    dfFreq = (double)litmp.QuadPart;// 取得計數器的時鐘頻率
    QueryPerformanceCounter(&litmp);
    QPart1 = litmp.QuadPart;// 取得初始值
    Sleep(100);
    QueryPerformanceCounter(&litmp);
    QPart2 = litmp.QuadPart;//取得中斷值
    dfMinus = (double)(QPart2-QPart1);
    dfTim = dfMinus / dfFreq;// 取得對應的時光值,單元為秒  
  因為Sleep()函數本身的誤差,上述法式每次履行的成果都邑有渺小誤差。以下代碼完成1微秒的准確准時:
    LARGE_INTEGER litmp;
    LONGLONG QPart1,QPart2;
    double dfMinus, dfFreq, dfTim;
    QueryPerformanceFrequency(&litmp);
    dfFreq = (double)litmp.QuadPart;// 取得計數器的時鐘頻率
    QueryPerformanceCounter(&litmp);
    QPart1 = litmp.QuadPart;// 取得初始值
    do
    {
     QueryPerformanceCounter(&litmp);
     QPart2 = litmp.QuadPart;//取得中斷值
     dfMinus = (double)(QPart2-QPart1);
     dfTim = dfMinus / dfFreq;// 取得對應的時光值,單元為秒
    }while(dfTim<0.000001);
其准時誤差普通不跨越0.5微秒,精度與CPU等機械設置裝備擺設有關。

16. 為對話框中的控件增長提醒的簡略辦法

我學VC從VC常識庫中獲得很多利益,相來都是一些熱情同伙們的贊助,在此表現感激!本工程可分五步:

1、建一個基於對話框的法式TipTest,在CTipTestDlg中增長成員變量: CToolTipCtrl m_tip[2],CWnd *m_pSub[2];
2、在CTipTestDlg::OnInitDialog()函數中增長以下代碼:
     pSub[0] = GetDlgItem(IDC_RADIO1);   //獲得單選按鈕的指針
     pSub[1] = GetDlgItem(IDC_BUTTON1);
m_tip[0].Create(pSub[0],TTS_ALWAYSTIP); //創立CToolTipCtrl
m_tip[0].AddTool(pSub[0]);        //將CToolTipCtrl與響應的控件對應起來
m_tip[1].Create(pSub[1],TTS_ALWAYSTIP);
m_tip[1].AddTool(pSub[1]);
m_tip[0].SetTipTextColor(RGB(0,0,255)); //設定文字的色彩
m_tip[0].SetDelayTime(150);       //設定提醒文字在控件上逗留的時光
3、重載CTipTestDlg::PreTranslateMessage(MSG* pMsg)函數,增長以下代碼:
if(m_tip[0].m_hWnd!=NULL)
 m_tip[0].RelayEvent(pMsg); //假如m_tip[0]句柄不為空,就從主窗口中捕捉新聞,如WM_MOUSEMOVE,WM_LBUTTONDOWN等新聞
   if(m_tip[1].m_hWnd!=NULL)
     m_tip[1].RelayEvent(pMsg);
4、捕捉主窗口的WM_MOUSEMOVE新聞,在CTipTestDlg::OnMouseMove(UINT nFlags, CPoint point)函數中增長以下代碼:
m_tip[0].UpdateTipText("VC常識庫迎接你!",pSub[0]);//鼠標在響應的控件上挪動時顯示提醒文字
m_tip[1].UpdateTipText("http://vckbase.com",pSub[1]);
17.刪除文件夾
// 刪除文件夾及其一切內容
void CBaseDoc::RemoveFolder(const CString &strPathName)
{
  CString path = strPathName;
  if (path.Right(1) != _T("\\"))
    path += _T("\\");
  path += _T("*.*");
  CFileFind ff;
  BOOL res = ff.FindFile(path);
  while (res)
  {
    res = ff.FindNextFile();
    // 是文件時直接刪除
    if (!ff.IsDots() && !ff.IsDirectory())
      DeleteFile(ff.GetFilePath());
    else if (ff.IsDots())
      continue;
    else if (ff.IsDirectory())
    {
      path = ff.GetFilePath();
      // 是目次時持續遞歸,刪除該目次下的文件
      RemoveFolder(path);
      ::RemoveDirectory(path);
    }
  }
}
18.新聞映照

有對話框A,B
從A中發新聞給B然後B處置。
預備任務,先界說新聞,以下
#define WM_B_NOTIFY WM_USER + 300
起首,必需將B的對話框句柄傳送給A,臨時叫m_hWndB;
在A的發送新聞的處所如許寫:
::SendMessage( m_hWndB,WM_B_NOTIFY,TRUE,NULL );
如許A中的處置就完了,上面說B 中的
起首界說新聞處置函數,以下
void B::ModiNotify( WPARAM wParam, LPARAM lParam )
{
  MessageBox("小樣,我就不信,弄不定你!");
}
然後加新聞影射,以下:
BEGIN_MESSAGE_MAP(CB, CDialog)
  //{{AFX_MSG_MAP(CRPServerDlg)
  ON_MESSAGE( WM_B_NOTIFY,ModiNotify )
  //}}AFX_MSG_MAP
END_MESSAGE_MAP()
19.給從CWnd派生的窗口添加轉動條
ModifyStyle(0,WS_VSCROLL);
20. SetWindowPos

函數功效:該函數轉變一個子窗口,彈出式窗口式頂層窗口的尺寸,地位和Z序。子窗口,彈出式窗口,及頂層窗口依據它們在屏幕上湧現的次序排序、頂層窗口設置的級別最高,而且被設置為Z序的第一個窗口。 
  
     函數原型:BOOL  SetWindowPos(HWN  hWnd,HWND  hWndlnsertAfter,int  X,int  Y,int  cx,int  cy,UNIT.Flags); 
  
     參數: 
  
     hWnd:窗口句柄。 
  
     hWndlnsertAfter:在z序中的位於被置位的窗口前的窗口句柄。該參數必需為一個窗口句柄,或以下值之一: 
  
     HWND_BOTTOM:將窗口置於Z序的底部。假如參數hWnd標識了一個頂層窗口,則窗口掉去頂級地位,而且被置在其他窗口的底部。 
  
     HWND_DOTTOPMOST:將窗口置於一切非頂層窗口之上(即在一切頂層窗口以後)。假如窗口己經長短頂層窗口則該標記不起感化。 
  
     HWND_TOP:將窗口置於Z序的頂部。 
  
     HWND_TOPMOST:將窗口置於一切非頂層窗口之上。即便窗口未被激活窗口也將堅持頂級地位。 
  
     查g看該參數的應用辦法,請看解釋部門。 
  
     x:以客戶坐標指定窗口新地位的右邊界。 
  
     Y:以客戶坐標指定窗口新地位的頂界限。 
  
     cx:以像素指定窗口的新的寬度。 
  
     cy:以像素指定窗口的新的高度。 
  
     uFlags:窗口尺寸和定位的標記。該參數可所以以下值的組合: 
  
     SWP_ASNCWINDOWPOS:假如挪用過程不具有窗口,體系會向具有窗口的線程收回需求。這就避免挪用線程在其他線程處置需求的時刻產生逝世鎖。 
  
     SWP_DEFERERASE:避免發生WM_SYNCPAINT新聞。 
  
     SWP_DRAWFRAME:在窗口四周畫一個邊框(界說在窗口類描寫中)。 
  
     SWP_FRAMECHANGED:給窗口發送WM_NCCALCSIZE新聞,即便窗口尺寸沒有轉變也會發送該新聞。假如未指定這個標記,只要在轉變了窗口尺寸時才發送WM_NCCALCSIZE。 
  
     SWP_HIDEWINDOW;隱蔽窗口。 
  
     SWP_NOACTIVATE:不激活窗口。假如未設置標記,則窗口被激活,並被設置到其他第一流窗口或非第一流組的頂部(依據參數hWndlnsertAfter設置)。 
  
     SWP_NOCOPYBITS:消除客戶區的一切內容。假如未設置該標記,客戶區的有用內容被保留而且在窗口尺寸更新和重定位後拷貝回客戶區。 
  
     SWP_NOMOVE:保持以後地位(疏忽X和Y參數)。 
  
  SWP_NOOWNERZORDER:不轉變z序中的一切者窗口的地位。 
  
  SWP_NOREDRAW:不重畫轉變的內容。假如設置了這個標記,則不產生任何重畫舉措。實用於客戶區和非客戶區(包含題目欄和轉動條)和任何因為窗回挪動而顯露的父窗口的一切部門。假如設置了這個標記,運用法式必需明白地使窗口有效並區重畫窗口的任何部門和父窗口須要重畫的部門。 
  
  SWP_NOREPOSITION;與SWP_NOOWNERZORDER標記雷同。 
  
  SWP_NOSENDCHANGING:避免窗口吸收WM_WINDOWPOSCHANGING新聞。 
  
  SWP_NOSIZE:保持以後尺寸(疏忽cx和Cy參數)。 
  
  SWP_NOZORDER:保持以後Z序(疏忽hWndlnsertAfter參數)。 
  
  SWP_SHOWWINDOW:顯示窗口。 
  
  前往值:假如函數勝利,前往值為非零;假如函數掉敗,前往值為零。若想取得更多毛病新聞,請挪用GetLastError函數。 
  
  備注:假如設置了SWP_SHOWWINDOW和SWP_HIDEWINDOW標記,則窗口不克不及被挪動和轉變年夜小。假如應用SetWindowLoog轉變了窗口的某些數據,則必需挪用函數SetWindowPos來作真實的轉變。應用以下的組合標記:SWP_NOMOVEISWP_NOSIZEISWP_FRAMECHANGED。 
  
  有兩種辦法將窗口設為最頂層窗口:一種是將參數hWndlnsertAfter設置為HWND_TOPMOST並確保沒有設置SWP_NOZORDER標記;另外一種是設置窗口在Z序中的地位以使其在其他存在的窗口之上。當一個窗口被置為最頂層窗口時,屬於它的一切窗口均為最頂層窗口,而它的一切者的z序其實不轉變。 
  
  假如HWND_TOPMOST和HWND_NOTOPMOST標記均未指定,即運用法式請求窗口在激活的同時轉變其在Z序中的地位時,在參數hWndinsertAfter中指定的值只要鄙人列前提中才應用: 
  
  在hWndlnsertAfter參數中沒有設定HWND_NOTOPMOST和HWND_TOPMOST標記。 
  
  由hWnd參數標識的窗口不是激活窗口。 
  
  假如未將一個非激活窗口設定到z序的頂端,運用法式不克不及激該死窗口。運用法式可以無任何限制地轉變被激活窗口在Z序中的地位,或激活一個窗口並將其移到第一流窗口的頂部或非第一流窗口的頂部。 
  
  假如一個頂層窗口被重定位到z序的底部(HWND_BOTTOM)或在任何非最高序的窗口以後,該窗口就不再是最頂層窗口。當一個最頂層窗口被置為非最頂級,則它的一切者窗口和所屬者窗口均為非最頂層窗口。 
  
  一個非最頂端窗口可以具有一個最頂端窗口,但反之則弗成以。任何屬於頂層窗口的窗口(例如一個對話框)自己就被置為頂層窗口,以確保一切被屬窗口都在它們的一切者之上。 
  
  假如運用法式不在前台,但應當位於前台,就應挪用SetForegroundWindow函數來設置。 
  
  Windows  CE:假如這是一個可見的頂層窗口,而且未指定SWP_NOACTIVATE標記,則這個函數將激活窗口、假如這是以後的激活窗口,而且指定了SWP_NOACTIVATE或SWP_HIDEWINDOW標記,則激活別的一個可見的頂層窗口。 
  
  當在這個函數中的nFlags參數裡指定了SWP_FRAMECHANGED標記時,WindowsCE重畫窗口的全部非客戶區,這能夠會轉變客戶區的年夜小。這也是從新盤算客戶區的獨一門路,也是經由過程挪用SetwindowLong函數轉變窗口作風後平日應用的辦法。 
  SetWindowPos將使WM_WINDOWPOSCHANGED新聞向窗口發送,在這個新聞中傳遞的標記與傳遞給函數的雷同。這個函數不傳遞其他新聞。 
  
  Windows  CE  1.0不支撐在hWndlnsertAber參數中的HWND_TOPMOST和HWND_NOTOPMOST常量。 
  
   Windows  CE1.0不支撐在fuFags參數中的SWP_DRAWFRAME和SWP_NOCOPYBITS標記。 
  
  速查:Windows  NT:3.1以上版本;Windows:95以上版本;Windows  CE:1.0以上版本;頭文件:winuser.h庫文件:eser32lib。 
 
21. 引見函數進程中一種隨意率性鍵加入同時能處置新聞的完成辦法

1. 設置准時器,用於使::GetMessage(...)函數總能疾速取到新聞.
2. 在函數處置中參加:
函數每履行完一步後履行上面的代碼.
if (::GetMessage(&msg, 0, 0, 0))
{
  if (msg.message >= WM_KEYFIRST && msg.message <= WM_KEYLAST) return ;
  ::TranslateMessage(&msg);
  ::DispatchMessage(&msg);
}
else ::PostQuitMessage(0);
22. 若何隱蔽對象欄

添加以下兩個函數

隱蔽:
void CMainFrame::OnHide()
{
  if(m_wndToolBar.IsWindowVisible())
    m_wndToolBar.ModifyStyle(WS_VISIBLE,0);
  SendMessage(WM_SIZE);
}
顯示:
void CMainFrame::OnShow()
{
  if(!m_wndToolBar.IsWindowVisible())
    m_wndToolBar.ModifyStyle(0,WS_VISIBLE);
  SendMessage(WM_SIZE);
}
23. 若何靜態獲得對象條指針並給對象條加題目?

成績提出:

對象條也是窗口,是窗口就有題目,若何給對象條加題目?

法式完成:

不想靜態轉變對象條的題目就在CMainFrame::OnCreate()中:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
......
m_wndToolBar.SetWindowText(_T("Standdard"));
return 0;
}
若想靜態轉變對象條的題目,以下:
聲明一個菜單,並呼應事宜,如呼應:OnMyToolBar()函數
void CMainFrame::OnMyToolBar()
{
// TODO: Add your command handler code here
CToolBar *pToolBar = (CToolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
pToolBar->SetWindowText (_T("Standdard"));
}
不要在TooBar懸浮時做OnMyToolBar()會失足的.
趁便提一下若何取得狀況條的指針:
CStatusBar * pStatusBar =(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
24. 在狀況條中顯示鼠標的裝備坐標與邏輯坐標

顯示器的裝備坐標系的原點在客戶區的左上角,x軸向右增加,y軸向下增加。我們要設置的邏輯坐標系的原點則在客戶區的中間,x軸向右增加,y軸向上增加,如一個笛卡爾坐標系普通。
為CChildView添加一個成員函數void OnPrepareDC(CDC * pDC, CPrintInfo * pInfo = NULL);
void OnPrepareDC(CDC * pDC, CPrintInfo * pInfo){
 CRect rect;
 // 設置映照形式為LOMETRIC (0.1mm),右上為增加偏向
 pDC->SetMapMode (MM_LOMETRIC);
 // 將坐標原點定在客戶區的中間
 GetClientRect(rect);
 pDC->SetViewportOrg(rect.Width()/2, rect.Height()/2);
}
為CChildView呼應鼠標挪動新聞,並在狀況條中顯示鼠標的坐標值。m_ptMouse數據成員是原盤算做十字穿插線用的,在此應用沒有現實意義。
void CChildView::OnMouseMove(UINT nFlags, CPoint point){
 CClientDC dc(this);
 CString str;
 OnPrepareDC(&dc);
 //要拜訪類CMainFrame,須要將mainfrm.h文件引入
 CMainFrame * pFrame = (CMainFrame *) AfxGetApp()->m_pMainWnd;
 //要拜訪CMainFrame的數據成員m_wndStatusBar,須要手工修正mainfrm.h,public這個數據成員
 CStatusBar * pStatus = (CStatusBar *) &pFrame->m_wndStatusBar;
 m_ptMouse = point;
 str.Format ("裝備坐標 X=%i pixel, Y=%i pixel", m_ptMouse.x, m_ptMouse.y);
 pStatus->SetPaneText(1, str);
 dc.DPtoLP(&m_ptMouse);
 str.Format ("邏輯坐標 X=%i * 0.1mm, Y=%i * 0.1mm", m_ptMouse.x, m_ptMouse.y);
 pStatus->SetPaneText(2, str);
}
25. 若何用VC++ 靜態修正運用法式菜單

成績提出

  本文將引見一些應用CMenu的辦法,如查找指定菜單,在指定選項前添加菜單項.....

處理辦法

  應用CWnd::GetMenu( )拜訪主菜單,GetMenu( )前往指向CMenu對象的指針,它有一些成員函數,許可我們修正一個菜單。

  1) 若何完成找到一個菜單項:
  步調以下:
  {
     //靜態修正菜單:
     // Get the Main Menu
     CMenu* pMainMenu = AfxGetMainWnd()->GetMenu();
     CMenu* pSubMenu = NULL;
     int i;
     for (i=0; i<(int)pMainMenu->GetMenuItemCount(); i++)
     {
      pSubMenu = pMainMenu->GetSubMenu(i);
      if (pSubMenu && pSubMenu->GetMenuItemID(0) == ID_FILE_NEW)
        break;
     }
     CString s;
     s.Format("%d",i);//菜單項的位數.
     AfxMessageBox(s);
     ASSERT(pSubMenu);
  }
  2) 靜態編纂菜單:
  步調以下(可以用上例的pSubMenu,要加的菜單你本身界說.):
  1) 添加一個稱為Wzd2,敕令ID為IDC_NAME_NEW1的菜單敕令到該菜單中,可以用:
     pSubMenu->AppendMenu(0,IDC_NAME_NEW1,"New&1");
  2) 在New1前拔出New2,可以用:
     pSubMenu->InsertMenu(IDC_NAME_NEW1,MF_BYCOMMAND,IDC_NAME_NEW2, "New&2");
  3) 把New1轉變成New3,可以用:
     pSubMenu->ModifyMenu(IDC_NAME_NEW1,MF_BYCOMMAND,IDC_NAME_NEW3, "New&3");
  4) 刪除該菜單中第二項,可以用:
     pSubMenu->RemoveMenu(1,MF_BYPOSITION);
26. VC++中的3D按鈕的編程
運轉AppWizard生成一個基於對話框的test工程,在對話框中參加一個CButton控件。在CButton控件的General屬性頁將控件的ID改成IDC_3DTEXTBTN,Caption改成“誰與爭瘋”,在控件Styles屬性頁選中OwnerDraw,其他設置堅持默許。
  用classwizard創立一個新類:C3dTextButton,基類為CButton。為C3dTextButton類添加一個protected的函數void Draw(CDC* pDC, const CRect& rect, UINT state)。以下所示編寫代碼:
  void C3dTextButton::Draw(CDC *pDC, const CRect &rect, UINT state)
  {
    CString text; GetWindowText(text);
    int l=text.GetLength();
    CRect rectClient=rect;
    //取得控件的字體
    CFont* pFont=GetFont();
    //肯定所選字體有用高度和寬度
    LOGFONT logfont;
    pFont->GetObject(sizeof(LOGFONT),&logfont);
    if(logfont.lfHeight==0)logfont.lfHeight=20;
    logfont.lfWidth=0;//寬度設為0,寬度值由高度肯定
    logfont.lfWeight=1000;
    logfont.lfEscapement=logfont.lfOrientation=0;
    CFont tryfont; VERIFY(tryfont.CreateFontIndirect(&logfont));
    CFont* pFontOld=pDC->SelectObject(&tryfont);
    //依據控件年夜小,調劑字體的高度,使文本與控件調和
    CSize textSizeClient=pDC->GetTextExtent(text,l);
    if(rectClient.Width()*textSizeClient.cy>rectClient.Height()*textSizeClient.cx)
    {
      logfont.lfHeight=::MulDiv(logfont.lfHeight,rectClient.Height(),textSizeClient.cy);
    }
    else{
      logfont.lfHeight = ::MulDiv(logfont.lfHeight,rectClient.Width(),textSizeClient.cx);
    }
    //創立並選擇調和後的字體
    CFont font; font.CreateFontIndirect(&logfont);
    pDC->SelectObject(&font);
    textSizeClient=pDC->GetTextExtent(text,l);
    //肯定文本與控件界限的間隔minx,miny
    int minx=rectClient.left+(rectClient.Width()-textSizeClient.cx)/2;
    int miny=rectClient.top+(rectClient.Height()-textSizeClient.cy)/2;
    int oldBkMode=pDC->SetBkMode(TRANSPARENT);
    COLORREF textcol=::GetSysColor(COLOR_BTNTEXT);
    COLORREF oldTextColor=pDC->SetTextColor(textcol);
    int cx = minx;
    int cy = miny;
    int s=(state&ODS_SELECTED)?-1:+1;
    cx+= 3; cy+= 3;
 
    //完成3D後果
    pDC->SetTextColor(::GetSysColor(COLOR_3DDKSHADOW));
    pDC->TextOut(cx-s*2,cy+s*2,text);
    pDC->TextOut(cx+s*2,cy-s*2,text);
    pDC->TextOut(cx+s*2,cy+s*2,text);
    pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
    pDC->TextOut(cx+s*1,cy-s*2,text);
    pDC->TextOut(cx-s*2,cy+s*1,text);
    pDC->TextOut(cx-s*2,cy-s*2,text);
    pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW));
    pDC->TextOut(cx-s*1,cy+s*1,text);
    pDC->TextOut(cx+s*1,cy-s*1,text);
    pDC->TextOut(cx+s*1,cy+s*1,text);
    pDC->SetTextColor(::GetSysColor(COLOR_3DLIGHT));
    pDC->TextOut(cx,cy-s*1,text);
    pDC->TextOut(cx-s*1,cy,text);
    pDC->TextOut(cx-s*1,cy-s*1,text);
    pDC->SetTextColor(textcol);
 
    //輸入題目
    pDC->TextOut(cx,cy,text);
 
    //恢復裝備描寫表
    pDC->SetTextColor(oldTextColor);
    pDC->SetBkMode(oldBkMode);
    pDC->SelectObject(pFontOld);
  }
  用classwizard重載C3dTextButton類的DrawItem函數。編寫代碼以下所示:
  void C3dTextButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  {
    CDC* pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
    ASSERT_VALID(pDC);
    CRect rectClient=lpDrawItemStruct->rcItem;
    Draw(pDC,rectClient,lpDrawItemStruct->itemState);
  }
  用classwizard為IDC_3DTEXTBTN樹立一個C3dTextButton控件變量m_3dTextButton1。

把“3dTextButton.h”參加testDlg頭文件。編譯並測試運用法式。

27. 若何准確的獲得ComBox的指針
CComboBox *mComb = (CComboBox*)GetDlgItem(IDC_DuanCB);
CComboBox *mComb = (CComboBox*)::GetDlgItem(m_hWnd,IDC_DuanCB);
28. 若何讓對話框中的CEdit控件類吸收對話框的新聞
////////////////////////////////////////////////
// 若何讓對話框中的CEdit控件類吸收對話框的新聞
////////////////////////////////////////////////
1、在對話框中增長一個ID 為IDC_EDIT1的CEdit1控件
2、經由過程ClassWizard 生成一個基於CEdit的新類CMyEdit,
CMyEdit m_wndEdit;
3、在對話框OnInitDialog()中,將m_wndEdit子類化,使其可以或許接收對話框的新聞。
m_wndEdit.SubclassDlgItem (IDC_EDIT1,this);
29.應用WM_CTLCOLOR新聞完成編纂掌握(Edit Control)的文本與配景色的轉變
起首要明確:WM_CTLCOLOR是一個由掌握(Control)發送給它父窗口的告訴新聞(Notification message)。

完成步調:

生成一個尺度的單文檔運用法式框架,假定運用法式的稱號為Color。我將應用它的About對話框做示范。在About dialog中添加兩個Edit control,設定其ID為IDC_EDIT1與IDC_EDIT2。

第一種辦法(對應於IDC_EDIT1): 依照尺度的Windows編程,由其父窗口的新聞處置函數擔任處置WM_CTLCOLOR新聞。

1. 在CAboutDlg中添加一個數據成員:HBRUSH m_brMine;
2. 應用領導映照AboutDlg的WM_CTLCOLOR新聞,發生函數:HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
pDC是AboutDlg的裝備高低文,pWnd是AboutDlg中發送該新聞的control指針,nCtlColor市Control的類型編碼。對其停止以下修正:
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
  }
  便可.找個法式(竊取)的嘗嘗.

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->WordStrSel(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 );
}

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);
  }

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);

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中)檢討能否須要將窗口居中,你看了這個函數後就明確為何須要下面那末做了。

願望本文所述對年夜家的MFC法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved