一般在进行windows编程时都使用vc++精简版,其插入菜单,图片等资源等更简单,且vc中对中文有更好的支持,win7下安装的Mingw中文并不能很好地显示,有光标显示的位置和光标实际位置不符的问题。
MingW创建windows程序的工程,在new时要选择projects中的win32 application
windows编程基础:
windows编程的核心是消息驱动,要理解消息机制。
WinMain函数,该函数是windows程序的入口函数,在其中创建了窗口类(WNDCLASSEX)对象,并对其进行了各种设置,包括窗口类的名字(lpszClassName),所属实例句柄的设置,消息处理函数的设置,窗口类图标,菜单,鼠标,背景色等等的设置。然后注册该窗口类。
接着用上面注册的窗口类来创建窗口,使用CreateWindow函数,其中的参数需要指定,窗口类名,窗口标题,窗口风格,窗口的坐标和长宽,实例句柄等等。接着用ShowWindow(hwnd, nWinMode);UpdateWindow(hwnd);来显示窗口,接着是处理用户的消息,TranslateMessage用来翻译(解析)消息,DispatchMessage用来派发消息到相应的消息队列。
WindowFunc(名字可以不一样)是消息处理函数,其中主要是一个swich语句块,各种消息都有相应的标识符,其中WM_PAINT是重绘消息,当窗口被遮挡后重现或重新显示时,都会被执行。若不处理这个消息,则窗口很可能不能正常显示。
switch的结尾一般是这两句:
case WM_DESTROY: PostQuitMessage(0); break;
default: return DefWindowProc(hwnd, message, wParam, lParam);
当你点击窗口右上角的叉就会发出WM_DESTROY消息,PostQuitMessage(0);只是直接发送一个消息到处理函数(不经过消息队列)进行处理,真正进行退出程序操作的是DefWindowProc中进行的。
插入资源:
在vc++中给程序插入资源是可以直接在直接在菜单栏中选择插入->资源,就可以方便地可视化地创建各种资源。MingW中必须要自己手动编写资源文件,点击File -> New -> ResourceScript来创建资源脚本文件。资源文件放在MingW工程中的Resource Files文件夹中。MingW中工程的目录结构如下:
以菜单的资源脚本文件为例,代码如下:
// Menu.rc
#include "Menu.h" // Menu
MYMENU MENU DISCARDABLE
BEGIN
POPUP "文件&F"
BEGIN
MENUITEM "OpenFile", IDM_FILE_OPEN
MENUITEM "Exit", IDM_EXIT
POPUP "1h&H"
BEGIN
MENUITEM "2",102
END END POPUP "图象变换&T"
BEGIN
MENUITEM "负像", IDM_INVERT
MENUITEM "仿射变换", IDM_F
END MENUITEM "帮助&H", IDM_HELP
END
首先是菜单的名字:MYMENU,接下去一个begin,end语句块来对这个菜单进行定义,POPUP指定弹出菜单。弹出菜单只负责弹出子菜单项不会执行功能,所以它不需要指定标志符,接下去的begin,end语句指定改弹出菜单要弹出的菜单项,该菜单项也可以是弹出菜单,即弹出菜单可以嵌套,这就是多级菜单。MENUITEM指定点击后会执行特定功能的菜单项,这些菜单项都要有一个标志符,标识符是一个整数,一般标志符会定义在头文件中,比如这里Menu.h,代码如下:
// Menu.h
#define IDM_FILE 100
#define IDM_FILE_OPEN 101
#define IDM_EXIT 102 #define IDM_TRANS 200
#define IDM_INVERT 201
#define IDM_F 202 #define IDM_HELP 300
在资源文件中要使用这些标志符,则要在头部include相应的头文件。
要注意这些菜单名字中&后的字母表示该菜单的快捷键,若是顶级菜单,按alt+该字母等于点击该菜单,若是子菜单,则在父菜单打开的情况下直接按该字母就相当于点击该菜单。
双缓冲技术:
双缓冲技术是windows编程中常用的消除闪烁的方法。所谓双缓冲技术就是应用程序在内存中创建一个和屏幕相兼容的图形设备上下文。该上下文实际上处理一个保存在内存中的BMP图片对象,这样就容许应用程序缓慢地在这个BMP上绘制图形。应用程序绘制完毕,就用WIN32API函数 BitBlt来将BMP图片填充到显存中,BitBlt函数速度非常快,足以在屏幕的刷新周期内完成绘图,这样能基本上避免闪烁。但双缓冲也有缺点,首先增加程序复杂度,其次要消耗一些内存,还有它让整个绘图时间变长,导致用户进行滚动时会产生“界面沉重感”,有“惯性”,此外还让人偷懒而不注意绘图操作的优化。