home *** CD-ROM | disk | FTP | other *** search
/ PC World 2002 December / PCWorld_2002-12_cd.bin / Software / Komercni / Baltik / katB.exe / katB / DESIGN / DESIGN_C.GDI < prev    next >
Text File  |  2002-09-24  |  17KB  |  498 lines

  1. ////////////////////////////////////////////////////////////////////////////////
  2. //----------------------------------------------------------------------------//
  3. //-----project DESINGER, copyright 2002 Libor Bareτ-------------------------//
  4. //----------------------------------------------------------------------------//
  5. ////////////////////////////////////////////////////////////////////////////////
  6.  
  7.  
  8.  
  9. //
  10.  
  11. //
  12. // Library for Graphic User Interface
  13. // (Using GDISTYLE of Microsoft Windows 98/XP)
  14. //
  15. // copyright 2002 Libor Bareτ
  16.  
  17.  
  18.  
  19.  
  20.  
  21. char m_Tahoma8Height[255];
  22. char m_TahomaItalic8Height[255];
  23.  
  24. char m_TahomaBold8Height[255];
  25. char m_TahomaBoldItalic8Height[255];
  26.  
  27. char m_ArialBold10Height[255];
  28. char m_ArialBoldItalic10Height[255];
  29.  
  30. void RectToVariable(RECT* src1, int &x,&y,&x2,&y2){
  31.    x=src1->left;y = src1->top; x2 = src1->right; y2 = src1->bottom;
  32. }
  33.  
  34. void LineFromTo2(int X,int Y, int X2, int Y2, char Color){
  35.        GrNastavBarvuPop²edí(Color);
  36.        GrKresliLinku(X,Y,X2,Y2);
  37. }
  38. void FillSolidRect(RECT* rect,char Color){
  39.        GrNastavBarvuPozadí(Color);
  40.        GrKresliVypln╪n∞Obdélník(rect->left,rect->top,rect->right,rect->bottom);
  41. }
  42. void FillSolidRect2(int x, int y, int x2, int y2,char Color){
  43.        GrNastavBarvuPozadí(Color);
  44.        GrKresliVypln╪n∞Obdélník(x,y,x2,y2);
  45.  
  46. }
  47. void CenterText(int x, int y,string strText,char t,char b,char hFont,char bDraw,RECT* pRect){
  48.    if(y <= 33)return; // for case that text is above diagramclientrect
  49.    SIZE sz;
  50.    GetTextExtent(strText,sz,hFont);
  51.    if(pRect!=0)SetRect(pRect,x-sz.x/2-1,y-1,x+sz.x/2+1,y+sz.y+1);
  52.    if(bDraw){
  53.       FillSolidRect(pRect,b);
  54.       TextOut(x-sz.x/2,y,strText,t,b,hFont);
  55.    }
  56.    if(pRect!=0)InflateRect(pRect,9,-1,9,-1);
  57.                 
  58.    
  59. }
  60. void DrawText(string szText,RECT* lpRect,char t,char b,unsigned uFormat,char hFont){
  61.         SIZE stext;GetTextExtent(szText,stext,hFont);
  62.         RECT Rect;CopyRect(&Rect,lpRect);
  63.         NormalizeRect(&Rect);
  64.         int nWidth = Rect.right - Rect.left;
  65.         int nHeight = Rect.bottom - Rect.top;
  66.         int slen = StrVelikost(szText);
  67.         long bModify = (uFormat & 0x00000010/*DT_MODIFYSTRING*/);
  68.                 while(stext.x > nWidth && slen >= 0){
  69.                 slen--;
  70.                 if(bModify) GetTextExtent(StrKopie(szText,0,slen)+"...",stext,hFont);
  71.                 else GetTextExtent(StrKopie(szText,0,slen),stext,hFont);
  72.         }
  73.         if(uFormat & 0x00000004 /*DT_VCENTER*/)nHeight=nHeight/2-stext.y/2;
  74.         else nHeight = 0;
  75.         if(uFormat & 0x00000001/*DT_CENTER*/)nWidth=nWidth/2-stext.x/2;
  76.         else nWidth = 0;
  77.         if((slen != StrVelikost(szText))){
  78.                          szText=StrKopie(szText,0,slen);
  79.                          if(bModify)szText+="...";
  80.                 }
  81.         TextOut(Rect.left+nWidth,Rect.top+nHeight,szText,t,b,hFont);
  82.         if(uFormat & 0x00000020/*DT_UNDERLINE*/)LineFromTo2(Rect.left+nWidth,Rect.top+nHeight+stext.y,Rect.left+nWidth+stext.x,Rect.top+nHeight+stext.y,t);
  83.  
  84. }
  85. void TextOut(int x, int y, string szText,char color,char bg, char FontType){
  86.        int nPos=0;
  87.        char charid;
  88.        int plusb;
  89.        int nLen = StrDélka(szText);
  90.            //char *nStartChar=szText[0];
  91.        void* u;
  92.            x-=2;
  93.        switch(FontType){
  94.             case FONT_TAHOMA_BOLD_8:
  95.                                  u=&m_TahomaBold8Height;
  96.                                  if(color==5)plusb=18000;
  97.                                  else plusb=28000;
  98.                  //¼ekej(0x8001);
  99.                  break;
  100.             case FONT_TAHOMA_BOLD_ITALIC_8:
  101.                  u=&m_TahomaBoldItalic8Height;plusb=9000;
  102.                  break;
  103.             case FONT_TAHOMA_ITALIC_8:
  104.                  u=&m_TahomaItalic8Height;plusb=7000;
  105.                  break;
  106.             case FONT_ARIAL_BOLD_ITALIC_10:plusb=3000;
  107.                  u=&m_ArialBoldItalic10Height;
  108.                  break;
  109.             case FONT_ARIAL_BOLD_10:plusb=5000;
  110.                  u=&m_ArialBold10Height;
  111.                  break;
  112.             default :plusb=0;
  113.                  if(color == 3)plusb=13000;
  114.                  else if(color == 4 && bg==5)plusb=26000;
  115.                                  else if(color == 5)plusb=11000;
  116.                  else if(color == 2)plusb=22000;
  117. #ifndef _XP_THEME
  118.                  else if(color == 16)plusb=24000;
  119. #endif
  120.                                  else plusb=1000;
  121.                  u =&m_Tahoma8Height;
  122.                  break;
  123.        }
  124.        if(nLen <= 0)return;
  125.        for(nPos=0;nPos < nLen; nPos++){
  126.              charid =szText[nPos];
  127.              if(charid != 33)
  128.                 GrKresliP²edm╪t((charid >= 150) ? charid+plusb+851 : 1+plusb+charid,1,x,y);
  129.  
  130.              x+=((char*)u)[(int)charid];
  131.        }
  132.  
  133. }
  134. void GetTextExtent(string szText,SIZE &returnsize, char FontType){
  135.        int nPos=0,x=0;
  136.        char charid;
  137.        int nLen = StrDélka(szText);
  138.  
  139.        void* u = 0;
  140.        returnsize.x=0;
  141.        switch(FontType){
  142.             case FONT_TAHOMA_BOLD_8:
  143.                  u=&m_TahomaBold8Height;returnsize.y = 13;
  144.                                  break;
  145.             case FONT_TAHOMA_BOLD_ITALIC_8:
  146.                  u=&m_TahomaBoldItalic8Height;returnsize.y = 13;
  147.                  break;
  148.             case FONT_TAHOMA_ITALIC_8:
  149.                  u=&m_TahomaItalic8Height;returnsize.y = 13;
  150.                  break;
  151.             case FONT_ARIAL_BOLD_ITALIC_10:
  152.                  u=&m_ArialBoldItalic10Height;returnsize.y = 16;
  153.                  break;
  154.             case FONT_ARIAL_BOLD_10:
  155.                  u=&m_ArialBold10Height;returnsize.y = 16;
  156.                  break;
  157.             default :
  158.                  u =&m_Tahoma8Height;returnsize.y = 13;
  159.        }
  160.        if(nLen <= 0)return;
  161.        for(nPos=0;nPos < nLen; nPos++){
  162.              charid =szText[nPos]; // optimalization;
  163.              x+=((char*)u)[(int)charid];
  164.        }
  165.  
  166.     returnsize.x = x;
  167.  
  168.  
  169.  
  170. }
  171. void LineFromTo(LINE* rect, char Color){
  172.        GrNastavBarvuPop²edí(Color);
  173.        GrKresliLinku(rect->x,rect->y,rect->x2,rect->y2);
  174.  
  175. }
  176. void Draw3dRect2(int x, int y, int x2, int y2, char TopLeftColor,char BottomRightColor){
  177.       //  LineFromTo2(x,y,x2-1,y,TopLeftColor);
  178.       //  LineFromTo2(x,y+1,x,y2-1,TopLeftColor);
  179.       //  LineFromTo2(x2,y2,x2,y,BottomRightColor);
  180.       //  LineFromTo2(x2-1,y2,x,y2,BottomRightColor);
  181.           GrNastavBarvuPop²edí(TopLeftColor);
  182.           GrKresliMnohoúhelník(3,x2-1,y,x,y,x,y2-1);
  183.           GrNastavBarvuPop²edí(BottomRightColor);
  184.           GrKresliMnohoúhelník(3,x2,y,x2,y2,x,y2);
  185.  
  186.  
  187. }
  188.  
  189. void Draw3dRect(RECT* lpRect,char TopLeftColor,char BottomRightColor){
  190.  
  191.        Draw3dRect2(lpRect->left,lpRect->top,lpRect->right,lpRect->bottom,TopLeftColor,BottomRightColor);
  192.  
  193. }
  194. void InflateRectOne(RECT* lpRect){
  195.         InflateRect(lpRect,-1,-1,-1,-1);
  196. }
  197. void DrawEdge(RECT* lpRect,unsigned nState){
  198.        RECT rc;CopyRect(&rc,lpRect);
  199.        if(nState & 0x0004/*DES_MODAL*/){
  200.             Draw3dRect(lpRect,1,4);
  201.             InflateRectOne(&rc);
  202.             Draw3dRect(&rc,5,3);
  203.             InflateRectOne(&rc);
  204.             Draw3dRect(&rc,0,0);
  205.             InflateRectOne(&rc);
  206.        }
  207.        if(nState & 0x0002/*DES_STATIC*/){
  208.             Draw3dRect(&rc,3,5);
  209.             InflateRectOne(&rc);
  210.        }
  211.        if(nState & 0x0001/*DES_CLIENT*/){
  212.             Draw3dRect(&rc,3,5);
  213.             InflateRectOne(&rc);
  214.             Draw3dRect(&rc,4,1);
  215.  
  216.  
  217.        }
  218.  
  219.  
  220.  
  221.  
  222. }
  223.  
  224. #ifdef _XP_THEME
  225.    #include "design_c.xp"
  226. #else
  227.    #include "design_c.2k"
  228.  
  229. #endif
  230.  
  231.  
  232. void DrawFrameControl2(int x, int y, int x2, int y2,unsigned nType, long nState,char* szText,unsigned hBitmap){ // for 7/*DFC_EDIT*/ is hBitmap replaced by hFont !!!!!!
  233.     RECT rect;
  234.  
  235.         SetRect(&rect,x,y,x2,y2);
  236.     DrawFrameControl(&rect, nType,nState, szText,hBitmap);
  237.  
  238. }
  239.  
  240.  
  241. void MakeMaximalRect(RECT* dest, RECT* src){
  242.    int x,y,x2,y2;
  243.    RectToVariable(src,x,y,x2,y2);
  244.    if(dest->left > x)dest->left = x;
  245.    if(dest->top  > y)dest->top = y;
  246.    if(dest->bottom  < y2)dest->bottom = y2;
  247.    if(dest->right  < x2)dest->right = x2;
  248.  
  249.  
  250.  
  251. }
  252.  
  253. void MakeMaximalRect2(RECT* dest, int x, int y){
  254.    RECT r;SetRect(&r,x,y,x,y);
  255.    MakeMaximalRect(dest,&r);
  256.  
  257. }
  258.  
  259. void NormalizeRect(RECT* dest){
  260.     if(!(dest->bottom > dest->top)){int tp;tp=dest->top;dest->top=dest->bottom;dest->bottom=tp;}
  261.     if(!(dest->right > dest->left)){int tpx;tpx=dest->left;dest->left=dest->right;dest->right=tpx;}
  262.  
  263. }/*
  264. char IntersectHorVerLine(LINE* ln, LINE* ln2){
  265.         // MUST BE NORMALIZED !!!
  266.         if(ln->x == ln->x2){
  267.             if((ln->y <= ln2->y && ln->y2 >= ln2->y) && (ln->x >= ln2->x && ln->x <= ln2->x2))return 1;
  268.         }
  269.         else {
  270.                 if((ln->x <= ln2->x && ln->x2 >= ln2->x ) && (ln->y >= ln2->x && ln->x <= ln2->y2 ))return 1;
  271.         }
  272.         return 0;
  273.  
  274. }
  275. void _IRS(int nPos,LINE* ln, RECT* src1){
  276.       int l,r,t,b;RectToVariable(src1,l,t,r,b);
  277.         if(nPos == 0 || nPos == 2){
  278.           ln->x=l;
  279.           ln->x2=r;
  280.           ln->y2=ln->y=((nPos==0)?t:b);
  281.         }
  282.         else {
  283.           ln->y=t;
  284.           ln->y2=b;
  285.           ln->x2=ln->x=((nPos==3)?l:r);
  286.  
  287.         }
  288.  
  289. }*/
  290. char IntersectRect(RECT* src1,RECT* src2){
  291.   // The intersection is the largest rectangle contained in both existing rectangles.
  292.   // This algorithm I devised myself. I hope that it won't make errors :-)
  293.  
  294.   if(src1->left > src2->right || src1->top > src2->bottom ||  // isnt ...
  295.   src2->left > src1->right || src2->top > src1->bottom)return 0; // isnt ...
  296.   return 1;
  297.   /*
  298.         int s2l,s2r,s2t,s2b,s1l,s1r,s1t,s1b;
  299.         RectToVariable(src1,s1l,s1t,s1r,s1b);
  300.         RectToVariable(src2,s2l,s2t,s2r,s2b);
  301.  
  302.      if(PtInRect(s2l,s2t,src1) || PtInRect(s2r,s2t,src1) ||
  303.        PtInRect(s2l,s2b,src1) || PtInRect(s2r,s2b,src1)   ||
  304.        PtInRect(s1l,s1t,src2) || PtInRect(s1r,s1t,src2) ||
  305.        PtInRect(s1l,s1b,src2) || PtInRect(s1r,s1b,src2))
  306.        return 1;
  307.   */ 
  308. /*
  309.  this code is for RGN intersect, but for my program is too slow that I made some another algorithm
  310.         int nPos=0,nPos2;
  311.         LINE lna,lnb;
  312.         for(;nPos < 4;nPos++){
  313.         _IRS(nPos,&lna,src1);
  314.             for(nPos2=0;nPos2 < 4; nPos2++){
  315.                _IRS(nPos2,&lnb,src2);
  316.                if(IntersectHorVerLine(&lna,&lnb))return 1;
  317.             }
  318.         }
  319.          */
  320.    return 0;
  321. }
  322.  
  323.  
  324.  
  325. char PtOnLineArea(POINT* pt,LINE* ln){
  326.         // normalize line
  327.             int x,y,x2,y2;
  328.                 RectToVariable((RECT*)ln,x,y,x2,y2);
  329.         if(pt->left >= (( x < x2 ? x : x2)) && pt->left <= (( x > x2 ? x : x2)) && 
  330.                         pt->top >= (( y < y2 ? y : y2)) && pt->top <= (( y > y2 ? y : y2)))        
  331.                 return 1;
  332.         return 0;
  333.  
  334. }
  335. char LinesIntersect(LINE *src, LINE *dest,POINT* intersection)
  336. {
  337.         // optimal...
  338.         int sx,sx2,sy,sy2;
  339.                 RectToVariable((RECT*)src,sx,sy,sx2,sy2);
  340.         int dx,dx2,dy,dy2;
  341.                 RectToVariable((RECT*)dest,dx,dy,dx2,dy2);
  342.  
  343.  
  344.         if( ((sx < dx) && (sx2 <dx) &&
  345.             (sx < dx2) && (sx2 <dx2)) ||
  346.             ((sy < dy) && (sy2 <dy) &&
  347.             (sy < dy2) && (sy2 <dy2)) ||
  348.             ((sx > dx) && (sx2 >dx) &&
  349.             (sx > dx2) && (sx2 >dx2)) ||
  350.             ((sy > dy) && (sy2 >dy) &&
  351.             (sy > dy2) && (sy2 >dy2)))
  352.                  return 0;
  353.  
  354.  
  355.         // A = sx,sy
  356.         // B = sx2,sy2
  357.         // X = dx,sy
  358.         // Y = dx2,sy2
  359.  
  360.  
  361.         //  B-A = (x1,y1)
  362.         //  Y-X = (x2,y2)
  363.         int x1,y1,x2,y2;
  364.  
  365.         x1 = sx2 - sx;
  366.         y1 = sy2 - sy;
  367.         x2 = dx2 - dx;
  368.         y2 = dy2 - dy;
  369.  
  370.  
  371.         double k;
  372.  
  373.                 // function :
  374.         //       (float)x1*(Ay - Xy) + y1*(Xx-Ax)
  375.         // k = ---------------------------
  376.         //          x*y2 - x2 * y
  377.         k = ((float)x1*(float)y2-(float)x2*(float)y1);
  378.        if(k == 0){return 0;}
  379.         k = ((double)(((float)x1*(sy - dy) + (float)y1*( dx - sx))))/(double)k;
  380.         SetPoint(intersection,dx + x2 * k,dy + y2 * k);
  381.         
  382.  
  383.  
  384.  
  385.         if(PtOnLineArea(intersection,dest)==1)return 1;
  386.         return 0;
  387.  
  388. }
  389.  
  390. char PtInRGN(int mousex, int mousey,POINT* lt, int nCount){
  391.         int x,x2,ty,ty2,iPocet=0,tl,tl2,tx,tx2;
  392.         int _xx,_xy,_x2x,_x2y;
  393.         for(x =0; x < nCount;x++){
  394.                 x2 = x==(nCount-1)?0:(x+1);
  395.                 // jedna se o trivialni hranu ??
  396.                 _xx = lt[x].left;_x2x = lt[x2].left;
  397.                 _xy = lt[x].top;_x2y = lt[x2].top;
  398.                 if(!((_xy > mousey && _x2y > mousey) ||
  399.                    (_xy < mousey && _x2y < mousey) ||
  400.                    (_xx < mousex && _x2x < mousex))){
  401.                         /* netrivialni */
  402.                         // vypocitam prusecik hrany s mousey ...
  403.  
  404.                                 // odecti nehornejsi strany id strany spodni (y)
  405.                                 tl = (_xy < _x2y ? x: x2);if(tl==x)tl2=x2;else tl2 = x;
  406.                                 ty=(mousey - lt[tl].top);
  407.                                 // spocti roztec x bodu ...
  408.                                 tx=abs(_xx-_x2x); //  sirka odchylek ...
  409.                                 // spocitej rozdil vrchol
  410.                                 ty2 = abs(_xy-_x2y);
  411.                                 // lezi v jedne primce
  412.                                 if(ty2 ==0){// nachazeji se ve stejne rovine ?
  413.                                         if(_xx < mousex && _x2x < mousex)return 1;
  414.                                         // pozn - OPTIMALIZATION.:Jeslize je rovna cara a body x,x2 jsou mezi mousex lezi testovany bod uvnitr => neni potreba dalsi zkouseni ... 
  415.                                 }
  416.  
  417.                                 else{
  418.                                         tx2 = lt[tl].left + ((lt[tl].left > lt[tl2].left)? -((float)((float)tx*(float)ty)/ty2) : +((float)((float)tx*(float)ty)/ty2));/* novy bod na x */
  419.                                         // jestlize je vypocteny bod na pravo od kliknute osy x, lezi asi bod v n-uhelniku
  420.                                         if(mousex < tx2 )iPocet++;
  421.                                 }
  422.            /*
  423.                                 GrNastavPozici(0,0);
  424.                                 GrPiτD¼íslo(tx2,-1,2);
  425.                                 GrPiτD¼íslo(x,-1,2);
  426.                                 GrPiτL¼íslo(iPocet,-1);                   
  427.                                 ¼ekejNaKlávesu();
  428.             */
  429.                       }          
  430.         }
  431.         // jestlize je, iPocet lichy lezi uvnitr ..
  432.         if(iPocet%2)return 1;
  433.         return 0;
  434.  
  435. }
  436. void CoverLine(RECT* pLine,POINT pt[6], int by){
  437.     //  
  438.         //  MAKE THIS ...
  439.  
  440.         //  + PT[0]   PT[1]
  441.         //   \      /
  442.         //    \   /
  443.     //     +line[x,y]
  444.         //    / \
  445.         //  /    \
  446.         // +PT[5] \
  447.         //         \
  448.         //          \       +PT[2]
  449.         //           \    / 
  450.         //            \  /
  451.     //             +line[x2,y2]
  452.         //            / \
  453.         //          /    \
  454.         //        +PT[4]  + PT[3]
  455.         //
  456.     int x=pLine->left,x2=pLine->right;
  457.     int y=pLine->top,y2=pLine->bottom;
  458.         float vectorABx=x2 - x;
  459.         float vectorABy=y2 - y;
  460.         double rate = (double)sqrt((vectorABx)*(vectorABx)+(vectorABy)*(vectorABy))/(double)by; // 
  461.         if(rate==0)return;
  462.         vectorABx/=rate;vectorABy/=rate;
  463.   
  464.  
  465.         SetPoint(&pt[0],x-vectorABx,y-vectorABy);
  466.     SetPoint(&pt[1],x+vectorABy,y-vectorABx);
  467.     SetPoint(&pt[2],x2+vectorABy,y2-vectorABx);
  468.     SetPoint(&pt[3],x2+vectorABx,y2+vectorABy);
  469.     SetPoint(&pt[4],x2-vectorABy,y2+vectorABx);
  470.     SetPoint(&pt[5],x-vectorABy,y+vectorABx);
  471.   
  472.  
  473. }
  474. char RGNLineIntersect(LINE* line,POINT * hrg, int nCount,POINT* pt){
  475.  
  476.         int i = 0;
  477.         LINE dest;
  478.                 
  479.         for(i;i < nCount;i++){
  480.                 dest.x = hrg[i].left;dest.y = hrg[i].top;
  481.                  if(nCount > i+1){dest.x2 = hrg[i+1].left;dest.y2 = hrg[i+1].top;}
  482.                 else {dest.x2 = hrg[0].left;dest.y2 = hrg[0].top;}
  483.               
  484.                 if(LinesIntersect(line,&dest,pt)==1){
  485.  
  486.                                 return 1;}
  487.  
  488.  
  489.         }
  490.         return 0;
  491.  
  492. }
  493.  
  494. ///////////////////////////////////////////////////////////////////////////
  495. ///////////////////////////////////////////////////////////////////////////
  496. ///////////////////////////////////////////////////////////////////////////
  497. ///////////////////////////////////////////////////////////////////////////
  498.