⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 base5.htm

📁 C++Builder教学大全
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>WINDOWS编程基础</title>
<meta name="Microsoft Border" content="none">
</head>

<body>

<h1 style="margin-top: 0; margin-bottom: 0">&nbsp;&nbsp;&nbsp; WINDOWS编程基础</h1>   
<p style="margin-top: 0; margin-bottom: 0"></p>  
<p style="margin-top: 0; margin-bottom: 0"><a href="index.htm">[ 主页 ]</a>&nbsp;&nbsp; 
<a href="base.htm">[上一层]</a></p>  
<hr> 
<p> &nbsp; 随着PC机上图象处理软件及显示卡技术的发展,使苹果Mac(麦金托什)机独霸图象处理的局面被打破。如今在PC机上处理高质量图象已不再是梦想,丰富的图象处理软件如Photo       
Styler、Corel Draw、Adobe Photoshop、Paintbrush、Freehand、Imagepal、Picture       
Publisher等等,其处理图象的能力和水平已直追一些专业图形图象工作站。加上多媒体技术的推广发展,使图象处理成为当今多媒体应用中的一项重要内容。&nbsp;<br>     
Windows提供的三大主要功能中,标准的图形用户界面最引人注目,而且对用户也是最重要的。在它所提供的用户界面中使用图标来代表驱动器、文件、子目录和许多操作系统的命令及操作。<br>     
&nbsp;&nbsp;&nbsp; 因为所有的Windows程序都具有类似的结构和相同的“外观”,所以用户不需花费很长的时间来学习新程序的用法。对于编程人员而言,具有这种一致的用户界面是因为直接使用Windows的内部子模序来创建用户界面的基本元素(菜单、对话框、滚动条等)。所有的菜单都具有同样的键盘和鼠标接口,这是因为Windows自己处理这项工作,而不是把它交给应用程序去完成。<br>      
&nbsp;&nbsp;&nbsp; Windows的多任务操作环境允许用户同时运行多个应用程序,或在同一个程序中同时“并行”完成几件事情。一个典型的例子是在Windows中运行四个应用程序,每个程序在屏幕上占一个矩形区域。用户可在任何时间移动屏幕上的窗口、改变窗口大小、从一个窗口转换到另一个窗口和修改窗口内的信息。<br>      
&nbsp;&nbsp;&nbsp;       
虽然例程里的这个例子有四个并发执行的进程,但是在任何时候只有一个进程在实际使用处理器。并发运行的任务可以有任意多个,由Windows负责把处理器时间分配给多个任务,Windows根据排好的输入队列及其他信息来控制微处理器时间的分配。<br>     
在多任务操作系统未出现之前,应用程序独自控制计算机的所有资源(输入/输出设备、内存、显示器和CPU)。而在Windows中,所有这些资源都是共享的。<br>     
&nbsp;&nbsp;&nbsp; 内存是Windows中最重要的共享资源之一,当多个应用程序在同一时间运行时,这些应用程序共享内存资源,如果程序运行结束,则归还其所占用的内存区域。为了提供大块内存区域,Windwos能在内存中搬移整块代码和数据,把存储碎片收集起来以形成大块连续的内存区域。Windows在内存管理方面的一个最明显特征是它把软件开发者从DOS的内存限制中解放出来。<br>      
&nbsp;&nbsp;&nbsp;       
在用户并发运行的几个程序都调用同一个程序时,为了节省空间,Windows共享那一段相同的代码,在Windows中运行的程序甚至可以共享其他.EXE文件中的例程。在Windows中把包含这种共享的例程的库文件称为动态链接库(DLL),Windows在运行时可把程序与动态链接库中的例程链接起来。为此,Windows程序使用了一种新的.EXE文件格式,这种文件包括了Windows执行时所需要的信息,如管理代码段和数据段以及用于动态链接的必要信息。<br>     
<br>     
&nbsp;&nbsp;&nbsp; 在开始介绍Windows图形程序设计之前,这里我想先介绍一些Visual       
C++图形编程常见的问题和一些基本方法和技巧:<br>     
一、在用户环境中确定系统显示元素的颜色&nbsp;<br>     
调用SDK函数GetSysColor可以获取一个特定显示元素的颜色。下例说明了如何在MFC函数CMainFrameWnd::       
OnNcPaint中调用该函数设置窗口标题颜色。&nbsp;<br>     
void CMiniFrameWnd:: OnNcPaint ()&nbsp;<br>      
{ kk1}<br>      
…&nbsp;<br>     
dc.SetTextColor (:: GetSysColor (m_bActive ?&nbsp;<br>      
OLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT));&nbsp;<br>      
…&nbsp;<br>     
}&nbsp;<br>     
二、访问预定义的GDI对象&nbsp;<br>     
可以通过调用CDC:: SlectStockObject使用Windows的几个预定义的对象,诸       
如刷子、笔以及字体。下例使用了Windows预定义的笔和刷子GDI对象在视窗中画一个椭圆。&nbsp;<br>     
//Draw ellipse using stock black pen and gray brush.&nbsp;<br>      
void CSampleView:: OnDraw (CDC* pDC)&nbsp;<br>      
{ kk1}<br>      
//Determine size of view.&nbsp;<br>      
CRect rcView;&nbsp;<br>      
GetClientRect (rcView);&nbsp;<br>      
//Use stock black pen and stock gray brush to draw ellipse.&nbsp;<br>      
pDC-&gt;SelectStockObject (BLACK_PEN);&nbsp;<br>      
pDC-&gt;SelectStockObject (GRAY_BRUSH)&nbsp;<br>      
//Draw the ellipse.&nbsp;<br>      
pDC-&gt;Ellipse (reView);&nbsp;<br>      
}&nbsp;<br>     
也可以调用新的SDK函数GetSysColorBrush获取一个系统颜色刷子,下例用背景色在视窗中画一个椭圆:<br>     
void CsampleView:: OnDraw (CDC* pDC)&nbsp;<br>      
{kk1}&nbsp;<br>     
//Determine size of view.&nbsp;<br>      
CRect rcView;&nbsp;<br>      
GetClientRect (rcView);&nbsp;<br>      
//Use background color for tooltips brush.&nbsp;<br>      
CBrush * pOrgBrush=pDC-&gt;SelectObject<br>      
(CBrush::FromHandle(::GetSysColorBrush (COLOR_INFOBK)));&nbsp;<br>      
//Draw the ellipse.&nbsp;<br>      
pDC-&gt;Ellipse (rcView);&nbsp;<br>      
//Restore original brush.&nbsp;<br>      
pDC-&gt;SelectObject (pOrgBrush);&nbsp;<br>      
}&nbsp;<br>     
三、确定GDI对象的属性信息&nbsp;<br>     
可以调用GDIObject:: GetObject。这个函数将指定图表设备的消息写入到&nbsp;<br>      
缓冲区。下例创建了几个有用的辅助函数。&nbsp;<br>     
//Determine if font is bold.&nbsp;<br>      
BOOL IsFontBold (const CFont&amp;font)&nbsp;<br>      
{kk1}&nbsp;<br>     
LOGFONT stFont;&nbsp;<br>      
font.GetObject (sizeof (LOGFONT), &amp;stFont);&nbsp;<br>      
return (stFont.lfBold)? TRUE: FALSE;&nbsp;<br>      
}&nbsp;<br>     
<br>     
//Return the size of a bitmap.&nbsp;<br>      
CSize GetBitmapSize (const CBitmap&amp;bitmap)&nbsp;<br>      
{ kk1}<br>      
BITMAP stBitmap;&nbsp;<br>      
bitmap.GetObject (sizeof (BITMAP), &amp;stBitmap);&nbsp;<br>      
return CSize (stBitmap.bmWidth, stBitmap. bmHeight);&nbsp;<br>      
}&nbsp;<br>     
//Create a pen with the same color as a brush. BOOL CreatePenFromBrush       
(Cpen&amp;pen, cost Cbrush&amp;brush)&nbsp;<br>      
{kk1}&nbsp;<br>     
LOGBRUSH stBrush;&nbsp;<br>      
brush.Getobject (sizeof (LOGBRUSH), &amp;stBrush);&nbsp;<br>      
return pen. Createpen (PS_SOLID, 0, stBrush.ibColor);&nbsp;<br>      
}&nbsp;<br>     
四、实现一个橡皮区矩形&nbsp;<br>     
CRectTracker是一个很有用的类,可以通过调用CRectTracker::TrackRubberBand&nbsp;<br>     
响应WM_LBUTTONDOWN消息来创建一个橡皮区矩形。下例表明使用CRectTracker移动和重置视窗中的蓝色椭圆的大小是很容易的事情。&nbsp;<br>     
首先,在文件档中声明一个CRectTracker数据成员: class       
CSampleView : Public CView&nbsp;<br>      
{ kk1}<br>      
…&nbsp;<br>     
public :&nbsp;<br>      
CrectTracker m_tracker;&nbsp;<br>      
…&nbsp;<br>     
};&nbsp;<br>     
其次,在文档类构造函数中初始化CRectTracker对象: CSampleDoc::       
CSampleDOC ()&nbsp;<br>      
{ kk1}<br>      
//Initialize tracker position, size and style. m_tracker.m_rect.SetRect (0, 0,       
10, 10);&nbsp;<br>      
m_tracker.m_nStyle=CRectTracker:: resizeInside | CRectTracker:: dottedLine;&nbsp;<br>      
}&nbsp;<br>     
然后,在OnDraw函数中画椭圆和踪迹矩形:&nbsp;<br>     
void CSampleView:: OnDraw (CDC* pDC)&nbsp;<br>      
{ kk1}<br>      
CSampleDoc* pDoc=GetDocument ();&nbsp;<br>      
ASSERT_VALID (pDoc);&nbsp;<br>      
//Select blue brush into device context. CBrush brush (RGB (0, 0, 255));&nbsp;<br>      
CBrush* pOldBrush=pDC-&gt;SelectObject (&amp;brush);&nbsp;<br>      
//draw ellipse in tracking rectangle.&nbsp;<br>      
Crect rcEllipse;&nbsp;<br>      
pDoc-&gt;m_tracker.GetTrueRect (rcEllipse);&nbsp;<br>      
pDC-&gt;Ellipse (rcEllipse);&nbsp;<br>      
//Draw tracking rectangle.&nbsp;<br>      
pDoc-&gt;m_tracker.Draw (pDC);&nbsp;<br>      
//Select blue brush out of device context.&nbsp;<br>      
pDC-&gt;Selectobject (pOldBrush);&nbsp;<br>      
}&nbsp;<br>     
最后,使用ClassWizard处理WM_LBUTTONDOWN消息,并增加下述代码。该段代码根据鼠标击键情况可以拖放、移动或者重置椭圆的大小。&nbsp;<br>     
void CSampleView::OnLButtonDown (UINT nFlags, CPoint point)&nbsp;<br>      
{ kk1}<br>      
//Get pointer to document.&nbsp;<br>      
CSampleDoc* pDoc=GetDocument ();&nbsp;<br>      
ASSERT_VALID (pDoc);&nbsp;<br>      
//If clicked on ellipse, drag or resize it. Otherwise create a rectangle<br>      
//rubber-band rectangle nd create a new ellipse. BOOL       
bResult=pDoc-&gt;m_tracker.HitTest (point)!=&nbsp;<br>      
CRectTracker::hitNothing;&nbsp;<br>     
//Tracker rectangle changed so update views.&nbsp;<br>      
if (bResult)&nbsp;<br>      
{ kk1}<br>      
pDoc-&gt;m_tracker.Track (this,point,TRue);<br>      
pDoc-&gt;SetModifiedFlag ();&nbsp;<br>      
pDoc-&gt;UpdateAllViews (NULL);&nbsp;<br>      
}&nbsp;<br>     
else pDoc-&gt;m-tracker.TrackRubberBand (this,point,TRUE);&nbsp;<br>      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -