|
// TypeSet.cpp: implementation of the CTypeset class. // //////////////////////////////////////////////////////////////////////4 Y6 x7 A! t8 k# ]9 ^3 i0 t3 d #include "stdafx.h" #include "..\INC\TypeSet.h"- Z. F8 s4 z/ B% _/ i; x //用法示例 void TestTypeset(HDC dc)! f: a9 z, g' F$ n! Q {2 C. R- z/ m* F- ?$ h //声明一个板材对象 CTypeset typeset;) _ ?+ k8 {+ ^* _ //设置板材对象大小 typeset.m_Desktop.m_dHeight=9999; typeset.m_Desktop.m_dWidth=100; //声明一个排样元素对象 CMaterial material; //设置排样元素对象大小 material.SetSize(20,99); //添加进入板材对象 typeset.Add(&material);# s0 s. Q) u8 |) {5 o# V1 u //继续添加 material.SetSize(99,80);* S& J% ` W; a3 I typeset.Add(&material); material.SetSize(10,60);% M# P4 F' ^ W+ Y1 D typeset.Add(&material);& B0 C0 N* c9 l; y# } material.SetSize(50,20);. o7 Y q Z. P5 p$ v0 S typeset.Add(&material); //添加完毕,进行排样( Z/ c- o, w, W" D0 g+ `4 Z, o9 { typeset.Go(); //排样完毕,输出 list<CMaterial*>::iterator iter;* u/ |8 {. }' D5 G& }6 e, J* l //画板材对象 ::Rectangle(dc,typeset.m_Desktop.m_dX,typeset.m_Desktop.m_dY, typeset.m_Desktop.m_dX+typeset.m_Desktop.m_dWidth,4 n W2 O. N, A: Q4 r typeset.m_Desktop.m_dY+typeset.m_Desktop.m_dHeight);4 S* {" @' q- t" y' q& [* o' W //画排样元素对象 for(iter=typeset.m_MaterialList.begin();iter!=typeset.m_MaterialList.end();iter++). e$ F% o7 }$ x0 e$ w1 P {6 H P7 M& A9 P ::Rectangle(dc,(*iter)->m_dX,(*iter)->m_dY,4 W# n! T' g3 l9 z' k% t (*iter)->m_dX+(*iter)->m_dWidth, (*iter)->m_dY+(*iter)->m_dHeight);+ G! V8 n+ y! [8 s }8 ]4 u0 u1 c+ h$ p3 D } //////////////////////////////////////////////////////////////////////0 t8 T% v" U- c9 p3 Q6 @( J* S$ \: J // CMaterial Class //////////////////////////////////////////////////////////////////////2 V }3 Z0 `( W /////////////////////////////////////////////////////////////////////// ~% v' g7 @3 `( A) _ // Construction/Destruction ////////////////////////////////////////////////////////////////////// #define ZERO 0.00001 CMaterial::CMaterial()& n0 V) p2 J Y6 `( E+ s/ |$ }0 y { m_dHeight=100; m_dWidth=100; m_dX=0; m_dY=0; m_bUsed=FALSE; m_bSeletcted=FALSE;* _- k3 J, z* t" Q% l5 Z m_bRotated=FALSE;5 \% C( w3 }4 u1 s: i m_iIndex=0; } CMaterial::CMaterial(double dWidth,double dHeight) { SetSize(dWidth,dHeight);6 @1 X5 Q/ O" y n% G! X m_dX=0; m_dY=0;: Y$ M- {8 X$ P& d' x3 S m_bUsed=FALSE; m_bSeletcted=FALSE; m_bRotated=FALSE; m_iIndex=0;8 f5 B! S( E% O2 H( v } CMaterial::CMaterial(CMaterial *pMaterial)3 f9 @' i. Z5 z& }3 D" s { m_dX=pMaterial->m_dX; m_dY=pMaterial->m_dY;: f5 a. U' I# L* _! U1 T) Y m_dHeight=pMaterial->m_dHeight; q+ Q* P: }6 Q m_dWidth=pMaterial->m_dWidth;8 [1 z2 [5 k2 `; N m_bUsed=pMaterial->m_bUsed; m_bSeletcted=pMaterial->m_bSeletcted; m_bRotated=pMaterial->m_bRotated; m_iIndex=pMaterial->m_iIndex; }& j: }. `: K! a3 z; q# g( k5 Z! j void CMaterial::SetSize(double dWidth, double dHeight) { m_dHeight=dHeight;, N" X/ C! j3 V9 k# S' M m_dWidth=dWidth;2 b* B' C1 y4 K2 k7 f 9 {! R$ \7 j. ], m, Q+ F }6 r+ W/ i8 d( C2 R, _ void CMaterial::Rotated()& J$ q& |! p- l2 R { m_bRotated=!m_bRotated; double dA=m_dHeight; m_dHeight=m_dWidth; ^) L4 n5 }8 N' q5 l m_dWidth=dA; }: { y8 s9 Y, ?+ e CMaterial::~CMaterial() { a1 ]4 ~4 j2 w7 t* w }0 ^, [+ s6 H8 g: {# @ //////////////////////////////////////////////////////////////////////$ D( @; G7 e' j6 {# g; c; e* _3 {) o L // Construction/Destruction //////////////////////////////////////////////////////////////////////. D* V1 m3 h7 e3 b7 b% ? CTypeset::CTypeset() {; j+ e, p4 Q- w6 J( M8 X Clear(); } CTypeset::~CTypeset() {* }5 Q8 f5 L3 X) l Clear(); }- f! p8 Y) Y1 ^( d$ Y5 t7 j7 ] void CTypeset::Clear() { list<CMaterial*>::iterator iter; for(iter=m_MaterialList.begin();iter!=m_MaterialList.end();iter++)) s- G4 \6 M3 k$ O6 t {1 M5 X" T% w( O3 A delete (*iter); } m_MaterialList.clear(); m_iCurIndex=0; } void CTypeset::Add(CMaterial *pMaterial) { CMaterial *p=new CMaterial(pMaterial); |
精华推荐
换一换


p->m_iIndex=m_iCurIndex;
m_MaterialList.insert(m_MaterialList.end(),p);# r N, K0 p4 }7 Q' s! a) S0 B/ ?
m_iCurIndex++;
}- M% d1 \5 E& L/ @; x
void CTypeset::Sort()0 K4 C3 b0 M1 w2 f7 X5 j) P1 N
{
list<CMaterial*> MaterialList;
list<CMaterial*>::iterator iter1,iter2,iter3;
bool bSourceInvert=false;
while (!m_MaterialList.empty())+ t) U0 u* a( A' B) x2 r- G0 W
{& R7 v5 |: i# a+ U
double dMaxLen=0;
iter2=m_MaterialList.begin();
CMaterial *p=NULL;, P# e8 b4 |9 c
iter1=m_MaterialList.end()--;
iter3=iter2;8 E$ C- e* D' K
while(iter2!=iter1); \1 f+ D) z1 [' B4 }2 {
{
if((*iter2)->m_dWidth>dMaxLen)$ X, @3 V# V' h) j2 y' l8 {
{
p=*iter2;
iter3=iter2;
dMaxLen=(*iter2)->m_dWidth;5 G+ E; ^* [+ S3 I2 l- C# Z
bSourceInvert=false;! j# B- s+ I8 T8 g: [
}! K9 J9 Z% M# {7 U
if((*iter2)->m_dHeight>dMaxLen)
{
p=*iter2; [: T* n5 s" N
iter3=iter2;" P$ F; z3 v1 H/ @
dMaxLen=(*iter2)->m_dHeight;4 w2 P1 q9 F5 v' {! x9 m
bSourceInvert=true;7 e d/ M/ ?2 G6 T! v: p
}
iter2++;
}+ M4 a4 {3 F" p; A- q1 X1 K
if(p!=NULL)* p3 u1 h+ X' r- d/ e' m1 K
{9 |) ^" m6 A* b c1 s# f( a" Y8 N
if(bSourceInvert)
p->Rotated(); 8 V' g& h: v( ~* M! c
MaterialList.insert(MaterialList.end(),p);% [1 B$ r+ d$ k9 X: Y
m_MaterialList.erase(iter3);7 D1 G7 G) I) n0 _" X# s+ h5 E
}
}, h# s! R( K( h) d
m_MaterialList.clear();
for(iter1=MaterialList.begin();iter1!=MaterialList.end();iter1++)
{
m_MaterialList.insert(m_MaterialList.end(),(*iter1));5 ]9 G5 k3 p1 g4 a3 D& B8 R
}* ~" \7 \# { i0 s4 `, q
MaterialList.clear();
}: S2 M7 c6 p% b0 \
double CTypeset::Go()
{ u: w5 V; [5 b4 L+ I3 B
double dRet=0;
list<CMaterial*> List;
list<CMaterial*>::iterator iter;1 e) d' p7 n7 k) ]0 k2 g
Sort();) \4 n7 L2 d+ U! p0 `" [4 Y# w' ~; ~
Typeset(m_Desktop.m_dX,m_Desktop.m_dY,
m_Desktop.m_dWidth,m_Desktop.m_dHeight,&List);& F* F! x/ x! f/ W
m_MaterialList.clear();: |" u M. |: a1 W- G; q
for(iter=List.begin();iter!=List.end();iter++)
{4 I+ b& A. g2 U9 T9 q: D8 u
if((*iter)->m_dX<ZERO)1 }# ]! X( \9 T/ k4 z
{
dRet+=(*iter)->m_dY;8 n: l8 s1 i q% A" h. B |
}
(*iter)->m_bUsed=FALSE;6 \: L' k9 \5 {. g, \
(*iter)->m_bSeletcted=FALSE;2 o( }3 m/ H$ n$ A! ~, l
m_MaterialList.insert(m_MaterialList.end(),(*iter));
}; v3 b9 b( A, n5 U( x: y* i h
List.clear();& \# _, \ |" l* J, n" d) @
return dRet;. q7 J$ ~# H( {# R9 p V& q. \
}
% A: Y3 Q @+ y4 o
double CTypeset::Typeset(double dStartX,double dStartY,double dStartHei,double dStartWid,
list<CMaterial*> *pList)
{
CMaterial *tmpunit=NULL;" Y; z; q8 `2 G) X$ g
list<CMaterial*>::iterator iter,iter1;0 K% [, z/ R" r6 [
double dArea1,dArea2,dArea;//横放和竖放时的排样面积,和最后方案的排样面积
double dRestArea1,dRestArea2;//横放和竖放时排样后的剩余面积 s0 @. s, a+ q9 Q# t
list<CMaterial*> List1,List2;////横放和竖放时的最佳排样序列
double dHeight,dWidth;
* C7 _9 k: R+ M1 F2 P" b, d
dHeight=dStartHei;* I6 L! J$ |, B5 U
dWidth=dStartWid;. _7 q6 w( d9 e' v
; D& N- u& B. K5 k, T
if(m_MaterialList.empty())
return 0;* P ^. s: c8 m; q$ o8 j
for(iter=m_MaterialList.begin();iter!=m_MaterialList.end();iter++)
{' u) `; V% a! C8 e. V8 e7 S
if((*iter)->m_bUsed!=FALSE)
continue;+ F+ v! t- ]' s0 ~! Y3 |
if((*iter)->m_dWidth<(*iter)->m_dHeight)) y1 q* u U7 {( j; \2 v
{
MessageBox(NULL,"错误","ERROR",MB_OK);. j" U: v. k1 {1 I4 v
return 0;, @) H8 A' b' F/ J
}
0 o& J- ^7 c; c; w: q5 F9 ]1 Y
//找出一张能放入的最大的没有排过的板材/ N; I, j4 w9 ^& E! r
//如果板材横竖都能放入' K' p- W) F; p4 Q/ w7 f: w
if(((dHeight>(*iter)->m_dWidth-ZERO)&&(dWidth>(*iter)->m_dHeight-ZERO)), e4 y, E. I `. O) d
&&((dHeight>(*iter)->m_dHeight-ZERO)&&(dWidth>(*iter)->m_dWidth-ZERO))); K3 f8 T1 r* u$ z8 L' ~9 ?
{ : @# g% i2 ~% h$ b1 B b
if(dStartX<ZERO)
dWidth=(*iter)->m_dHeight; R7 S) K1 r3 z; Q. N
1 k7 i" K2 v; ^$ T% _! {
(*iter)->SetUsed(TRUE);//对该图排样
7 z2 T6 O* J" J
//先横着放入继续排样,计算剩余面积: {6 f1 r/ [# |5 J& r" |% C
dArea1=Typeset(dStartX+(*iter)->m_dWidth,dStartY,
dHeight-(*iter)->m_dWidth,(*iter)->m_dHeight,&List1);) d' E h) b5 U$ V1 g( `0 Z
dRestArea1=dHeight*dWidth-dArea1-(*iter)->GetArea();7 v H# A' n, |% ?# z' m# p
dRestArea1=dRestArea1/(dHeight*dWidth);//剩余面积率" H: L1 N, }1 @+ X
- `7 k6 X3 s- U/ v
- d; G4 J, j' j3 h( ?5 [- K
//将刚才排过的板材状态还原,再竖直放入该图继续排样,计算剩余面积% C+ Y. x5 V+ d( e" U! e
if(dStartX<ZERO)
dWidth=(*iter)->m_dWidth;" y- [+ J2 S- Y+ U5 ~
SetStatus(&List1,FALSE);0 L$ D1 B$ t1 f/ B& x% Y9 v
tmpunit=(*iter)->Copy();$ M5 o: T5 \" L8 j. i9 T, G
tmpunit->Rotated();0 l6 O( R/ f, P" E0 Z% c0 y2 a1 v
dArea2=Typeset(dStartX+tmpunit->m_dWidth,dStartY,, C! F/ \7 }' X5 w
dHeight-tmpunit->m_dWidth,tmpunit->m_dHeight,&List2);
dRestArea2=dHeight*dWidth-dArea2-tmpunit->GetArea();+ t6 j! j3 ?: ?; w# H9 m4 q
dRestArea2=dRestArea2/(dHeight*dWidth);//剩余面积率
} X4 S( t/ K, g( [6 |
else if((dHeight>(*iter)->m_dWidth-ZERO)&&(dWidth>(*iter)->m_dHeight-ZERO))//如果板材只能横着放入
{ J. J$ U* E8 @1 a l9 q
if(dStartX<ZERO)
dWidth=(*iter)->m_dHeight;
(*iter)->SetUsed(TRUE);//对该图排样
dArea1=Typeset(dStartX+(*iter)->m_dWidth,dStartY,
dHeight-(*iter)->m_dWidth,(*iter)->m_dHeight,&List1);4 j* }: a, W& O6 |( s+ K
dRestArea1=dHeight*dWidth-dArea1-(*iter)->GetArea();
dRestArea1=dRestArea1/(dHeight*dWidth);//剩余面积率9 A* U) K" d7 X
dRestArea2=dRestArea1+10;//不再尝试竖放,将竖放剩余面积设大
}* _- Y- d3 w9 D: s7 [
else if((dHeight>(*iter)->m_dHeight-ZERO)&&(dWidth>(*iter)->m_dWidth-ZERO))//如果板材只能竖着放入
{
if(dStartX<ZERO)1 m, d# u' j. a A- a
dWidth=(*iter)->m_dWidth;
9 R6 Z K! G' [. u# T, o
(*iter)->SetUsed(TRUE);//对该图排样
tmpunit=(*iter)->Copy();
tmpunit->Rotated();
dArea2=Typeset(dStartX+tmpunit->m_dWidth,dStartY,1 O: g& v6 R% z
dHeight-tmpunit->m_dWidth,tmpunit->m_dHeight,&List2);9 ]0 P E2 D4 h n
dRestArea2=dHeight*dWidth-dArea2-tmpunit->GetArea();
dRestArea2=dRestArea2/(dHeight*dWidth);//剩余面积率
dRestArea1=dRestArea2+10;//不再尝试横放,将横放剩余面积设大
}# w3 E8 M/ w- w$ I- V$ H, z
else
continue;
' ^7 P; b9 C: H' y
//记录优化的排样序列
CMaterial *tmp=NULL;4 S! E1 ?! Z* N3 t
if(dRestArea1<dRestArea2+ZERO)//当前板材横向排结果优化( ?8 c, q) r. i% ~
{
SetStatus(&List2,FALSE);//将纵向排的排样序列还原状态
SetStatus(&List1,TRUE);//将横向排的排样序列标志为使用+ ?- s$ y1 b" _' _6 ^8 {( c1 ^5 z
dArea=dArea1+(*iter)->GetArea();;
tmp=(*iter)->Copy();$ D7 j! j* |6 F$ v+ r
tmp->m_dX=(int)dStartX;
tmp->m_dY=(int)dStartY;
pList->insert(pList->end(),tmp); o3 ~ K4 Y& Z _- V/ e: G
while(!List1.empty())
{
iter1=List1.begin();0 i, Q! n6 i6 ?$ q- S8 I V
pList->insert(pList->end(),*iter1);2 ?5 O4 D8 c1 h% U! b. n) Z
List1.erase(iter1);
}
//释放不好的序列
for(iter1=List2.begin();iter1!=List2.end();iter1++)
{' |4 k7 A8 K, U7 S9 T; G0 j
delete (*iter1);
}! b, P0 l( p$ x
List2.clear();( g1 v9 X& j, Q& M' o# e& D
delete tmpunit;) E1 h8 E- B' x/ Q" ^# q* ~
}) ?/ h) m- g! m$ e- T
else//当前板材纵向排结果优化. K* ]/ a2 X8 D
{
SetStatus(&List1,FALSE);//将横向排的排样序列还原状态5 B, t* [( ]" y- }* d! \6 w
SetStatus(&List2,TRUE);//将纵向排的排样序列标志为使用, X; S1 w* ~$ @' O
if(tmpunit==NULL)
{$ r' |( A4 n* N7 m$ j4 c
MessageBox(NULL,"错误","ERROR",MB_OK);
return 0;/ C6 d& v- x4 t6 e/ k1 y/ ~
}
: K2 i; }! Q8 Y( Z
dArea=dArea2+(*iter)->GetArea();' a2 o( h' n- s$ v5 |
tmp=tmpunit->Copy();
tmp->m_dX=(int)dStartX;$ R- `/ V) v1 e1 X
tmp->m_dY=(int)dStartY;2 [( q" \- k6 P" v* I
pList->insert(pList->end(),tmp);2 ^3 q( J% Z# |, V* k/ I
while(!List2.empty())
{0 Z6 q- |, L3 c$ P
iter1=List2.begin();
pList->insert(pList->end(),*iter1);$ ` H _. r/ J {3 @! w8 @* K
List2.erase(iter1);' D8 H) Q! [: m! q) T0 o0 _( l
}) _. e7 U) T% q) i a) [) g: |, Y
//释放不好的序列
for(iter1=List1.begin();iter1!=List1.end();iter1++). h, u( Z% I+ s* R2 T
{
delete (*iter1);: q; B4 A& y6 `- S
}
List1.clear();
5 w: M* B! b0 D5 d
delete tmpunit;5 t; O' S+ {- s m4 y, R
}
double next_x,next_y,next_len,next_wid;
next_x=dStartX;
next_y=dStartY+tmp->m_dHeight;( J& d8 d9 {8 X [: @; i, V
next_len=dHeight;
next_wid=dStartWid-tmp->m_dHeight;) _5 Q9 Q" D& C: v0 x" y1 o
if(next_wid>ZERO)//板材还有剩余
{2 O3 h, O N' s0 S
//继续排下一行
dArea=dArea+Typeset(next_x,next_y,next_len,next_wid,&List1);1 _; w. a+ ^- A' e. n1 n
//记录排样序列
SetStatus(&List1,TRUE);- W+ h. _; D- M4 v( D6 [) l3 L
for(iter1=List1.begin();iter1!=List1.end();iter1++)$ @( R% L: m# l- `' [! _
{
pList->insert(pList->end(),(*iter1));
}
List1.clear();: p4 v; [2 m3 W4 X/ o9 [
}
return dArea;
}
return 0;
}2 u% ]8 _% f; e8 e2 m5 K& o7 G
" _; s0 T8 o4 `
void CMaterial::SetUsed(BOOL bUsed)2 s& ~5 C( A- W. M p) \- c+ |( g
{
m_bUsed=bUsed;3 v9 L. v# Z; F3 I0 O) t% y
}( I6 E. B2 P: i% Q, o
: ~5 o6 a& O- R: h' B5 f3 Q, t% z, d' ~
void CTypeset::SetStatus(list<CMaterial*> *pList, BOOL bUsed)
{
list<CMaterial*>::iterator iter1,iter2;
for(iter1=m_MaterialList.begin();iter1!=m_MaterialList.end();iter1++)! s" S( _- `; A% _0 W5 U
{
for(iter2=pList->begin();iter2!=pList->end();iter2++)
{6 A$ [ L4 Z3 c3 u" I
if((*iter1)->m_iIndex==(*iter2)->m_iIndex)( N. | W% `2 |* L7 a
{
(*iter1)->m_bUsed=bUsed;
}+ \" @" J( L% P+ U
}9 Y, w1 D( J5 u7 L: k" w% e% A
}3 O# ~/ b+ P# a+ e7 e% |! j0 S
}
CMaterial* CMaterial::Copy()
{
CMaterial* p=new CMaterial(this);
return p;
}5 U! V, V$ }0 ~$ P k
1 ^/ F2 f5 w9 w. N5 G7 o
d) n) a+ ~! ~
4 {1 ?5 K! f4 `
// TypeSet.h: interface for the CTypeset class.
//
//////////////////////////////////////////////////////////////////////) F: K& q" a' ~: `+ X
1 @+ O! v+ f* ~3 h/ z+ N2 x6 j
#if !defined(AFX_TYPESET_H__46213FAE_D2D6_42A6_B801_41D9109CD0FB__INCLUDED_)7 d) m9 @- y+ {% g0 y
#define AFX_TYPESET_H__46213FAE_D2D6_42A6_B801_41D9109CD0FB__INCLUDED_
#if _MSC_VER > 1000! ^& `% r/ t( X7 c# m
#pragma once
#endif // _MSC_VER > 1000% H+ Q6 b o# A& u& {* t
#pragma warning(disable:4786)# @+ y. e! r a7 i a, \1 N! |$ h& Y4 I
#pragma warning(disable:4251)
#include <list>: E+ I( H: ]- r& P. [( a! g: V
#include <string>0 y8 T' ?; d( K, \5 K
using namespace std; G3 t" i2 k! C: M8 x% S \6 Y/ I
#ifdef TYPESETLIB_EXPORTS$ v0 }. z* i& B* G" h' p
#define TYPESETLIB_API __declspec(dllexport)1 y/ o" \3 B8 g% b! D k
#else
#define TYPESETLIB_API __declspec(dllimport)
#endif m4 p9 u- E$ I1 [2 o
0 f% e0 B9 @5 _4 c& k) v, J
TYPESETLIB_API void TestTypeset(HDC dc); D% m! ?$ H: D6 x
! ~: g% R7 @# i
class TYPESETLIB_API CMaterial ; o- }$ u! o3 w, n( b- d! }
{ L7 p- G7 i5 a3 u; P# v( E2 a+ w
public:; I( S2 J! o; G. H
virtual CMaterial* Copy();4 g, X Q' |2 @* J8 |7 F9 U: [
virtual void SetUsed(BOOL bUsed);
virtual void Rotated();
virtual void SetSize(double dWidth,double dHeight);
virtual double GetArea(){ return m_dHeight*m_dWidth; }! ^+ K0 C3 d( k6 {9 N
CMaterial();; c% `4 x% [8 N" A0 b( |$ J
CMaterial(CMaterial *pMaterial);
CMaterial(double dWidth,double dHeight);$ f0 f6 a$ h" f1 t/ c
virtual ~CMaterial();+ |: w7 n" n. Y1 Q q6 y; u3 D
double m_dHeight,m_dWidth;8 K% l& k1 G, |# @
double m_dX,m_dY;
BOOL m_bUsed;
BOOL m_bSeletcted;
BOOL m_bRotated;& S0 W3 |2 v. q9 `+ Z
int m_iIndex;
( L% D7 | U1 H0 \9 R
};: |! K( C9 _/ _$ |" U- A% F
class TYPESETLIB_API CTypeset - Q: \/ A' }2 p( ~: P" a
{
public:7 _; ]4 B8 Z; R
virtual double Go(); ]* \6 q0 a5 v* n) n- j% a
virtual void Add(CMaterial *pMaterial);
CTypeset();
virtual ~CTypeset();
list<CMaterial*> m_MaterialList;
CMaterial m_Desktop;3 } p n* J+ i; Y0 J! M1 @3 ~
protected:
virtual void SetStatus(list<CMaterial*> *pList, BOOL bUsed);/ I4 ^% g" ^2 r/ S9 c) E) C
virtual double Typeset(double dStatrX,double dStatrY,double dStatrHei,double dStatrWid,
list<CMaterial*> *pList); Q- M) N* o8 k9 F) ?+ t
virtual void Sort();5 S* k3 W# [, @' [5 I6 Z9 a# ~9 m* b
virtual void Clear();
int m_iCurIndex;' S$ k7 Q4 N8 o" Z5 Y% h
};6 {4 r- E4 e; D" ]
* D# ~% K% G( I2 j) k
2 G8 R& N( k% b7 L) }2 f0 M# F9 v& X9 ~
#endif // !defined(AFX_TYPESET_H__46213FAE_D2D6_42A6_B801_41D9109CD0FB__INCLUDED_)