OK,开始写代码.
界面
先放上要做成的最终界面 (仿NSIS的安装界面):
如果要做成这种固定模式的安装界面,其实很简单,资源里创建几个对话框(Dialog),每次下一步时切换对话框就可以了
这里为了灵活性,我直接使用了WIN32的窗口(Window)来做.
下面解释一下界面库:
这个ctDialog类,并没有对每个控件进行封装,仅仅是为了方便只封装了WIN32API
创建主面板
bool createMainDialog ( int xWidth, int xHeight ,
COLORREF xbgColor = COLOR_GRAY, COLORREF xforeColor = COLOR_WHITE,
RECT xforeRect = {0}, COLORREF xfontColor = COLOR_BALCK );
//这个比较容易理解, 参数: 大小,背景色(整个对话框),前景色,前景块,前景色
在主面板上可以创建任意的组件
这里createPart只是浅封装,它内部只是封装了CreateWindow来创建组件
HWND createPart ( string className , string windowName, DWORD partType ,
int x , int y, int width, int height ,
string partName , CommandCallback proc = nullptr );
这里有2个额外添加的参数
// 这个是组件在ctDialog类中的额外名称,操作组件时必须
// 比如设置一个自己的名字 'NextButton', 之后deletePart('NextButton')即可删除组件
//
string partName
// 这个是注册回调 (如点击Button时会调用这个传入的回调函数)
CommandCallback proc = nullptr
// 函数定义:
# #define CommandCallback function< int CALLBACK( HWND , DWORD )>
// 原理:
// 在类中使用了一个map结构来保存 <WindowID, 回调函数>,注册时保存,以便在WM_COMMAND中调用
# map <int , CommandCallback> regCommandMap ;
然后就是对createPart进行封装后的函数:
直接调用这些就可以在主面板上创建对应的组件:
//
// 创建常用控件
// 调用时带上partName时才可以操作/删除指定的控件
// (当然也可以使用默认的partname == "static","button"...)
//
// text
bool createText( string content, int x, int y, int width, int height,
int isCaptionSize = 0, string partName = "static" );
// push-button
bool createbutton( string content, int x, int y, CommandCallback proc = nullptr,
int width = 85, int height = 22, string partName = "button" );
// check-button
bool createCheckbox( string content, int x, int y, CommandCallback proc = nullptr,
int width = 150, int height = 22, string partName = "checkbox" );
// edit
bool createEdit( int x, int y, int width, int height = 20,
string partName = "edit", string defaultContent = "", DWORD partType = WS_BORDER | ES_MULTILINE );
// progress bar
bool createProgress( int x, int y, string partName = "progress",
int defaultRange = 100, int width = 400, int height = 20 );
另外还有一些需要在WM_PAINT中画上去的组件:
// draw line
// line => sx,sy -> ex,ey
void drawLine( int sx, int sy, int ex, int ey, COLORREF col = RGB( 0, 0, 0 ), string partName = "line" );
// draw images(bmp)
void drawBmp( string filename, int cx, int cy, int width, int height, string partName = "bmp" );
// 他们分别在类中存在一个对应的list保存,以便在WM_PAINT中访问并且画出
// 记录所有bmpImages的信息
# list <BmpInfo > bmpInfos;
// 记录所有LineTo的信息
# list <LineInfo > lineInfos;
附上代码地址 (直接下载.h和.cpp后调用即可):
http://git.oschina.net/codetimer/ctwin32-dialog