您当前的位置:首页 > 计算机论文>计算机应用论文

深入应用Visual C++编程

2015-12-14 13:54 来源:学术参考网 作者:未知

摘 要:本文主要介绍如何使用Visual C++编程技巧,突破一般的用鼠标单击窗口标题栏移动窗口、用字体属性设置文本旋转效果,通过编程巧妙实现用鼠标单击窗口标题栏以外区域移动窗口、显示旋转文本的操作。同时简单介绍使用上下文菜单的操作。

关键词:Visual;C++;窗口;旋转文本
引言
  Visual C++是一个功能强大的面向对象的可视化应用程序开发工具,是计算机界公认的最优秀的应用开发工具之一。在提供可视化的编程方式的同时,Visual C++也适用于编写直接对系统进行底层操作的程序,生成代码的质量也优于其它的开发工具。它提供的AppWizard能自动生成应用程序的标准框架,大大减轻了编程的工作量,使得程序员从大量的复杂劳动中解脱出来,体会到真正的程序语言的强大功能和良好的灵活性。本文主要介绍如下的编程技巧:用鼠标单击窗口标题条以外区域移动窗口、显示旋转文本、使用上下文菜单。
1  用鼠标单击窗口标题栏以外区域移动窗口
    移动标准窗口是通过用鼠标单击窗口标题栏来实现的,但对于没有标题栏的窗口,就需要用鼠标单击窗口标题栏以外区域来移动窗口。有两种方法可以达到这一目标。
    方法一:当窗口确定鼠标位置时,Windows向窗口发送WM_NCHITTEST消息,可以处理该消息,使得只要鼠标在窗口内,Windows便认为鼠标在标题栏上。这需要重载CWnd类处理WM_NCHITTEST消息的OnNcHitTest函数,在函数中调用父类的该函数,如果返回HTCLIENT,说明鼠标在窗口客户区内,使重载函数返回HTCAPTION,使Windows误认为鼠标处于标题栏上。
    下面是使用该方法的实际代码:
UINT CEllipseWndDlg::OnNcHitTest(CPoint point)
{        // 取得鼠标所在的窗口区域
UINT nHitTest = CDialog::OnNcHitTest(point);
// 如果鼠标在窗口客户区,则返回标题栏代号给Windows
// 使Windows按鼠标在标题栏上类进行处理,即可单击移动窗口
return (nHitTest==HTCLIENT) ? HTCAPTION : nHitTest;
}
    方法二:当用户在窗口客户区按下鼠标左键时,使Windows认为鼠标是在标题栏上,即在处理WM_LBUTTONDOWN消息的处理函数OnLButtonDown中发送一个wParam参数为HTCAPTION,lParam为当前坐标的WM_NCLBUTTONDOWN消息。
    下面是使用该方法的实际代码:
void CEllipseWndDlg::OnLButtonDown(UINT nFlags, CPoint point)
{      // 调用父类处理函数完成基本操作
CDialog::OnLButtonDown(nFlags, point);
// 发送WM_NCLBUTTONDOWN消息
// 使Windows认为鼠标在标题栏上
PostMessage(WM_NCLBUTTONDOWN,
HTCAPTION,
MAKELPARAM(point.x, point.y));
}
2  显示旋转文本
    在有的应用中,为了达到特殊的效果,经常需要显示旋转的文本。文本的显示方式,包括旋转,都是由字体来设置的。
    字体的属性主要由创建字体时使用的LOGFONT结构规定,该结构中的lfEscapement域指定了文本行与X轴(水平轴)的角度,其角度单位是十分之一度。为了使所有的字体向相同的方向旋转,还应同时将LOGFONT结构的lfClipPrecision域设为 CLIP_LH_ANGLES。
    下面的代码将在对话框中显示在同一起点每隔15度显示一行文本:
void CRotateTextDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CRect rc;
GetClientRect(rc);
CString str(_T(""............旋转文本!""));
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(0,0,255));
CFont font;
LOGFONT lf;
memset(&lf,0,sizeof(LOGFONT));
lf.lfHeight = -14;
lf.lfWeight = FW_NORMAL;
lf.lfClipPrecision = CLIP_LH_ANGLES;
strcpy(lf.lfFaceName, ""宋体"");
for (int i=0;i<3600;i+=150)
{
lf.lfEscapement = i;
font.CreateFontIndirect(&lf);
CFont *pOldFont = dc.SelectObject(&font);
dc.TextOut(rc.right/2, rc.bottom/2,str);
dc.SelectObject(pOldFont);
font.DeleteObject();
}
CDialog::OnPaint();
}}
3  使用上下文菜单
  Windows 应用程序支持单击鼠标右键弹出上下文菜单的功能,这可通过处理WM_CONTEXTMENU消息来实现。
  当在窗口内单击鼠标右键时,窗口将接收到WM_CONTEXTMENU消息,在该消息的处理函数内装载上下文菜单,并调用CMenu::TrackPopupMenu函数便可显示上下文菜单。CMenu::TrackPopupMenu函数的原型如下:
BOOL TrackPopupMenu( UINT nFlags,    // 显示和选取方式标志
int x, int y,    // 显示菜单的左上角坐标
CWnd* pWnd,    // 接收菜单操作的窗口对象
LPCRECT lpRect = NULL ); // 敏感区域
    为了使用上下文菜单,首先应在资源编辑器中编制好上下文菜单,假设上下文菜单名为IDR_MENU_CONTEXT;其次,用ClassWizard给窗口增加处理消息WM_CONTEXTMENU的函数OnContextMenu,以及各菜单命令的处理函数;然后编写相应的代码。
    下面的是OnContextMenu函数的代码实例:
void CEllipseWndDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu menu;        // 装入菜单
menu.LoadMenu(IDR_MENU_CONTEXT);      // 显示菜单
menu.GetSubMenu(0)->TrackPopupMenu(
TPM_LEFTALIGNTPM_LEFTBUTTONTPM_RIGHTBUTTON,
point.x, point.y, this);
}
4  结束语
  Visual C++ 功能强大又具有很好的灵活性,同传统的结构化程序设计方法相比,它缩短软件的研制时间,提高软件的开发效率,使程序员可以更好的理解和管理庞大而复杂的程序。它利用了人们根据对事物分类和抽象的倾向,引入了类和对象的概念,具有封装性(数据抽象)、继承和多态的特点。由于面向对象的程序设计方法非常贴近现实,所以越来越流行。学好Visual C++对我们今后编程大有裨益。 
参考文献:
[1] 郑阿奇. Visual C++教程[M]. 北京:机械工业出版社,2004.9.1
[2] 蒋立翔.C++程序设计技能百练[M]. 北京:中国铁道出版社,2004.1.1
[3] 萨维茨.完美C++教程[M]. 北京:清华大学出版社,2005.8.1
[4] 金雪云. Visual C++教程[M]. 北京:清华大学出版社,2005.7.1

相关文章
学术参考网 · 手机版
https://m.lw881.com/
首页