作者: 刘雨楠、谭章熹
来源:www.ccidnet.com
用户在使用VC++开发应用程序时,主要有两种方法:调用Windows提供的API函数(Application Programming Interface)和直接使用Microsoft提供的MFC类库(Microsoft Foundation Class)。与MFC相比,API更贴近操作系统,也是每一个Windows
程序员必须掌握的。
本文将以一个类似Windows的计算器程序为例,简述Windows API
程序设计的方法和一些基本技巧。
思路和算法
1、首先构造输入和输出界面
首先构造输入和输出界面。在主窗口中,用CreateWindow( )函数来创建按钮和编辑框等子窗口控件。这样,用户可通过按钮进行输入,并通过编辑框显示计算结果。
2、本
程序通过表达式堆栈算法来支持科学计算功能
以字符型数组express[ ]存放整个表达式,并定义void Push(char)和void Pop(void)来实现向数据堆栈OVS和算符堆栈OPS压入和弹出一个操作符或数据。
3、为了进行正常的计算,必须保证表达式的合法性
程序一方面要对用户的输入加上必要的过滤,例如不允许出现非法表达式,另一方面要对非法运算数据作判断。
4、用户点击“=”完成所有的输入后,调用void CalculateOperation()函数进行计算
具体实现方法如下:用指针i从express中扫描输入的表达式,若扫描到数值,则压入数据栈OVS,若扫描到运算符则判断其优先级是否大于或等于算符堆栈OPS栈顶的优先级,如果大于其优先级则压入OPS并扫描下一字符,反之则弹出OVS和OPS栈顶元素进行一次运算,并将结果压入OVS栈。反复执行此过程,直到完成表达式的计算。
程序主体结构
本程序以WinMain( )函数为入口,并依次进行窗口类的初始化和登记,以及窗口的创建和显示。在消息循环里,主函数反复调用WinProc( )回调函数(CallBack Function)以处理捕获的消息。因此全部消息的响应代码要写在WinProc( )中,这也是用Windows API编写
程序最核心的部分。
另外,用API设计
程序的一大特点就是对任何元素操作都需要通过获得相应的句柄(Handle)来实现。
程序功能及特色
本
程序除一般的科学计算功能外,还有一些扩展功能。
1. 可动态更换背景图案
类似Winamp播放器有各种各样的Skin,本
程序也可动态更换背景。其核心思路就是在WM_ERASEBKGND消息响应时,不用系统缺省的白色画刷,而用资源中的位图来重画背景。为了提高重画效率和避免闪烁,开发时一定注意不要把背景重画代码放在WM_PAINT消息响应中。
另外为使背景图案能跟随窗口尺寸变化,在显示位图时,采用StretchBlt函数代替BitBlt函数,这样在更换背景图案时,不论资源中的位图是否与当前窗口的大小相等,都会自动拉伸或收缩以适应窗口的尺寸。具体代码如下:
case WM_ERASEBKGND:
{
RECT rc;
hdc = (HDC)wParam;
// wParam的值为当前窗口的hDC
SelectObject(hdcmem,hbitmap);
GetClientRect(hwnd,&&rc);
//获得客户区域大小
StretchBlt( hdc,0,0,rc.right,rc.bottom,hdcmem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY );
}
break;
其中,hdc是当前窗口的DC,hdcmem是与当前屏幕兼容的内存镜像设备句柄。
为了使用方便,在选单中可创建背景子选单。资源文件的代码如下:
// Menu
MENU MENU DISCARDABLE
BEGIN
POPUP "设置(&&M)"
BEGIN
POPUP "背景(&&B)"
BEGIN
MENUITEM "GREEN", IDM_GREEN
MENUITEM "SNOW", IDM_SNOW
MENUITEM "BUTTERFLY", IDM_BUTTERFLY
MENUITEM "FLOWER", IDM_FLOWER
END
END
END
// Bitmap
SNOW BITMAP MOVEABLE PURE "snow.bmp"
GREEN BITMAP MOVEABLE PURE "green.bmp"
BUTTERFLY BITMAP MOVEABLE PURE "butterfly.bmp"
FLOWER BITMAP MOVEABLE PURE "flower.bmp"
其中