当前位置:编程学习 > 网站相关 >>

WINDOWS编程基础

随着PC机上图象处理软件及显示卡技术的发展,使苹果Mac(麦金托什)机独霸图象处理的局面被打破。如今在PC机上处理高质量图象已不再是梦想,丰富的图象处理软件如Photo Styler、Corel Draw、Adobe Photoshop、Paintbrush、Freehand、Imagepal、Picture Publisher等等,其处理图象的能力和水平已直追一些专业图形图象工作站。加上多媒体技术的推广发展,使图象处理成为当今多媒体应用中的一项重要内容。
Windows提供的三大主要功能中,标准的图形用户界面最引人注目,而且对用户也是最重要的。在它所提供的用户界面中使用图标来代表驱动器、文件、子目录和许多操作系统的命令及操作。
    因为所有的Windows程序都具有类似的结构和相同的“外观”,所以用户不需花费很长的时间来学习新程序的用法。对于编程人员而言,具有这种一致的用户界面是因为直接使用Windows的内部子模序来创建用户界面的基本元素(菜单、对话框、滚动条等)。所有的菜单都具有同样的键盘和鼠标接口,这是因为Windows自己处理这项工作,而不是把它交给应用程序去完成。
Windows的多任务操作环境允许用户同时运行多个应用程序,或在同一个程序中同时“并行”完成几件事情。一个典型的例子是在Windows中运行四个应用程序,每个程序在屏幕上占一个矩形区域。用户可在任何时间移动屏幕上的窗口、改变窗口大小、从一个窗口转换到另一个窗口和修改窗口内的信息。
   虽然例程里的这个例子有四个并发执行的进程,但是在任何时候只有一个进程在实际使用处理器。并发运行的任务可以有任意多个,由Windows负责把处理器时间分配给多个任务,Windows根据排好的输入队列及其他信息来控制微处理器时间的分配。
在多任务操作系统未出现之前,应用程序独自控制计算机的所有资源(输入/输出设备、内存、显示器和CPU)。而在Windows中,所有这些资源都是共享的。
    内存是Windows中最重要的共享资源之一,当多个应用程序在同一时间运行时,这些应用程序共享内存资源,如果程序运行结束,则归还其所占用的内存区域。为了提供大块内存区域,Windwos能在内存中搬移整块代码和数据,把存储碎片收集起来以形成大块连续的内存区域。Windows在内存管理方面的一个最明显特征是它把软件开发者从DOS的内存限制中解放出来。
    在用户并发运行的几个程序都调用同一个程序时,为了节省空间,Windows共享那一段相同的代码,在Windows中运行的程序甚至可以共享其他.EXE文件中的例程。在Windows中把包含这种共享的例程的库文件称为动态链接库(DLL),Windows在运行时可把程序与动态链接库中的例程链接起来。为此,Windows程序使用了一种新的.EXE文件格式,这种文件包括了Windows执行时所需要的信息,如管理代码段和数据段以及用于动态链接的必要信息。

    在开始介绍Windows图形程序设计之前,这里我想先介绍一些Visual C++图形编程常见的问题和一些基本方法和技巧:
一、在用户环境中确定系统显示元素的颜色
调用SDK函数GetSysColor可以获取一个特定显示元素的颜色。下例说明了如何在MFC函数CMainFrameWnd:: OnNcPaint中调用该函数设置窗口标题颜色。
void CMiniFrameWnd:: OnNcPaint ()
{ kk1}

dc.SetTextColor (:: GetSysColor (m_bActive ?
OLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT));

}
二、访问预定义的GDI对象
可以通过调用CDC:: SlectStockObject使用Windows的几个预定义的对象,诸 如刷子、笔以及字体。下例使用了Windows预定义的笔和刷子GDI对象在视窗中画一个椭圆。
//Draw ellipse using stock black pen and gray brush.
void CSampleView:: OnDraw (CDC* pDC)
{ kk1}
//Determine size of view.
CRect rcView;
GetClientRect (rcView);
//Use stock black pen and stock gray brush to draw ellipse.
pDC->SelectStockObject (BLACK_PEN);
pDC->SelectStockObject (GRAY_BRUSH)
//Draw the ellipse.
pDC->Ellipse (reView);
}
也可以调用新的SDK函数GetSysColorBrush获取一个系统颜色刷子,下例用背景色在视窗中画一个椭圆:
void CsampleView:: OnDraw (CDC* pDC)
{kk1}
//Determine size of view.
CRect rcView;
GetClientRect (rcView);
//Use background color for tooltips brush.
CBrush * pOrgBrush=pDC->SelectObject
(CBrush::FromHandle(::GetSysColorBrush (COLOR_INFOBK)));
//Draw the ellipse.
pDC->Ellipse (rcView);
//Restore original brush.
pDC->SelectObject (pOrgBrush);
}
三、确定GDI对象的属性信息
可以调用GDIObject:: GetObject。这个函数将指定图表设备的消息写入到
缓冲区。下例创建了几个有用的辅助函数。
//Determine if font is bold.
BOOL IsFontBold (const CFont&font)
{kk1}
LOGFONT stFont;
font.GetObject (sizeof (LOGFONT), &stFont);
return (stFont.lfBold)? TRUE: FALSE;
}

//Return the size of a bitmap.
CSize GetBitmapSize (const CBitmap&bitmap)
{ kk1}
BITMAP stBitmap;
bitmap.GetObject (sizeof (BITMAP), &stBitmap);
return CSize (stBitmap.bmWidth, stBitmap. bmHeight);
}
//Create a pen with the same color as a brush. BOOL CreatePenFromBrush (Cpen&pen, cost Cbrush&brush)
{kk1}
LOGBRUSH stBrush;
brush.Getobject (sizeof (LOGBRUSH), &stBrush);
return pen. Createpen (PS_SOLID, 0, stBrush.ibColor);
}
四、实现一个橡皮区矩形
CRectTracker是一个很有用的类,可以通过调用CRectTracker::TrackRubberBand
响应WM_LBUTTONDOWN消息来创建一个橡皮区矩形。下例表明使用CRectTracker移动和重置视窗中的蓝色椭圆的大小是很容易的事情。
首先,在文件档中声明一个CRectTracker数据成员: class CSampleView : Public CView
{ kk1}

public :
CrectTracker m_tracker;

};
其次,在文档类构造函数中初始化CRectTracker对象: CSampleDoc:: CSampleDOC ()
{ kk1}
//Initialize tracker position, size and style. m_tracker.m_rect.SetRect (0, 0, 10, 10);
m_tracker.m_nStyle=CRectTracker:: resizeInside | CRectTracker:: dottedLine;
}
然后,在OnDraw函数中画椭圆和踪迹矩形:
void CSampleView:: OnDraw (CDC* pDC)
{ kk1}
CSampleDoc* pDoc=GetDocument ();
ASSERT_VALID (pDoc);
//Select blue brush into device context. CBrush brush (RGB (0, 0, 255));
CBrush* pOldBrush=pDC->SelectObject (&brush);
//draw ellipse in tracking rectangle.
Crect rcEllipse;
pDoc->m_tracker.GetTrueRect (rcEllipse);
pDC->Ellipse (rcEllipse);
//Draw tracking rectangle.
pDoc->m_tracker.Draw (pDC);
//Select blue brush out of device context.
pDC->Selectobject (pOldBrush);
}
最后,使用ClassWizard处理WM_LBUTTONDOWN消息,并增加下述代码。该段代码根据鼠标击键情况可以拖放、移动或者重置椭圆的大小。
void CSampleView::OnLButtonDown (UINT nFlags, CPoint point)
{ kk1}
//Get pointer to document.
CSampleDoc* pDoc=GetDocument ();
ASSERT_VALID (pDoc);
//If clicked on ellipse, drag or resize it. Otherwise create a rectangle
//rubber-band rectangle nd create a new ellipse. BOOL bResult=pDoc->m_tracker.HitTest (point)!=
CRectTracker::hitNothing;
//Tracker rectangle changed so update views.
if (bResult)
{ kk1}
pDoc->m_tracker.Track (this,point,TRue);
pDoc->SetModifiedFlag ();
pDoc->UpdateAllViews (NULL);
}
else pDoc->m-tracker.TrackRubberBand (this,point,TRUE);
CView:: onLButtonDown (nFlags,point);
}

    在计算机显示系统中,只有高档的显示系统才可以在屏幕每一个位置上同时显示各种可能的颜色,大多数显示卡只能显示有限数量的颜色。标准VGA能同屏显示16色,每像素占4位存储空间。内存足够的SVGA适配器最多每像素占8位,可同屏幕显示262144种不同颜色中的256色。普通使用的SVGA显示适配器通过将像素值解释为一个表格的索引,根据索引值将每个像素的内容转变为一种颜色。这个表格就是硬件调色板,其条目就是RGB值。


Windows 系统在支持硬件调色板的时候,遇到了些困难。如果 Windows 系统允许任何一个程序改变视频硬件调色板中RGB 颜色的设置,那么在系统中运行的每一个应用程序都将受影响。例如硬件调色板中的黑色被改为蓝色,那么每一个窗口中的所有黑色像素立即就会被改为蓝色。这就违反了 Windows 应用程序作为独立窗口运行,彼此互不干扰的基本原则。另一个问题是 Windows 程序可以在任何系统运行,而大多数系统中显示的颜色和 Super VGA 系统中的颜色数量不同。
    为了解决上述问题,从3.0版开始Windows提供了一个调色板管理器,用作用户开发的应用程序和输出设备。
调色板管理器由系统调色板和逻辑调色板构成,它们用于管理实际设备的“硬件调色板”。系统调色板是相应于显示器的硬件调色板,它是一个有二十种保留颜色的数组,它的项数与显示器实际能显示的颜色数相等,这些保留颜色被用来绘制系统的菜单、按钮控制、屏幕桌面颜色和抖动的画刷等。
 

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,