VC學習筆記9:幾個指針
為了在視類中能夠調用放在其它類中的數(shù)據(jù)或函數(shù),應該先獲得相應類的指針。
1、指向文檔類(CxxDoc)的指針:
CxxDoc*pDoc = GetDocument();//文檔指針
則用pDoc->xxxx的方法可在視類中訪問文檔類中的變量和函數(shù)。
2、指向應用程序類(CxxApp)的指針:
CxxApp*app = (CxxApp *)AfxGetApp();//應用程序指針
用app->xxxx的方法可在文檔類或視類中調用CxxApp中放置的數(shù)據(jù)了。
我一般把文檔和視公用的數(shù)據(jù)放在CxxApp類中,再用以上方法訪問。
3、指向主框架(CMainFrame)的指針:
CFrameWnd *pFrameWnd=GetParentFrame();//獲取框架窗口指針
用pFrameWnd->xxxx訪問CWnd類的函數(shù)。
這種方法多用于獲取窗口的位置、大小等操作,用于視類。
4、指向某一控件的指針:
如:CWnd *pEdit = GetDlgItem(IDC_EDIT1); //獲取編輯控件指針
IDC_EDIT1為
控件ID號。
這主要是為了能修改控件大小、位置,
獲取控件風格等。
5、指向狀態(tài)條的指針:
CStatusBar* pStatus;//狀態(tài)欄指針
pStatus=(CStatusBar *)(app->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR));
app為上面的應用程序指針。
這主要是為了更改狀態(tài)欄中顯示的內容。
VC學習筆記10:狀態(tài)欄:1、在狀態(tài)欄中顯示提示:
CxxApp*app = (CxxApp *)AfxGetApp();//應用程序指針
CStatusBar* pStatus;//狀態(tài)欄指針
if(pStatus)
{
pStatus=(CStatusBar *)(app->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR));
pStatus->SetPaneText(0,str);//0為狀態(tài)欄窗格號,str為顯示的字符串
}
2、在狀態(tài)欄中增加窗格:
下例中增加了三個新窗格:
(1)修改MainFrm.cpp:
static UINT indicators[] =
{
ID_SEPARATOR,// status line indicator
ID_SEPARATOR,//新增窗格1:放置總字節(jié)數(shù)
ID_SEPARATOR,//新增窗格2:半角字數(shù)
ID_SEPARATOR,//新增窗格3:全角字數(shù)
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1;// fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1;// fail to create
}
m_wndStatusBar.SetPaneInfo(1,ID_SEPARATOR,0,95); //設置新增窗格1的寬度
m_wndStatusBar.SetPaneInfo(2,ID_SEPARATOR,0,100); //設置新增窗格2的寬度
m_wndStatusBar.SetPaneInfo(3,ID_SEPARATOR,0,100); //設置新增窗格3的寬度
…………
}
(2)在新窗格中顯示內容
以下程序為視類中顯示狀態(tài)信息的部分,
CStatusBar *pStatus=(CStatusBar *)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
if(pStatus)
{
CString str;
str.Format("字節(jié)數(shù):%d",len);
pStatus->SetPaneText(1,str);//在窗格1顯示內容
str.Format("半角字符:%d",chnum);
pStatus->SetPaneText(2,str);//在窗格2顯示內容
str.Format("全角字符:%d",hannum/2);
pStatus->SetPaneText(3,str);//在窗格3顯示內容
}
VC學習筆記11:設置程序窗口的初始大小:在應用程序類(CxxAPP)的 InitInstance 函數(shù)中加入:
m_pMainWnd->SetWindowPos(NULL,x,y,Width,Height,SWP_NOMOVE);
Width為窗口寬度,Height為窗口高度
SWP_NOMOVE表示忽略位置(x,y)。
如:
BOOL CDzyApp::InitInstance()
{
AfxEnableControlContainer();
……
// The one and only window has been initialized, so show and update it.
m_pMainWnd->SetWindowPos(NULL,0,0,750,555,SWP_NOMOVE);//設置窗口的初始大小為750*555
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
VC學習筆記12:如何讓窗口一啟動就最大化?方法一:
將應用程序類(CxxAPP)的 InitInstance 函數(shù)中的
m_pMainWnd->ShowWindow(SW_SHOW); 改為
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED); //讓窗口一啟動就最大化
例:
BOOL CMyEditApp::InitInstance()
{
…………
m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
…………
}
方法二:
在應用程序類(CxxAPP)的 InitInstance 函數(shù)中設定 m_nCmdShow的取值.
m_nCmdShow=SW_SHOWMAXIMIZED; //最大化
m_nCmdShow=SW_SHOWMINIMIZED; //最小化
m_nCmdShow=SW_SHOWNORMAL; //正常方式
例:
BOOL CMyEditApp::InitInstance()
{
AfxEnableControlContainer();
m_nCmdShow=SW_SHOWMAXIMIZED; //最大化
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
…………
}
VC學習筆記13:使窗口打開時處于屏幕正中:在MainFrm.cpp文件的OnCreate函數(shù)中加入:
CenterWindow( GetDesktopWindow() );
即可。
如:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
……
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
CenterWindow( GetDesktopWindow() ); //使窗口打開時處于屏幕正中
return 0;
}
VC學習筆記14:修改程序窗口標題:窗口標題一般形式為:文檔標題 - 程序標題
1、修改文檔標題:
文檔標題是由工程中相應的文檔類所控制的,因此我們可以在文檔中利用SetTitle()函數(shù)來改變文檔標題。
在文檔類的OnNewDocument()函數(shù)中加入語句:
BOOL CWEditDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
SetTitle("未命名");//設置文檔標題
return TRUE;
}
2、修改程序標題:
在MainFrm.cpp的PreCreateWindow()函數(shù)中加入:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
//the CREATESTRUCT cs
m_strTitle = _T("記事本");//設置程序標題
cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
| WS_THICKFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_MAXIMIZE;
return TRUE;
}
以上兩條比較適合于窗口標題是固定值的情況,或用來設置初始時的窗口標題。若標題經常改變,可采用CWnd類的SetWindowText()函數(shù)。
3、修改整個標題:
AfxGetMainWnd()->SetWindowText(m_Title);
m_Title為新標題的字符串變量
一般把該語句放在應用程序類的 InitInstance 函數(shù)中。
例:
BOOL CMyEditApp::InitInstance()
{
AfxEnableControlContainer();
…………
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
AfxGetMainWnd()->SetWindowText("未命名.txt - 記事本"); //修改標題
return TRUE;
}
該函數(shù)也可在視圖類中隨時修改標題。