Register    Login    Forum    Search    FAQ

Board index » General Programming




Post new topic Reply to topic  [ 1 post ] 
Author Message
 Post subject: สร้าง GUI ให้กับเกมส์ ด้วยมือคุณ !! (ตอนที่ 2)
 Post Posted: Tue Aug 25, 2009 11:45 pm 
Offline
Site Admin

Joined: Sat Feb 19, 2011 1:33 am
Posts: 15
อัน ที่จริงผมได้เตรียมบทความเอาไว้แล้วสำหรับสองตอน แต่เนื่องจากต้องการดูผลการ search ที่เข้ามาในเวบไซต์ เกี่ยวกับความสนใจ ในเรื่อง GUI ก็ทำให้ผมพอรู้ว่า มันไม่เป็นเรื่องที่น่าสนใจเท่าไหร่สำหรับคนไทย เพราะการพัฒนาเกมส์ของคนไทยนั้นยังอยู่ในระดับที่เรียกว่า LOW มาก เนื่องจากความยากในทุกๆด้านแต่ไหนๆผมเขียนบทความมาแล้วก็จะนำเสนอให้ถึงที่ สุดก็แล้วกัน

ต่อไปเป็นเรื่องของ
MAIN SLOT , FLOAT SLOT และ SLOT ID เรื่องนี้เป็นแนวคิดที่ผมคิดขึ้นมาเอง
โดยคิดว่า Object ที่ถูกสร้างภายใน Dialog นั้นต้องมี ID เป็นของตัวเอง
เพื่อใช้อ้างอิงหน้าที่การทำงานต่างๆ โดย Object ที่สร้างนั้นจะถูกเรียกชื่อว่า SLOT และ SLOT นั้นก็มีคุณสมบัติต่างๆ
ที่มากกว่า Dialog Object ซึ่งจะเปรียบเสมือนหัวใจของการสร้าง GUI เลยก็ได้

ตัวอย่างโครงสร้างของ MAIN SLOT ซึ่งถ้ามองแบบการมองรูปจะเหมือนกับมันอยู่กับที่
ซึ่งก็คือ ส่วนของภายใน Class ที่ต้องมีการปกปิดจาก User ที่ใช้งานในรูปแบบของ
ALT หรือ COM Object นั่นเอง
Code:
typedef struct ZP_STC_BOXSLOT_DATA
{
//square coordinate.
ZP_STC_SQUARESLOT stcSqCoord;
//circle coordinate.
ZP_STC_CIRCLESLOT stcCrCoord;
//slot shape for detect.
long LSLOT_SHAPE;
//slot id for main ref.
long LSLOT_ID;
//texture.
long lMainTexture;
long lRolloverTexture;
long lPressTexture;
long lSelectedTexture;
// color for effect.
ZP_STC_COLOREVENTSET stcStringColor;
ZP_STC_COLOREVENTSET stcTextureColor;

float fFadeFixTime;
float fFadeValue;


long LTYPE;
long lTextureColor;
long lGlobalStringColor;
long lRolloverTextColor;
//global msg data.
_bstr_t strCaption;

ZP_STC_LISTSTRING stcListString;
ZP_STC_LISTDATA stcListData;
ZP_STC_TABLINK stcTabLink;
ZP_STC_STATICITEMSLOT stcSTSlot;
ZP_STC_SCALEBARIMG stcScaleBar;
ZP_STC_LISTTIMEIMG stcListTimeImg;
ZP_STC_COMBOBUTTON stcComboButton;
ZP_STC_COMBOLISTTEXT stcComboListText;
ZP_STC_EDIT * stcEdit;
ZP_STC_EDITPLANE * stcEditPlane;
ZP_STC_MASKLAYER stcMaskImg;
_bstr_t strObjName;
  _bstr_t strShortInfo;
//global state .
bool bSlotEnable;
bool bRenderMainTexture;  //render texture flag.
bool bRenderRolloverTexture;  //render texture flag.
bool bRenderTextColorRollover;
bool bRenderTexturePress;  //render texture flag.
bool bStartEvent;
bool bStartDetectEvent;
bool bHasRolloverTexture;
bool bHasPressTexture;
bool bHasSelectedTexture;
bool bHasTextColorRollover;
bool bShowSelectedTexture;
bool bHeadControl;
bool bHasMask;
bool bHasData;
bool bShowData;
bool bHasCaption;
bool bShowCaption;

//control state.this important for multilayer event detection.
bool bMultiLayerEventDetect;
bool bTabCtrlEnable;
//not use now.
int iTextStyle;
long lOwnerSpecialID;
}ZP_STC_BOXSLOT_DATA;
typedef struct ZP_STC_BOXSLOT_DATA * ZP_PTSTC_BOXSLOT_DATA;



จากโครงสร้าง จะเห็นได้ว่า มันเป็นโครงสร้างของ Object ที่ใหญ่พอตัว เก็บรายละเอียดต่างๆไว้มาก
รวมไปถึงเก็บรายละเอียดของ Control ไว้ภายในด้วย ซึ่ง Control ต่างๆที่ถูกเก็บไว้ภายในนั้น
จะถูกเรียกใช้จาก SLOT ID ที่ถูกเก็บอยู่ใน FLOAT SLOT ที่ทำหน้าที่เก็บเพียง SLOT_ID และ ค่าของ SLOT ที่ USER ต้องการเท่านั้น
เช่นพวกข้อความและตัวเลขต่างๆ ซึ่งถ้ามองในแง่ของ OOP มันจะเหมือนอะไรสักอย่างที่
วิ่งวนอยู่ในโปรแกรม ทำหน้าที่รับส่งค่าต่างๆ เข้าออก MAIN SLOT
หรือจะมองได้ว่า เป็น ตัวแปร ชนิดหนึ่งที่เรากำหนดขึ้นมาใช้ภายนอก Class ของ GUI
เพื่อความยืดหยุ่นในการใช้งานสูงสุด รูปแบบนี้อาจจะคล้ายๆกับ การเขียน Dialog ของ
VC++ เลยทีเดียว

ตัวอย่างการสร้าง FLOAT SLOT
Code:
typedef struct ZP_STC_ZPDATA
{
char strData[ZP_MAX_CHARBUFFER];
char strShowData[ZP_MAX_CHARBUFFER];
}ZP_STC_ZPDATA;

typedef struct ZP_STC_LISTSTRING
{
ZP_STC_ZPDATA stcData;
long lDataIndex;
ZP_STC_SLOTRANK stcComboRank;
ZP_STC_SLOTRANK stcScrollRank;
}ZP_STC_LISTSTRING;

typedef ZP_CLS_DYN_DLLIST<ZP_STC_LISTSTRING> ZP_TDF_LISTSTRING;
// ZP_CLS_DYN_DLLIST คือ โครงสร้าง Doubly link list.
typedef struct ZP_STC_LTSTRING
{
ZP_TDF_LISTSTRING clsList;
ZP_STC_SLOTRANK stcSlotRank;
ZP_STC_SLOTRANK stcScrollRank;
ZP_STC_SLOTRANK stcComboRank;
bool bHasScroll;
long lMaxListNb;
}ZP_STC_LTSTRING;

จากที่เห็นเริ่มแสดงถึงความยุ่งยากเข้ามา และมันจะยุ่งมากขึ้นกว่านี้อีก
สำหรับ ZP_STC_SLOTRANK นั้นก็เป็น ช่วงของ กลุ่มของ SLOT
ที่ทำหน้าที่ร่วมกันเป็น Control ต่างๆ เช่น List Control สามารถแยกได้เป็น
จำนวนบรรทัดที่แสดงผล scroll up scroll down ซึ่งรวมเป็น 1 กลุ่มของ Control
Code:
typedef struct ZP_STC_SLOTRANK
{
long lSlotIDStart;
long lSlotIDEnd;
}ZP_STC_SLOTRANK;
typedef ZP_STC_SLOTRANK * ZP_PTSTC_SLOTRANK;

อย่างเช่นถ้าเป็นปุ่มเดียวก็จะมี lSlotIDStart = lSlotIDEnd ก็คือ ID เดียว

ตัวอย่าง Function ของการ Create Slot
ซึ่ง มันเป็นเหมือนการกำหนดชนิด Control
ที่เราจะใช้ภายใน Dialog เลยทีเดียว

จะให้ดูทั้งแบบง่ายและแบบยาก นั่นก็คือ ปุ่มและ List control
Code:
inline ZP_STC_BUTTON ZPGuiSystem::CreateButtonSLOT(long lSetPosSlotX,long lSetPosSlotY,long lSlotWidth,long lSlotHeight,long lMainTexture)
{
ZP_STC_BUTTON stcButtonSlot;
stcButtonSlot.lSlotIDStart  =  GetSlotNumber();
stcButtonSlot.lSlotIDEnd  =  GetSlotNumber();
IncreaseSlotCount();
long lSlotCountBuff   =  GetSlotCount();
pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fw = (float)lSlotWidth;
pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fh = (float)lSlotHeight;
pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fx1 = pstcFrame.stcRect.lPx1 + (float)lSetPosSlotX;
pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fy1 = pstcFrame.stcRect.lPy1 + (float)lSetPosSlotY;
pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fx2 = pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fx1 + pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fw;
pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fy2 = pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fy1 + pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fh; //y2 coordinate.
pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fOfsx1 = pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fx1 - pstcFrame.stcRect.lPx1;   //x1 offset.
pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fOfsy1 = pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fy1 - pstcFrame.stcRect.lPy1;   //y1 offset.
pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fOfsx2 = 0;
pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fOfsy2 = 0;
pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fCtx = (pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fx2 - pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fx1) / 2;
pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fCty = (pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fy2 - pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fy1) / 2;

pstcSL.stcSlot[lSlotCountBuff].LSLOT_ID  = lSlotCountBuff;
pstcSL.stcSlot[lSlotCountBuff].LSLOT_SHAPE = ZP_SLOT_SQUARE;
pstcSL.stcSlot[lSlotCountBuff].LTYPE  = ZP_SLOT_TYPE_BUTTON;
/*----------------------------------------------------------------------------*/

pstcSL.stcSlot[lSlotCountBuff].lMainTexture  = lMainTexture;
SetDefaultColor(ZP_SLOT_ALL,1.0f,1.0f,1.0f,1.0f,lSlotCountBuff);

pstcSL.stcSlot[lSlotCountBuff].bRenderMainTexture  = true;  //render texture flag.
pstcSL.stcSlot[lSlotCountBuff].bRenderRolloverTexture = false;
pstcSL.stcSlot[lSlotCountBuff].bHasData   = false;
pstcSL.stcSlot[lSlotCountBuff].bHasShortInfo  = false;
pstcSL.stcSlot[lSlotCountBuff].bHasLongInfo  = false;
pstcSL.stcSlot[lSlotCountBuff].bHasRolloverTexture  = false;
pstcSL.stcSlot[lSlotCountBuff].bHasMask    = false;
pstcSL.stcSlot[lSlotCountBuff].bTEMP_1   = false;
pstcSL.stcSlot[lSlotCountBuff].bShowString   = false;
pstcSL.stcSlot[lSlotCountBuff].bStartEvent   = false;
pstcSL.stcSlot[lSlotCountBuff].bStartDetectEvent  = false;
pstcSL.stcSlot[lSlotCountBuff].bRenderTextColorRollover = false;
pstcSL.stcSlot[lSlotCountBuff].bHasTextColorRollover  = false;
pstcSL.stcSlot[lSlotCountBuff].bHasSelectedTexture  = false;
pstcSL.stcSlot[lSlotCountBuff].bShowSelectedTexture  = false;

pstcSL.stcSlot[lSlotCountBuff].iTextStyle   = ZP_TEXT_ALIGN_CENTER;
pstcSL.stcSlot[lSlotCountBuff].bSlotEnable   = true;
pstcSL.stcSlot[lSlotCountBuff].bTabCtrlEnable  = true;
pstcSL.stcSlot[lSlotCountBuff].bHeadControl  = false;
pstcSL.stcSlot[lSlotCountBuff].fFadeFixTime  = 0;
pstcSL.stcSlot[lSlotCountBuff].bMultiLayerEventDetect  = true;

return stcButtonSlot;
}

กรุณาสังเกต Offset ของ Button Slot ที่สร้าง Control ตัวนี้ ที่จะอ้างอิง pstcFrame.stcRect เพื่อใช้ในการคำนวณ
เมื่อมีการเคลื่อนย้าย Dialog

ต่อไปเป็น Slot ที่ถูกนำมาสร้างเป็น List Control
Code:
inline ZP_STC_LTSTRING ZPGuiSystem::CreateListTextSLOT(long lSetPosSlotX,long lSetPosSlotY,long lSlotWidth,long lSlotHeight,long lMainTexture,long lMaxListNumber = 1)
{
if(lMaxListNumber<1)
  lMaxListNumber = 1;
long lListHeight = lSlotHeight/lMaxListNumber;

ZP_STC_LTSTRING stcListTextSlot;
stcListTextSlot.stcSlotRank.lSlotIDStart =  GetSlotNumber();


for(int i=0;i<lMaxListNumber;i++)
{
  IncreaseSlotCount();
  long lSlotCountBuff = GetSlotCount();
  pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fw = (float)lSlotWidth;
  pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fh = (float)lListHeight;
  pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fx1 = pstcFrame.stcRect.lPx1 + (float)lSetPosSlotX;
  pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fy1 = pstcFrame.stcRect.lPy1 + (float)lSetPosSlotY + (lListHeight * i);
  pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fx2 = pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fx1 + pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fw;
  pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fy2 = pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fy1 + pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fh; //y2 coordinate.
  pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fOfsx1 = pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fx1 - pstcFrame.stcRect.lPx1;   //x1 offset.
  pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fOfsy1 = pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fy1 - pstcFrame.stcRect.lPy1;   //y1 offset.
  pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fOfsx2 = 0;
  pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fOfsy2 = 0;
  pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fCtx = (pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fx2 - pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fx1) / 2; //center position of slot
  pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fCty = (pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fy2 - pstcSL.stcSlot[lSlotCountBuff].stcSqCoord.fy1) / 2;

  pstcSL.stcSlot[lSlotCountBuff].LSLOT_ID  = lSlotCountBuff;
  pstcSL.stcSlot[lSlotCountBuff].LSLOT_SHAPE = ZP_SLOT_SQUARE;
  /*----------------------------------------------------------------------------*/
  pstcSL.stcSlot[lSlotCountBuff].LTYPE  = ZP_SLOT_TYPE_LISTTEXT;
  pstcSL.stcSlot[lSlotCountBuff].lMainTexture   = lMainTexture;
  SetDefaultColor(ZP_SLOT_ALL,1.0f,1.0f,1.0f,1.0f,lSlotCountBuff);

  pstcSL.stcSlot[lSlotCountBuff].bRenderMainTexture  = true; //render texture flag.
  pstcSL.stcSlot[lSlotCountBuff].bRenderRolloverTexture = false;
  pstcSL.stcSlot[lSlotCountBuff].bHasData   = false;
  pstcSL.stcSlot[lSlotCountBuff].bHasShortInfo  = false;
  pstcSL.stcSlot[lSlotCountBuff].bHasLongInfo  = false;
  pstcSL.stcSlot[lSlotCountBuff].bHasRolloverTexture  = false;
  pstcSL.stcSlot[lSlotCountBuff].bHasMask    = false;
  pstcSL.stcSlot[lSlotCountBuff].bTEMP_1   = false;
  pstcSL.stcSlot[lSlotCountBuff].bShowString   = false;
  pstcSL.stcSlot[lSlotCountBuff].bStartEvent   = false;
  pstcSL.stcSlot[lSlotCountBuff].bStartDetectEvent  = false;
  pstcSL.stcSlot[lSlotCountBuff].bRenderTextColorRollover = false;
  pstcSL.stcSlot[lSlotCountBuff].bHasTextColorRollover  = false;
  pstcSL.stcSlot[lSlotCountBuff].bHasSelectedTexture  = false;
  pstcSL.stcSlot[lSlotCountBuff].bShowSelectedTexture  = false;

  pstcSL.stcSlot[lSlotCountBuff].iTextStyle   = ZP_TEXT_ALIGN_CENTER;
  pstcSL.stcSlot[lSlotCountBuff].bSlotEnable   = true;
  pstcSL.stcSlot[lSlotCountBuff].bTabCtrlEnable  = true;
  pstcSL.stcSlot[lSlotCountBuff].bHeadControl  = false;
  pstcSL.stcSlot[lSlotCountBuff].fFadeFixTime  = 0;
  pstcSL.stcSlot[lSlotCountBuff].bMultiLayerEventDetect  = true;

  pstcSL.stcSlot[lSlotCountBuff].stcListString.stcScrollRank.lSlotIDStart = -1;
  pstcSL.stcSlot[lSlotCountBuff].stcListString.stcScrollRank.lSlotIDEnd = -1;
  pstcSL.stcSlot[lSlotCountBuff].stcListString.stcComboRank.lSlotIDStart = -1;
  pstcSL.stcSlot[lSlotCountBuff].stcListString.stcComboRank.lSlotIDEnd = -1;
}
stcListTextSlot.stcSlotRank.lSlotIDEnd   =  GetSlotCount();
stcListTextSlot.bHasScroll    = false;
stcListTextSlot.lMaxListNb    = lMaxListNumber;
stcListTextSlot.stcComboRank.lSlotIDStart   = -1;
stcListTextSlot.stcComboRank.lSlotIDEnd   = -1;
stcListTextSlot.stcScrollRank.lSlotIDStart   = -1;
stcListTextSlot.stcScrollRank.lSlotIDEnd   = -1;
return stcListTextSlot;

}


สิ่งที่เพิ่มเข้ามามีมากมายซะจนอาจจะดูไม่ออกว่าอะไรเป็นอะไร แต่ถ้าเราลองคิดถึง Control ที่เกี่ยวกับ List
ก็ยังมี ComboBox ที่ต้องใช้งานร่วมกับ List อยู่ ดังนั้นเมื่อมีการออกแบบ Control นั้น
เราจึงต้องทำให้ใช้งานได้ครอบคลุมโดยที่เราจะให้ ComboBox นั้น มาใช้งานร่วมกับ List ได้ ด้วยการใช้
การโยงเพียง SLOT_ID เท่านั้น และส่วนที่มีการแยกออกมาจาก List Control อีกส่วนก็คือ Scroll
ซึ่งเราจะสร้างเป็น Scroll Control ต่างหาก เพื่อให้ Control อื่นๆ สามารถเรียกใช้ Scroll ได้โดยไม่ต้องทำโครงสร้าง
ไว้ภายใน Control ที่มีการใช้ Scroll ทุกๆอัน

ถ้าเราเข้าใจหลักการของ SLOT ก็จะสามารถสร้าง Control ได้อีกมากมายหลายรูปแบบ
ซึ่งมันเป็นหน้ากากของ GUI ที่ใช้แสดงผลต่างๆ นั่นเอง แต่ภายในที่เราต้องมองลึกลองไปอีกก็คือการแลกเปลี่ยนข้อมูล
ที่เราสามารถเพิ่มประสิทธิภาพด้วย Algorithm ต่างๆ สุดแท้แต่ความสามารถ
สิ่งที่ขาดไม่ได้คือโครงสร้างพื้นฐานของข้อมูล เช่น Stack Queue และ List ที่ใช้เก็บข้อมูล แต่ก่อนจะไปพูดถึงการแลกเปลี่ยนข้อมูล
ผมจะขอพูดถึง Event ก่อน Event ถ้าแปลตรงตัวก็คือ เหตุการณ์ สิ่งนี้เหมือนเป็นการตรวจจับการใช้งานของผู้ใช้
เพื่อให้ GUI มีการตอบสนอง เช่น OnClick OnRollover OnRelease
การเขียน Function เพื่อให้ตรวจจับ Event นั้น มันก็เกี่ยวโยงในหลายๆส่วน ทั้ง เรื่องของ Loop เรื่องของ SLOT ID
จาก หลักการของ SLOT ID นั้น การทำงานเป็น Loop เกิดจากการ วนตั้งแต่ ID แรก จนถึง ID สุดท้าย
ดังตัวอย่าง
Code:
inline void ZPGuiSystem::DoDlgLoop(ZP_STC_MOUSEPOSABS stcMousePosAbs)
{
if(pstcClose.stcSet.bCreated)
  CloseDlg(stcMousePosAbs,ZP_CLOSEBYCLOSE_RELEASE);
if(pstcDrag.stcSet.bCreated)
  DragDlg(stcMousePosAbs,ZP_DRAGBYDRAG,(stcMousePosAbs.lButton1 != 0));


// Slot detect event.
for(int i=0;i<GetSlotNumber();i++)
{
  if(!GetSLOT(i).bMultiLayerEventDetect)
  {
   if(GetHasTextureRollover(ZP_SLOTAREA,i))
   {
    SetRenderTextureRollover(ZP_SLOTAREA,false,i);
   }
  }

  if(GetDetectByType(ZP_SLOTAREA,stcMousePosAbs,i))
  {
   if(GetHasTexturePress(ZP_SLOTAREA,i))
   {
    SwapPressRoll(ZP_SLOTAREA,true,i);
   }
  }
  //set close flag.
  if(!GetDetectByType(ZP_SLOTAREA,stcMousePosAbs,i))
  {
   if(GetHasTexturePress(ZP_SLOTAREA,i))
    SetRenderTexturePress(ZP_SLOTAREA,false,i);
  }
  //detect list for scroll enable
  //if list disable scroll will be disable too.
  if(IsSlotType(ZP_SLOT_TYPE_SCROLLUP,i)
   ||IsSlotType(ZP_SLOT_TYPE_SCROLLDOWN,i)
   ||IsSlotType(ZP_SLOT_TYPE_SCROLLDRAGTOP,i)
   ||IsSlotType(ZP_SLOT_TYPE_SCROLLDRAGMIDDLE,i)
   ||IsSlotType(ZP_SLOT_TYPE_SCROLLDRAGBOTTOM,i)
   ||IsSlotType(ZP_SLOT_TYPE_SCROLLDOWN,i))
  {
   if(!GetSLOT(clsScroll[GetSLOT(i).lOwnerSpecialID].stcListObject.stcSlotRank.lSlotIDStart).bSlotEnable)
    pstcSL.stcSlot[i].bSlotEnable = false;
   else
    pstcSL.stcSlot[i].bSlotEnable = true;
  }
  //scroll system.
  if(OnPressScroll(stcMousePosAbs,i))
  {
   DoScrollSys(i);
  }
  //tab system.
  if(OnPressTab(stcMousePosAbs,i))
  {
   DoTabMenuSys(i);
  }

  if(OnDragSTItem(stcMousePosAbs,i))
  {
   DoIconOnMousePos(stcMousePosAbs);
  }
 
  //combo system.
  DoComboList(stcMousePosAbs,i);
  DoMouseDetectEdit(stcMousePosAbs,i);
  DoAutoFocus(stcMousePosAbs,i);
  DoEditSystem(i);
}
}


จาก Function ด้านบน คือ Loop หลักที่ใช้ตรวจจับเหตุการณ์ต่างๆ ซึ่งภายในจะมี Function ย่อยๆที่ทำงานลงลึกไปอีก
ขึ้นอยู่กับการออกแบบ Control เป็นหลัก เพราะ Control บางอย่างมีการทำงานที่ซับซ้อนกว่า Button Control ธรรมดา
ตัวอย่าง Function Event Detect ซึ่งอาจจะยากในการทำความเข้าใจบ้าง
Code:
inline bool ZPGuiSystem::GetDetectByType(int iAreaType,ZP_STC_MOUSEPOSABS stcMousePosAbs,long lSlotID)
{
SetStartDetect(iAreaType,stcMousePosAbs,lSlotID);
if(IsDetectArea(iAreaType,stcMousePosAbs,lSlotID)&&(stcMousePosAbs.lButton1 != 0)&&GetStartDetect(iAreaType,lSlotID))
  return true;
else if(IsDetectArea(iAreaType,stcMousePosAbs,lSlotID)&&(stcMousePosAbs.lButton1 == 0)&&!GetStartDetect(iAreaType,lSlotID))
  return false;
else
  return false;
}


รูปแสดงกลุ่มของ SLOT RANK

Image

รูปแสดงตัวอย่างของ Function ที่ถูกสร้างขึ้นมา

Image

Image

Image

Image

Image

Image


Top 
 Profile  
 
Display posts from previous:  Sort by  
 
Post new topic Reply to topic  [ 1 post ] 

Board index » General Programming


Who is online

Users browsing this forum: No registered users and 1 guest

 
 

 
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron