VC技术总结(一)- -| 回首页 | 2005年索引 | - -VC入门

VC技术总结(二)

                                      

17-19工具栏和状态栏

17、如何在代码中获取工具栏和状态栏的指针

缺省时,工作框创建状态栏和工具栏时将它们作为主框窗口的子窗口,状态栏
有一个AFX_IDW_STATUS_BAR标识符,工具栏有一个AFX_IDW_TOOLBAR标识符,下例说
明了如何通过一起调用CWnd::GetDescendantWindow和AfxGetMainWnd来获取这些
子窗口的指针:
//Getpointertostatusbar.
CStatusBar*pStatusBar=
(CStatusBar*)AfxGetMainWnd()—>GetDescendantWindow
(AFX_IDW_STUTUS_BAR);

//Getpointertotoolbar.
CToolBar*pToolBar=
(CToolBar*)AfxGetMainWnd()—>GetDescendantWindow(AFX_IDW_TOOLBAR);


18、如何使能和禁止工具栏的工具提示

如果设置了CBRS_TOOLTIPS风格位,工具栏将显示工具提示,要使能或者禁止
工具提示,需要设置或者清除该风格位。下例通过调用CControlBar::GetBarStyle
和CControlBar::SetBarStyle建立一个完成此功能的成员函数:
voidCMainFrame::EnableToolTips(BOOLbDisplayTips)
{
ASSERT_VALID(m_wndToolBar);

DWORDdwStyle=m_wndToolBar.GetBarStyle();

if(bDisplayTips)
dwStyle|=CBRS_TOOLTIPS;
else
dwStyle&=~CBRS_TOOLTIPS;

m_wndToolBar.SetBarStyle(dwStyle);
}


19、如何设置工具栏标题

工具栏是一个窗口,所以可以在调用CWnd::SetWindowText来设置标题,
例子如下:
intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct)
{


//Setthecaptionofthetoolbar.
m_wndToolBar.SetWindowText(_T"Standdard");

20-23对话框

20、如何创建和使用无模式对话框

MFC将模式和无模式对话封装在同一个类中,但是使用无模式对话需要几
个对话需要几个额处的步骤。首先,使用资源编辑器建立对话资源并使用
ClassWizard创建一个CDialog的派生类。模式和无模式对话的中止是不一样的:
模式对话通过调用CDialog::EndDialog来中止,无模式对话则是调用
CWnd::DestroyWindow来中止的,函数CDialog::OnOK和CDialog::OnCancel
调用EndDialog,所以需要调用DestroyWindow并重置无模式对话的函数。
voidCSampleDialog::OnOK()
{
//Retrieveandvalidatedialogdata.
if(!UpdateData(TRUE))
{
//theUpdateDatarountinewillsetfocustocorrectitem
TRACEO("UpdateDatafailedduringdialogtermination.\n");
return;
}

//CallDestroyWindowinsteadofEndDialog.
DestroyWindow();
}

voidCSampleDialog::OnCancel()
{
//CallDestroyWindowinsteadofEndDialog.
DestroyWindow();
}
其次,需要正确删除表示对话的C++对象。对于模式对来说,这很容易,需要创
建函数返回后即可删除C++对象;无模式对话不是同步的,创建函数调用后立即返回,
因而用户不知道何时删除C++对象。撤销窗口时工作框调用CWnd::PostNcDestroy,
可以重置该函数并执行清除操作,诸如删除this指针。
voidCSampleDialog::PostNcDestroy()
{
//DecletetheC++objectthatrepresentsthisdialog.
deletethis;
}
最后,要创建无模式对话。可以调用CDialog::DoModal创建一个模式对放,
要创建一个无模式对话则要调用CDialog::Create。下面的例子说明了应用程序
是如何创建无模式对话的:
voidCMainFrame::OnSampleDialog()
{
//Allocateamodelessdialogobject.
CSampleDilog*pDialog=newCSampleDialog;
ASSERT_VALID(pDialog);

//Createthemodelessdialog.
BOOLbResult=pDialog—>Creste(IDD_IDALOG);
ASSERT(bResult);
}


21、如何在对话框中显示一个位图

这要归功于Win32先进的静态控件和Microsoft的资源编辑器,在对话框中
显示位图是很容易的,只需将图形控件拖到对话中并选择适当属性即可,用户也
可以显示图标、位图以及增强型元文件。


22、如何改变对话或窗体视窗的背景颜色

调用CWinApp::SetDialogBkColor可以改变所有应用程序的背景颜色。第
一个参数指定了背景颜色,第二个参数指定了文本颜色。下例将应用程序对话设置
为蓝色背景和黄色文本。
BOOLCSampleApp::InitInstance()
{


//usebluedialogwithyellowtext.
SetDialogBkColor(RGB(0,0,255),RGB(255,255,0));


}
需要重画对话(或对话的子控件)时,Windows向对话发送消息WM_CTLCOLOR,
通常用户可以让Windows选择绘画背景的刷子,也可重置该消息指定刷子。下例说
明了创建一个红色背景对话的步骤。
首先,给对话基类增加一人成员变量CBursh:
classCMyFormView:publicCFormView
{


private:
CBrushm_brush;//backgroundbrush


};
其次,在类的构造函数中将刷子初始化为所需要的背景颜色。
CMyFormView::CMyFormView()
{
//Initializebackgroundbrush.
m_brush.CreateSolidBrush(RGB(0,0,255))
}
最后,使用ClassWizard处理WM_CTLCOLOR消息并返回一个用来绘画对话背景的
刷子句柄。注意:由于当重画对话控件时也要调用该函数,所以要检测nCtlColor
参量。
HBRUSHCMyFormView::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)
{
//Determineifdrawingadialogbox.Ifweare,return+handleto
//ourownbackgroundbrush.Otherwiseletwindowshandleit.
if(nCtlColor==CTLCOLOR_DLG)
return(HBRUSH)m_brush.GetSafeHandle();

returnCFormView::OnCtlColor(pDC,pWnd,nCtlColor);
}


23、如何获取一个对话控件的指针

有两种方法。其一,调用CWnd::GetDlgItem,获取一个CWnd*指针调用成
员函数。下例调用GetDlgItem,将返回值传给一个CSpinButtonCtrl*以便调用
CSpinButtonCtrl::SetPos函数:
BOOLCSampleDialog::OnInitDialog()
{
CDialog::OnInitDialog();

//Getpointertospinbutton.
CSpinButtonCtrl*pSpin-(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN);
ASSERT_VALID(pSpin);

//Setspinbutton'sdefaultposition.
pSpin—>SetPos(10);

returnTRUE;
}
其二,可以使用ClassWizard将控件和成员变量联系起来。在ClassWizard中简
单地选择MemberVariables标签,然后选择AddVariable…按钮。如果在对话资源
编辑器中,按下Ctrl键并双击控件即可转到AddMemberVariable对话。

【作者: sentven】【访问统计:】【2005年11月25日 星期五 18:26】【 加入博采】【打印

Trackback

你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=3647532

博客手拉手

[2005-11-25 17:15:40.0]    天资过人而又是技术狂热者同时还拥有过人的商业头脑,高瞻远瞩,技术过人,大器也。

[2005-11-25 16:55:11.0]    23岁的总结

[2005-11-25 17:42:20.0]    花园轶事

[2005-11-25 17:38:36.0]    网民搜索视频新贵,无所不能之tvix

[2005-11-25 16:57:49.0]    整合营销传播初探

回复

评论内容: