Home | History | Annotate | Download | only in theme
      1 // Copyright 2014 PDFium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
      6 
      7 #include "xfa/src/foxitlib.h"
      8 #define FWLTHEME_CAPACITY_CXFormBorder 3
      9 #define FWLTHEME_CAPACITY_CYFormBorder 3
     10 #define FWLTHEME_CAPACITY_CYNarrowCaption 18
     11 #define FWLTHEME_CAPACITY_CYCaption 29
     12 #define FWLTHEME_CAPACITY_BigIconSize 32
     13 #define FWLTHEME_CAPACITY_SmallIconSize 16
     14 #define FWLTHEME_CAPACITY_FormTextColor 0xFFFFFFFF
     15 #define FWLTHEME_FORMBTN_Margin 5
     16 #define FWLTHEME_FORMBTN_Span 2
     17 #define FWLTHEME_FORMBTN_Size 21
     18 CFWL_FormTP::CFWL_FormTP() : m_pActiveBitmap(NULL), m_pDeactivebitmap(NULL) {
     19   m_pThemeData = new SBThemeData;
     20   SetThemeData(0);
     21   m_rtDisLBorder.Reset();
     22   m_rtDisRBorder.Reset();
     23   m_rtDisBBorder.Reset();
     24   m_rtDisCaption.Reset();
     25 }
     26 CFWL_FormTP::~CFWL_FormTP() {
     27   if (m_pThemeData) {
     28     delete m_pThemeData;
     29     m_pThemeData = NULL;
     30   }
     31 }
     32 FWL_ERR CFWL_FormTP::Initialize() {
     33   InitTTO();
     34   InitCaption(TRUE);
     35   InitCaption(FALSE);
     36   return CFWL_WidgetTP::Initialize();
     37 }
     38 FWL_ERR CFWL_FormTP::Finalize() {
     39   FinalizeTTO();
     40   if (m_pActiveBitmap) {
     41     delete m_pActiveBitmap;
     42     m_pActiveBitmap = NULL;
     43   }
     44   if (m_pDeactivebitmap) {
     45     delete m_pDeactivebitmap;
     46     m_pDeactivebitmap = NULL;
     47   }
     48   return CFWL_WidgetTP::Finalize();
     49 }
     50 FX_BOOL CFWL_FormTP::IsValidWidget(IFWL_Widget* pWidget) {
     51   if (!pWidget)
     52     return FALSE;
     53   FX_DWORD dwHash = pWidget->GetClassID();
     54   return dwHash == FWL_CLASSHASH_Form;
     55 }
     56 FX_DWORD CFWL_FormTP::SetThemeID(IFWL_Widget* pWidget,
     57                                  FX_DWORD dwThemeID,
     58                                  FX_BOOL bChildren) {
     59   if (m_pThemeData) {
     60     SetThemeData(FWL_GetThemeColor(dwThemeID));
     61   }
     62   InitCaption(TRUE);
     63   InitCaption(FALSE);
     64   return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren);
     65 }
     66 FX_BOOL CFWL_FormTP::DrawBackground(CFWL_ThemeBackground* pParams) {
     67   if (!pParams)
     68     return FALSE;
     69   int32_t iActive = 0;
     70   if (pParams->m_dwStates & FWL_PARTSTATE_FRM_Inactive) {
     71     iActive = 1;
     72   }
     73   FWLTHEME_STATE eState = FWLTHEME_STATE_Normal;
     74   switch (pParams->m_dwStates & 0x03) {
     75     case FWL_PARTSTATE_FRM_Hover: {
     76       eState = FWLTHEME_STATE_Hover;
     77       break;
     78     }
     79     case FWL_PARTSTATE_FRM_Pressed: {
     80       eState = FWLTHEME_STATE_Pressed;
     81       break;
     82     }
     83     case FWL_PARTSTATE_FRM_Disabled: {
     84       eState = FWLTHEME_STATE_Disabale;
     85       break;
     86     }
     87     default: {}
     88   }
     89   switch (pParams->m_iPart) {
     90     case FWL_PART_FRM_Border: {
     91       DrawFormBorder(pParams->m_pGraphics, &pParams->m_rtPart, eState,
     92                      &pParams->m_matrix, iActive);
     93       break;
     94     }
     95     case FWL_PART_FRM_Edge: {
     96       DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(),
     97                &pParams->m_rtPart, &pParams->m_matrix);
     98       break;
     99     }
    100     case FWL_PART_FRM_Background: {
    101       FillBackground(pParams->m_pGraphics, &pParams->m_rtPart,
    102                      &pParams->m_matrix);
    103       break;
    104     }
    105     case FWL_PART_FRM_Caption: {
    106       DrawCaption(pParams->m_pGraphics, &pParams->m_rtPart, eState,
    107                   &pParams->m_matrix, iActive);
    108       break;
    109     }
    110     case FWL_PART_FRM_NarrowCaption: {
    111       DrawNarrowCaption(pParams->m_pGraphics, &pParams->m_rtPart, eState,
    112                         &pParams->m_matrix, iActive);
    113       break;
    114     }
    115     case FWL_PART_FRM_CloseBox: {
    116       DrawCloseBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
    117                    &pParams->m_matrix, iActive);
    118       break;
    119     }
    120     case FWL_PART_FRM_MinimizeBox: {
    121       DrawMinimizeBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
    122                       &pParams->m_matrix, iActive);
    123       break;
    124     }
    125     case FWL_PART_FRM_MaximizeBox: {
    126       DrawMaximizeBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
    127                       pParams->m_dwData, &pParams->m_matrix, iActive);
    128       break;
    129     }
    130     case FWL_PART_FRM_Icon: {
    131       DrawIconImage(pParams->m_pGraphics, pParams->m_pImage, &pParams->m_rtPart,
    132                     eState, &pParams->m_matrix, iActive);
    133       break;
    134     }
    135     default: {}
    136   }
    137   return TRUE;
    138 }
    139 FX_BOOL CFWL_FormTP::DrawText(CFWL_ThemeText* pParams) {
    140   if (!m_pTextOut)
    141     return FALSE;
    142   if (pParams->m_iPart == FWL_PART_FRM_Caption) {
    143     m_pTextOut->SetTextColor(0xFFFFFFFF);
    144   } else {
    145     m_pTextOut->SetTextColor(0xFF000000);
    146   }
    147   return CFWL_WidgetTP::DrawText(pParams);
    148 }
    149 void* CFWL_FormTP::GetCapacity(CFWL_ThemePart* pThemePart,
    150                                FX_DWORD dwCapacity) {
    151   FX_BOOL bDefPro = FALSE;
    152   FX_BOOL bDwordVal = FALSE;
    153   switch (dwCapacity) {
    154     case FWL_WGTCAPACITY_CXBorder: {
    155       m_fValue = FWLTHEME_CAPACITY_CXFormBorder;
    156       break;
    157     }
    158     case FWL_WGTCAPACITY_CYBorder: {
    159       m_fValue = FWLTHEME_CAPACITY_CYFormBorder;
    160       break;
    161     }
    162     case FWL_WGTCAPACITY_FRM_CYCaption: {
    163       m_fValue = FWLTHEME_CAPACITY_CYCaption;
    164       break;
    165     }
    166     case FWL_WGTCAPACITY_FRM_CYNarrowCaption: {
    167       m_fValue = FWLTHEME_CAPACITY_CYCaption;
    168       break;
    169     }
    170     case FWL_WGTCAPACITY_TextColor: {
    171       bDwordVal = TRUE;
    172       m_dwValue = FWLTHEME_CAPACITY_FormTextColor;
    173       break;
    174     }
    175     case FWL_WGTCAPACITY_FRM_BigIcon: {
    176       m_fValue = FWLTHEME_CAPACITY_BigIconSize;
    177       break;
    178     }
    179     case FWL_WGTCAPACITY_FRM_SmallIcon: {
    180       m_fValue = FWLTHEME_CAPACITY_SmallIconSize;
    181       break;
    182     }
    183     default: { bDefPro = TRUE; }
    184   }
    185   if (!bDefPro) {
    186     if (bDwordVal) {
    187       return &m_dwValue;
    188     }
    189     return &m_fValue;
    190   }
    191   return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
    192 }
    193 FWL_ERR CFWL_FormTP::GetPartRect(CFWL_ThemePart* pThemePart,
    194                                  CFX_RectF& rtPart) {
    195   switch (pThemePart->m_iPart) {
    196     case FWL_PART_FRM_CloseBox: {
    197       CalCloseBox(pThemePart->m_pWidget, rtPart);
    198       break;
    199     }
    200     case FWL_PART_FRM_MaximizeBox: {
    201       CalMaxBox(pThemePart->m_pWidget, rtPart);
    202       break;
    203     }
    204     case FWL_PART_FRM_MinimizeBox: {
    205       CalMinBox(pThemePart->m_pWidget, rtPart);
    206       break;
    207     }
    208     case FWL_PART_FRM_HeadText: {
    209       CalCaption(pThemePart->m_pWidget, rtPart);
    210       break;
    211     }
    212     case FWL_PART_FRM_Icon: {
    213       CalIcon(pThemePart->m_pWidget, rtPart);
    214       break;
    215     }
    216     default: {}
    217   }
    218   return FWL_ERR_Succeeded;
    219 }
    220 void CFWL_FormTP::CalCloseBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
    221   FX_DWORD dwStyles = pWidget->GetStyles();
    222   CFX_RectF rtWidget;
    223   pWidget->GetWidgetRect(rtWidget);
    224   rtWidget.Offset(-rtWidget.left, -rtWidget.top);
    225   if (dwStyles & FWL_WGTSTYLE_CloseBox) {
    226     rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Span,
    227              rtWidget.top + FWLTHEME_FORMBTN_Margin, FWLTHEME_FORMBTN_Size,
    228              FWLTHEME_FORMBTN_Size);
    229   } else {
    230     rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Span,
    231              rtWidget.top + FWLTHEME_FORMBTN_Margin, 0, 0);
    232   }
    233 }
    234 void CFWL_FormTP::CalMaxBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
    235   FX_DWORD dwStyles = pWidget->GetStyles();
    236   CFX_RectF rtWidget;
    237   pWidget->GetWidgetRect(rtWidget);
    238   rtWidget.Offset(-rtWidget.left, -rtWidget.top);
    239   if (dwStyles & FWL_WGTSTYLE_MaximizeBox) {
    240     rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Size +
    241                  FWLTHEME_FORMBTN_Span * 2,
    242              rtWidget.top + FWLTHEME_FORMBTN_Margin, FWLTHEME_FORMBTN_Size,
    243              FWLTHEME_FORMBTN_Size);
    244   } else {
    245     rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin + FWLTHEME_FORMBTN_Size +
    246                  FWLTHEME_FORMBTN_Span * 2,
    247              rtWidget.top + FWLTHEME_FORMBTN_Margin, 0, 0);
    248   }
    249 }
    250 void CFWL_FormTP::CalMinBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
    251   FX_DWORD dwStyles = pWidget->GetStyles();
    252   CFX_RectF rtWidget;
    253   pWidget->GetWidgetRect(rtWidget);
    254   rtWidget.Offset(-rtWidget.left, -rtWidget.top);
    255   if (dwStyles & FWL_WGTSTYLE_MinimizeBox) {
    256     rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin +
    257                  FWLTHEME_FORMBTN_Size * 2 + FWLTHEME_FORMBTN_Span * 3,
    258              rtWidget.top + FWLTHEME_FORMBTN_Margin, FWLTHEME_FORMBTN_Size,
    259              FWLTHEME_FORMBTN_Size);
    260   } else {
    261     rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin +
    262                  FWLTHEME_FORMBTN_Size * 2 + FWLTHEME_FORMBTN_Span * 3,
    263              rtWidget.top + FWLTHEME_FORMBTN_Margin, 0, 0);
    264   }
    265 }
    266 void CFWL_FormTP::CalCaption(IFWL_Widget* pWidget, CFX_RectF& rect) {
    267   CFX_RectF rtWidget;
    268   pWidget->GetWidgetRect(rtWidget);
    269   rtWidget.Offset(-rtWidget.left, -rtWidget.top);
    270   rect.Set(rtWidget.left + FWLTHEME_FORMBTN_Margin,
    271            rtWidget.top + FWLTHEME_FORMBTN_Margin - 2,
    272            rtWidget.width - FWLTHEME_FORMBTN_Margin * 2,
    273            FWLTHEME_FORMBTN_Size + 2 * FWLTHEME_FORMBTN_Margin + 4);
    274 }
    275 void CFWL_FormTP::CalIcon(IFWL_Widget* pWidget, CFX_RectF& rect) {}
    276 void CFWL_FormTP::DrawFormBorder(CFX_Graphics* pGraphics,
    277                                  const CFX_RectF* pRect,
    278                                  FWLTHEME_STATE eState,
    279                                  CFX_Matrix* pMatrix,
    280                                  int32_t iActive) {
    281   CFX_RectF rt;
    282   rt.Set(pRect->left, pRect->top, 1, pRect->height);
    283   FX_FLOAT fBottom, fRight;
    284   fBottom = pRect->bottom();
    285   fRight = pRect->right();
    286   CFX_Path path;
    287   path.Create();
    288   CFX_Color clrLine;
    289   path.Clear();
    290   path.MoveTo(pRect->left, pRect->top);
    291   path.LineTo(pRect->left, fBottom - 1);
    292   path.LineTo(fRight - 1, fBottom - 1);
    293   path.LineTo(fRight - 1, pRect->top);
    294   clrLine = m_pThemeData->clrFormBorder[iActive][2];
    295   pGraphics->SetStrokeColor(&clrLine);
    296   pGraphics->StrokePath(&path, pMatrix);
    297   path.Clear();
    298   path.MoveTo(pRect->left + 1, pRect->top);
    299   path.LineTo(pRect->left + 1, fBottom - 2);
    300   path.LineTo(fRight - 2, fBottom - 2);
    301   path.LineTo(fRight - 2, pRect->top);
    302   clrLine = m_pThemeData->clrFormBorder[iActive][1];
    303   pGraphics->SetStrokeColor(&clrLine);
    304   pGraphics->StrokePath(&path, pMatrix);
    305   path.Clear();
    306   path.MoveTo(pRect->left + 2, pRect->top);
    307   path.LineTo(pRect->left + 2, fBottom - 3);
    308   path.LineTo(fRight - 3, fBottom - 3);
    309   path.LineTo(fRight - 3, pRect->top);
    310   clrLine = m_pThemeData->clrFormBorder[iActive][0];
    311   pGraphics->SetStrokeColor(&clrLine);
    312   pGraphics->StrokePath(&path, pMatrix);
    313   path.Clear();
    314   path.MoveTo(pRect->left + 3, pRect->top);
    315   path.LineTo(pRect->left + 3, fBottom - 4);
    316   path.LineTo(fRight - 4, fBottom - 4);
    317   path.LineTo(fRight - 4, pRect->top);
    318   clrLine = m_pThemeData->clrFormBorder[iActive][4];
    319   pGraphics->SetStrokeColor(&clrLine);
    320   pGraphics->StrokePath(&path, pMatrix);
    321   m_rtDisLBorder.Set(pRect->left, pRect->top + 29, 4, pRect->height - 29);
    322   m_rtDisRBorder.Set(pRect->right() - 4, pRect->top + 29, 4,
    323                      pRect->height - 29);
    324   m_rtDisBBorder.Set(pRect->left, pRect->bottom() - 4, pRect->width, 4);
    325   m_rtDisCaption.Set(pRect->left, pRect->top, pRect->width, 29);
    326 }
    327 void CFWL_FormTP::DrawCaption(CFX_Graphics* pGraphics,
    328                               const CFX_RectF* pRect,
    329                               FWLTHEME_STATE eState,
    330                               CFX_Matrix* pMatrix,
    331                               int32_t iActive) {
    332   CFX_RectF rt;
    333   FX_FLOAT fBottom, fRight;
    334   fBottom = pRect->bottom();
    335   fRight = pRect->right();
    336   rt.Set(pRect->left, pRect->top, pRect->width, 1);
    337   FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][0], &rt,
    338                 pMatrix);
    339   rt.Offset(0, 1);
    340   FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][1], &rt,
    341                 pMatrix);
    342   rt.Offset(0, 1);
    343   FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][2], &rt,
    344                 pMatrix);
    345   rt.Set(pRect->left, pRect->bottom() - 1, pRect->width, 1);
    346   FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeBottom[iActive][2], &rt,
    347                 pMatrix);
    348   rt.Offset(0, -1);
    349   FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeBottom[iActive][1], &rt,
    350                 pMatrix);
    351   rt.Set(pRect->left, pRect->top, 1, pRect->height);
    352   FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][2], &rt,
    353                 pMatrix);
    354   rt.Set(pRect->left + 1, pRect->top + 1, 1, fBottom - 1);
    355   FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][1], &rt,
    356                 pMatrix);
    357   rt.Set(pRect->left + 2, pRect->top + 2, 1, fBottom - 2);
    358   FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][0], &rt,
    359                 pMatrix);
    360   rt.Set(fRight - 1, pRect->top, pRect->width, pRect->height);
    361   FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][2], &rt,
    362                 pMatrix);
    363   rt.Set(fRight - 2, pRect->top + 1, 1, fBottom - 1);
    364   FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][1], &rt,
    365                 pMatrix);
    366   rt.Set(fRight - 3, pRect->top + 2, 1, fBottom - 2);
    367   FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][0], &rt,
    368                 pMatrix);
    369   CFX_RectF rect(*pRect);
    370   rect.Set(rect.left + 3, rect.top + 3, rect.width - 6, rect.height - 5);
    371   if (iActive == 0) {
    372     pGraphics->StretchImage(m_pActiveBitmap, rect, pMatrix);
    373   } else {
    374     pGraphics->StretchImage(m_pDeactivebitmap, rect, pMatrix);
    375   }
    376 }
    377 void CFWL_FormTP::DrawNarrowCaption(CFX_Graphics* pGraphics,
    378                                     const CFX_RectF* pRect,
    379                                     FWLTHEME_STATE eState,
    380                                     CFX_Matrix* pMatrix,
    381                                     int32_t iActive) {}
    382 void CFWL_FormTP::DrawCloseBox(CFX_Graphics* pGraphics,
    383                                const CFX_RectF* pRect,
    384                                FWLTHEME_STATE eState,
    385                                CFX_Matrix* pMatrix,
    386                                int32_t iActive) {
    387   FX_FLOAT fRight = pRect->right();
    388   FX_FLOAT fBottom = pRect->bottom();
    389   FX_FLOAT fWidth = pRect->width;
    390   FX_FLOAT fHeight = pRect->height;
    391   pGraphics->SaveGraphState();
    392   CFX_RectF rt(*pRect);
    393   pGraphics->SetLineWidth(1.0f);
    394   CFX_Path path;
    395   path.Create();
    396   path.AddRectangle(rt.left + 1, rt.top, fWidth - 2, 1);
    397   path.AddRectangle(rt.left, rt.top + 1, 1, fHeight - 2);
    398   path.AddRectangle(fRight - 1, rt.top + 1, 1, fHeight - 2);
    399   path.AddRectangle(rt.left + 1, fBottom - 1, fWidth - 2, 1);
    400   CFX_Color crFill;
    401   crFill = m_pThemeData->clrBtnEdgeOut[iActive];
    402   pGraphics->SetFillColor(&crFill);
    403   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    404   path.Clear();
    405   path.AddRectangle(rt.left + 1, rt.top + 1, 1, 1);
    406   path.AddRectangle(fRight - 2, rt.top + 1, 1, 1);
    407   path.AddRectangle(rt.left + 1, fBottom - 2, 1, 1);
    408   path.AddRectangle(fRight - 2, fBottom - 2, 1, 1);
    409   crFill = m_pThemeData->clrBtnCornerLight[iActive][eState - 1];
    410   pGraphics->SetFillColor(&crFill);
    411   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    412   path.Clear();
    413   path.AddRectangle(rt.left + 2, rt.top + 1, fWidth - 4, 1);
    414   path.AddRectangle(rt.left + 1, rt.top + 2, 1, fHeight - 4);
    415   crFill = m_pThemeData->clrCloseBtEdgeLight[iActive][eState - 1];
    416   pGraphics->SetFillColor(&crFill);
    417   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    418   path.Clear();
    419   path.AddRectangle(fRight - 2, rt.top + 2, 1, fHeight - 4);
    420   path.AddRectangle(rt.left + 2, fBottom - 2, fWidth - 4, 1);
    421   crFill = m_pThemeData->clrCloseBtEdgeDark[iActive][eState - 1];
    422   pGraphics->SetFillColor(&crFill);
    423   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    424   path.Clear();
    425   path.AddRectangle(pRect->left + 2, pRect->top + 2, fWidth - 4, fHeight - 4);
    426   DrawAxialShading(pGraphics, pRect->left + 2, pRect->top + 2, fRight - 2,
    427                    fBottom - 2,
    428                    m_pThemeData->clrCloseBtBKStart[iActive][eState - 1],
    429                    m_pThemeData->clrCloseBtBKEnd[iActive][eState - 1], &path,
    430                    FXFILL_WINDING, pMatrix);
    431   CFX_RectF rtX(*pRect);
    432   rtX.Inflate(-5, -5);
    433   path.Clear();
    434   FX_FLOAT frtXRight = rtX.right();
    435   FX_FLOAT frtXBottom = rtX.bottom();
    436   path.AddLine(rtX.left, rtX.top + 1, frtXRight - 1, frtXBottom);
    437   path.AddLine(rtX.left, rtX.top, frtXRight, frtXBottom);
    438   path.AddLine(rtX.left + 1, rtX.top, frtXRight, frtXBottom - 1);
    439   path.AddLine(rtX.left, frtXBottom - 1, frtXRight - 1, rtX.top);
    440   path.AddLine(rtX.left, frtXBottom, frtXRight, rtX.top);
    441   path.AddLine(rtX.left + 1, frtXBottom, frtXRight, rtX.top + 1);
    442   CFX_Color clrLine(0xffffffff);
    443   pGraphics->SetLineWidth(1.0f);
    444   pGraphics->SetStrokeColor(&clrLine);
    445   pGraphics->StrokePath(&path, pMatrix);
    446   pGraphics->RestoreGraphState();
    447 }
    448 void CFWL_FormTP::DrawMinMaxBoxCommon(CFX_Graphics* pGraphics,
    449                                       const CFX_RectF* pRect,
    450                                       FWLTHEME_STATE eState,
    451                                       CFX_Matrix* pMatrix,
    452                                       int32_t iActive) {
    453   pGraphics->SaveGraphState();
    454   FX_FLOAT fRight = pRect->right();
    455   FX_FLOAT fBottom = pRect->bottom();
    456   FX_FLOAT fWidth = pRect->width;
    457   FX_FLOAT fHeight = pRect->height;
    458   CFX_RectF rt(*pRect);
    459   pGraphics->SetLineWidth(1.0f);
    460   CFX_Path path;
    461   path.Create();
    462   path.AddRectangle(rt.left + 1, rt.top, fWidth - 2, 1);
    463   path.AddRectangle(rt.left, rt.top + 1, 1, fHeight - 2);
    464   path.AddRectangle(fRight - 1, rt.top + 1, 1, fHeight - 2);
    465   path.AddRectangle(rt.left + 1, fBottom - 1, fWidth - 2, 1);
    466   CFX_Color crFill;
    467   crFill = m_pThemeData->clrBtnEdgeOut[iActive];
    468   pGraphics->SetFillColor(&crFill);
    469   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    470   path.Clear();
    471   path.AddRectangle(rt.left + 1, rt.top + 1, 1, 1);
    472   path.AddRectangle(fRight - 2, rt.top + 1, 1, 1);
    473   path.AddRectangle(rt.left + 1, fBottom - 2, 1, 1);
    474   path.AddRectangle(fRight - 2, fBottom - 2, 1, 1);
    475   crFill = m_pThemeData->clrBtnCornerLight[iActive][eState - 1];
    476   pGraphics->SetFillColor(&crFill);
    477   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    478   path.Clear();
    479   path.AddRectangle(rt.left + 2, rt.top + 1, fWidth - 4, 1);
    480   path.AddRectangle(rt.left + 1, rt.top + 2, 1, fHeight - 4);
    481   crFill = m_pThemeData->clrNormalBtEdgeLight[iActive][eState - 1];
    482   pGraphics->SetFillColor(&crFill);
    483   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    484   path.Clear();
    485   path.AddRectangle(fRight - 2, rt.top + 2, 1, fHeight - 4);
    486   path.AddRectangle(rt.left + 2, fBottom - 2, fWidth - 4, 1);
    487   crFill = m_pThemeData->clrNormalBtEdgeDark[iActive][eState - 1];
    488   pGraphics->SetFillColor(&crFill);
    489   pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
    490   pGraphics->RestoreGraphState();
    491   path.Clear();
    492   path.AddRectangle(pRect->left + 2, pRect->top + 2, fWidth - 4, fHeight - 4);
    493   DrawAxialShading(pGraphics, pRect->left + 2, pRect->top + 2, fRight - 2,
    494                    fBottom - 2,
    495                    m_pThemeData->clrNormalBtBKStart[iActive][eState - 1],
    496                    m_pThemeData->clrNormalBtBKEnd[iActive][eState - 1], &path,
    497                    FXFILL_WINDING, pMatrix);
    498 }
    499 void CFWL_FormTP::DrawMinimizeBox(CFX_Graphics* pGraphics,
    500                                   const CFX_RectF* pRect,
    501                                   FWLTHEME_STATE eState,
    502                                   CFX_Matrix* pMatrix,
    503                                   int32_t iActive) {
    504   DrawMinMaxBoxCommon(pGraphics, pRect, eState, pMatrix);
    505   CFX_RectF rtMin;
    506   rtMin.Set(pRect->left + 5, pRect->top + 13, pRect->width - 14,
    507             pRect->height - 18);
    508   FillSoildRect(pGraphics, 0xFFFFFFFF, &rtMin, pMatrix);
    509 }
    510 void CFWL_FormTP::DrawMaximizeBox(CFX_Graphics* pGraphics,
    511                                   const CFX_RectF* pRect,
    512                                   FWLTHEME_STATE eState,
    513                                   FX_BOOL bMax,
    514                                   CFX_Matrix* pMatrix,
    515                                   int32_t iActive) {
    516   DrawMinMaxBoxCommon(pGraphics, pRect, eState, pMatrix);
    517   FX_FLOAT fWidth = pRect->width;
    518   FX_FLOAT fHeight = pRect->height;
    519   if (bMax) {
    520     CFX_Path path;
    521     path.Create();
    522     path.AddLine(pRect->left + 7, pRect->top + 6, pRect->left + 14,
    523                  pRect->top + 6);
    524     path.AddLine(pRect->left + 4, pRect->top + 9, pRect->left + 11,
    525                  pRect->top + 9);
    526     pGraphics->SaveGraphState();
    527     pGraphics->SetLineWidth(2);
    528     CFX_Color crStroke(0xFFFFFFFF);
    529     pGraphics->SetStrokeColor(&crStroke);
    530     pGraphics->StrokePath(&path, pMatrix);
    531     pGraphics->SetLineWidth(1);
    532     path.Clear();
    533     path.AddLine(pRect->left + 4, pRect->top + 10, pRect->left + 4,
    534                  pRect->top + 14);
    535     path.AddLine(pRect->left + 10, pRect->top + 10, pRect->left + 10,
    536                  pRect->top + 14);
    537     path.AddLine(pRect->left + 13, pRect->top + 7, pRect->left + 13,
    538                  pRect->top + 11);
    539     path.AddLine(pRect->left + 4, pRect->top + 14, pRect->left + 10,
    540                  pRect->top + 14);
    541     path.AddLine(pRect->left + 12, pRect->top + 11, pRect->left + 12,
    542                  pRect->top + 11);
    543     pGraphics->StrokePath(&path, pMatrix);
    544     pGraphics->RestoreGraphState();
    545   } else {
    546     CFX_RectF rtMax(*pRect);
    547     rtMax.Inflate(-5, -5);
    548     CFX_Path path;
    549     path.Create();
    550     path.AddRectangle(pRect->left + 5, pRect->top + 5, fWidth - 10,
    551                       fHeight - 10);
    552     path.AddRectangle(pRect->left + 6, pRect->top + 8, fWidth - 12,
    553                       fHeight - 14);
    554     pGraphics->SaveGraphState();
    555     CFX_Color crFill(0xFFFFFFFF);
    556     pGraphics->SetFillColor(&crFill);
    557     pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
    558     pGraphics->RestoreGraphState();
    559   }
    560 }
    561 void CFWL_FormTP::DrawIconImage(CFX_Graphics* pGraphics,
    562                                 CFX_DIBitmap* pDIBitmap,
    563                                 const CFX_RectF* pRect,
    564                                 FWLTHEME_STATE eState,
    565                                 CFX_Matrix* pMatrix,
    566                                 int32_t iActive) {
    567   pGraphics->StretchImage(pDIBitmap, *pRect, pMatrix);
    568 }
    569 void CFWL_FormTP::SetThemeData(FX_DWORD dwID) {
    570   m_pThemeData->clrTransWhite = ArgbEncode(0x65, 255, 255, 255);
    571   m_pThemeData->clrCloseBtBKStart[0][0] = ArgbEncode(0xff, 240, 166, 148);
    572   m_pThemeData->clrCloseBtBKEnd[0][0] = ArgbEncode(0xff, 228, 61, 5);
    573   m_pThemeData->clrCloseBtBKStart[0][1] = ArgbEncode(0xff, 255, 184, 176);
    574   m_pThemeData->clrCloseBtBKEnd[0][1] = ArgbEncode(0xff, 252, 107, 71);
    575   m_pThemeData->clrCloseBtBKStart[0][2] = ArgbEncode(0xff, 141, 44, 20);
    576   m_pThemeData->clrCloseBtBKEnd[0][2] = ArgbEncode(0xff, 202, 72, 33);
    577   m_pThemeData->clrCloseBtEdgeLight[0][0] = ArgbEncode(0xff, 255, 122, 107);
    578   m_pThemeData->clrCloseBtEdgeDark[0][0] = ArgbEncode(0xff, 218, 77, 54);
    579   m_pThemeData->clrCloseBtEdgeLight[0][1] = ArgbEncode(0xff, 255, 93, 74);
    580   m_pThemeData->clrCloseBtEdgeDark[0][1] = ArgbEncode(0xff, 218, 74, 51);
    581   m_pThemeData->clrCloseBtEdgeLight[0][2] = ArgbEncode(0xff, 191, 61, 28);
    582   m_pThemeData->clrCloseBtEdgeDark[0][2] = ArgbEncode(0xff, 93, 30, 13);
    583   if (dwID) {
    584     m_pThemeData->clrHeadBK[0][0] = ArgbEncode(0xff, 194, 205, 149);
    585     m_pThemeData->clrHeadBK[0][1] = ArgbEncode(0xff, 170, 184, 131);
    586     m_pThemeData->clrHeadBK[0][2] = ArgbEncode(0xff, 168, 182, 128);
    587     m_pThemeData->clrHeadBK[0][3] = ArgbEncode(0xff, 194, 205, 149);
    588     m_pThemeData->clrHeadEdgeLeft[0][0] = ArgbEncode(0xff, 117, 141, 94);
    589     m_pThemeData->clrHeadEdgeLeft[0][1] = ArgbEncode(0xff, 139, 161, 105);
    590     m_pThemeData->clrHeadEdgeLeft[0][2] = ArgbEncode(0xff, 171, 189, 133);
    591     m_pThemeData->clrHeadEdgeRight[0][0] = ArgbEncode(0xff, 155, 175, 125);
    592     m_pThemeData->clrHeadEdgeRight[0][1] = ArgbEncode(0xff, 128, 146, 103);
    593     m_pThemeData->clrHeadEdgeRight[0][2] = ArgbEncode(0xff, 94, 118, 79);
    594     m_pThemeData->clrHeadEdgeTop[0][0] = ArgbEncode(0xff, 139, 161, 105);
    595     m_pThemeData->clrHeadEdgeTop[0][1] = ArgbEncode(0xff, 234, 245, 201);
    596     m_pThemeData->clrHeadEdgeTop[0][2] = ArgbEncode(0xff, 194, 205, 149);
    597     m_pThemeData->clrHeadEdgeBottom[0][0] = ArgbEncode(0xff, 175, 189, 133);
    598     m_pThemeData->clrHeadEdgeBottom[0][1] = ArgbEncode(0xff, 153, 168, 121);
    599     m_pThemeData->clrHeadEdgeBottom[0][2] = ArgbEncode(0xff, 150, 168, 103);
    600     m_pThemeData->clrNormalBtBKStart[0][0] = ArgbEncode(0xff, 182, 195, 162);
    601     m_pThemeData->clrNormalBtBKEnd[0][0] = ArgbEncode(0xff, 128, 144, 84);
    602     m_pThemeData->clrNormalBtBKStart[0][1] = ArgbEncode(0xff, 234, 241, 208);
    603     m_pThemeData->clrNormalBtBKEnd[0][1] = ArgbEncode(0xff, 169, 186, 112);
    604     m_pThemeData->clrNormalBtBKStart[0][2] = ArgbEncode(0xff, 199, 199, 190);
    605     m_pThemeData->clrNormalBtBKEnd[0][2] = ArgbEncode(0xff, 133, 148, 88);
    606     m_pThemeData->clrNormalBtEdgeLight[0][0] = ArgbEncode(0xff, 163, 176, 137);
    607     m_pThemeData->clrNormalBtEdgeDark[0][0] = ArgbEncode(0xff, 118, 135, 83);
    608     m_pThemeData->clrNormalBtEdgeLight[0][1] = ArgbEncode(0xff, 154, 174, 105);
    609     m_pThemeData->clrNormalBtEdgeDark[0][1] = ArgbEncode(0xff, 154, 174, 105);
    610     m_pThemeData->clrNormalBtEdgeLight[0][2] = ArgbEncode(0xff, 172, 193, 123);
    611     m_pThemeData->clrNormalBtEdgeDark[0][2] = ArgbEncode(0xff, 154, 174, 105);
    612     m_pThemeData->clrBtnCornerLight[0][0] = ArgbEncode(0xff, 220, 220, 220);
    613     m_pThemeData->clrBtnCornerLight[0][1] = ArgbEncode(0xff, 255, 255, 255);
    614     m_pThemeData->clrBtnCornerLight[0][2] = ArgbEncode(0xff, 225, 225, 225);
    615     m_pThemeData->clrBtnEdgeOut[0] = ArgbEncode(0xff, 255, 255, 255);
    616     m_pThemeData->clrFormBorder[0][0] = ArgbEncode(0xff, 117, 141, 94);
    617     m_pThemeData->clrFormBorder[0][1] = ArgbEncode(0xff, 139, 161, 105);
    618     m_pThemeData->clrFormBorder[0][2] = ArgbEncode(0xff, 171, 189, 133);
    619     m_pThemeData->clrFormBorder[0][3] = ArgbEncode(0xff, 164, 178, 127);
    620     m_pThemeData->clrFormBorder[0][4] = ArgbEncode(0xff, 255, 255, 255);
    621     m_pThemeData->clrFormBorderLight[0] = ArgbEncode(0xff, 171, 189, 133);
    622   } else {
    623     m_pThemeData->clrHeadBK[0][0] = ArgbEncode(0xff, 3, 114, 255);
    624     m_pThemeData->clrHeadBK[0][1] = ArgbEncode(0xff, 0, 85, 226);
    625     m_pThemeData->clrHeadBK[0][2] = ArgbEncode(0xff, 0, 85, 226);
    626     m_pThemeData->clrHeadBK[0][3] = ArgbEncode(0xff, 3, 114, 255);
    627     m_pThemeData->clrHeadEdgeLeft[0][2] = ArgbEncode(0xff, 0, 32, 200);
    628     m_pThemeData->clrHeadEdgeLeft[0][1] = ArgbEncode(0xff, 0, 61, 220);
    629     m_pThemeData->clrHeadEdgeLeft[0][0] = ArgbEncode(0xff, 0, 54, 210);
    630     m_pThemeData->clrHeadEdgeRight[0][0] = ArgbEncode(0xff, 0, 56, 234);
    631     m_pThemeData->clrHeadEdgeRight[0][1] = ArgbEncode(0xff, 0, 50, 193);
    632     m_pThemeData->clrHeadEdgeRight[0][2] = ArgbEncode(0xff, 0, 19, 139);
    633     m_pThemeData->clrHeadEdgeTop[0][0] = ArgbEncode(0xff, 0, 88, 238);
    634     m_pThemeData->clrHeadEdgeTop[0][1] = ArgbEncode(0xff, 63, 151, 255);
    635     m_pThemeData->clrHeadEdgeTop[0][2] = ArgbEncode(0xff, 3, 114, 255);
    636     m_pThemeData->clrHeadEdgeBottom[0][0] = ArgbEncode(0xff, 0, 96, 252);
    637     m_pThemeData->clrHeadEdgeBottom[0][1] = ArgbEncode(0xff, 63, 151, 255);
    638     m_pThemeData->clrHeadEdgeBottom[0][2] = ArgbEncode(0xff, 0, 67, 207);
    639     m_pThemeData->clrNormalBtBKStart[0][2] = ArgbEncode(0xff, 0, 49, 112);
    640     m_pThemeData->clrNormalBtBKEnd[0][2] = ArgbEncode(0xff, 0, 87, 188);
    641     m_pThemeData->clrNormalBtBKStart[0][0] = ArgbEncode(0xff, 154, 183, 250);
    642     m_pThemeData->clrNormalBtBKEnd[0][0] = ArgbEncode(0xff, 17, 110, 248);
    643     m_pThemeData->clrNormalBtBKStart[0][1] = ArgbEncode(0xff, 164, 194, 255);
    644     m_pThemeData->clrNormalBtBKEnd[0][1] = ArgbEncode(0xff, 29, 158, 255);
    645     m_pThemeData->clrNormalBtEdgeLight[0][0] = ArgbEncode(0xff, 68, 120, 245);
    646     m_pThemeData->clrNormalBtEdgeDark[0][0] = ArgbEncode(0xff, 24, 72, 187);
    647     m_pThemeData->clrNormalBtEdgeLight[0][1] = ArgbEncode(0xff, 72, 122, 245);
    648     m_pThemeData->clrNormalBtEdgeDark[0][1] = ArgbEncode(0xff, 35, 87, 195);
    649     m_pThemeData->clrNormalBtEdgeLight[0][2] = ArgbEncode(0xff, 60, 114, 244);
    650     m_pThemeData->clrNormalBtEdgeDark[0][2] = ArgbEncode(0xff, 21, 70, 185);
    651     m_pThemeData->clrBtnCornerLight[0][0] = ArgbEncode(0xff, 220, 220, 220);
    652     m_pThemeData->clrBtnCornerLight[0][1] = ArgbEncode(0xff, 255, 255, 255);
    653     m_pThemeData->clrBtnCornerLight[0][2] = ArgbEncode(0xff, 225, 225, 225);
    654     m_pThemeData->clrBtnEdgeOut[0] = ArgbEncode(0xff, 255, 255, 255);
    655     m_pThemeData->clrFormBorder[0][0] = ArgbEncode(0xff, 0, 72, 241);
    656     m_pThemeData->clrFormBorder[0][1] = ArgbEncode(0xff, 0, 61, 220);
    657     m_pThemeData->clrFormBorder[0][2] = ArgbEncode(0xff, 0, 30, 160);
    658     m_pThemeData->clrFormBorder[0][3] = ArgbEncode(0xff, 0, 19, 140);
    659     m_pThemeData->clrFormBorder[0][4] = ArgbEncode(0xff, 255, 255, 255);
    660     m_pThemeData->clrFormBorderLight[0] = ArgbEncode(0xff, 22, 106, 239);
    661   }
    662   m_pThemeData->clrCloseBtBKStart[1][0] = m_pThemeData->clrCloseBtBKStart[0][0];
    663   m_pThemeData->clrCloseBtBKEnd[1][0] = m_pThemeData->clrCloseBtBKEnd[0][0];
    664   m_pThemeData->clrCloseBtBKStart[1][1] = m_pThemeData->clrCloseBtBKStart[0][1];
    665   m_pThemeData->clrCloseBtBKEnd[1][1] = m_pThemeData->clrCloseBtBKEnd[0][1];
    666   m_pThemeData->clrCloseBtBKStart[1][2] = m_pThemeData->clrCloseBtBKStart[0][2];
    667   m_pThemeData->clrCloseBtBKEnd[1][2] = m_pThemeData->clrCloseBtBKEnd[0][2];
    668   m_pThemeData->clrCloseBtEdgeLight[1][0] =
    669       m_pThemeData->clrCloseBtEdgeLight[0][0];
    670   m_pThemeData->clrCloseBtEdgeDark[1][0] =
    671       m_pThemeData->clrCloseBtEdgeDark[0][0];
    672   m_pThemeData->clrCloseBtEdgeLight[1][1] =
    673       m_pThemeData->clrCloseBtEdgeLight[0][1];
    674   m_pThemeData->clrCloseBtEdgeDark[1][1] =
    675       m_pThemeData->clrCloseBtEdgeDark[0][1];
    676   m_pThemeData->clrCloseBtEdgeLight[1][2] =
    677       m_pThemeData->clrCloseBtEdgeLight[0][2];
    678   m_pThemeData->clrCloseBtEdgeDark[1][2] =
    679       m_pThemeData->clrCloseBtEdgeDark[0][2];
    680   m_pThemeData->clrHeadBK[1][0] = m_pThemeData->clrHeadBK[0][0];
    681   m_pThemeData->clrHeadBK[1][1] = m_pThemeData->clrHeadBK[0][1];
    682   m_pThemeData->clrHeadBK[1][2] = m_pThemeData->clrHeadBK[0][2];
    683   m_pThemeData->clrHeadBK[1][3] = m_pThemeData->clrHeadBK[0][3];
    684   m_pThemeData->clrHeadEdgeLeft[1][2] = m_pThemeData->clrHeadEdgeLeft[0][2];
    685   m_pThemeData->clrHeadEdgeLeft[1][1] = m_pThemeData->clrHeadEdgeLeft[0][1];
    686   m_pThemeData->clrHeadEdgeLeft[1][0] = m_pThemeData->clrHeadEdgeLeft[0][0];
    687   m_pThemeData->clrHeadEdgeRight[1][0] = m_pThemeData->clrHeadEdgeRight[0][0];
    688   m_pThemeData->clrHeadEdgeRight[1][1] = m_pThemeData->clrHeadEdgeRight[0][1];
    689   m_pThemeData->clrHeadEdgeRight[1][2] = m_pThemeData->clrHeadEdgeRight[0][2];
    690   m_pThemeData->clrHeadEdgeTop[1][0] = m_pThemeData->clrHeadEdgeTop[0][0];
    691   m_pThemeData->clrHeadEdgeTop[1][1] = m_pThemeData->clrHeadEdgeTop[0][1];
    692   m_pThemeData->clrHeadEdgeTop[1][2] = m_pThemeData->clrHeadEdgeTop[0][2];
    693   m_pThemeData->clrHeadEdgeBottom[1][0] = m_pThemeData->clrHeadEdgeBottom[0][0];
    694   m_pThemeData->clrHeadEdgeBottom[1][1] = m_pThemeData->clrHeadEdgeBottom[0][1];
    695   m_pThemeData->clrHeadEdgeBottom[1][2] = m_pThemeData->clrHeadEdgeBottom[0][2];
    696   m_pThemeData->clrNormalBtBKStart[1][2] =
    697       m_pThemeData->clrNormalBtBKStart[0][2];
    698   m_pThemeData->clrNormalBtBKEnd[1][2] = m_pThemeData->clrNormalBtBKEnd[0][2];
    699   m_pThemeData->clrNormalBtBKStart[1][0] =
    700       m_pThemeData->clrNormalBtBKStart[0][0];
    701   m_pThemeData->clrNormalBtBKEnd[1][0] = m_pThemeData->clrNormalBtBKEnd[1][0];
    702   m_pThemeData->clrNormalBtBKStart[1][1] =
    703       m_pThemeData->clrNormalBtBKStart[0][1];
    704   m_pThemeData->clrNormalBtBKEnd[1][1] = m_pThemeData->clrNormalBtBKEnd[0][1];
    705   m_pThemeData->clrNormalBtEdgeLight[1][0] =
    706       m_pThemeData->clrNormalBtEdgeLight[0][0];
    707   m_pThemeData->clrNormalBtEdgeDark[1][0] =
    708       m_pThemeData->clrNormalBtEdgeDark[0][0];
    709   m_pThemeData->clrNormalBtEdgeLight[1][1] =
    710       m_pThemeData->clrNormalBtEdgeLight[0][1];
    711   m_pThemeData->clrNormalBtEdgeDark[1][1] =
    712       m_pThemeData->clrNormalBtEdgeDark[0][1];
    713   m_pThemeData->clrNormalBtEdgeLight[1][2] =
    714       m_pThemeData->clrNormalBtEdgeLight[0][2];
    715   m_pThemeData->clrNormalBtEdgeDark[1][2] =
    716       m_pThemeData->clrNormalBtEdgeDark[0][2];
    717   m_pThemeData->clrBtnCornerLight[1][0] = m_pThemeData->clrBtnCornerLight[0][0];
    718   m_pThemeData->clrBtnCornerLight[1][1] = m_pThemeData->clrBtnCornerLight[0][1];
    719   m_pThemeData->clrBtnCornerLight[1][2] = m_pThemeData->clrBtnCornerLight[0][2];
    720   m_pThemeData->clrBtnEdgeOut[1] = m_pThemeData->clrBtnEdgeOut[0];
    721   m_pThemeData->clrFormBorder[1][0] = m_pThemeData->clrFormBorder[0][0];
    722   m_pThemeData->clrFormBorder[1][1] = m_pThemeData->clrFormBorder[0][1];
    723   m_pThemeData->clrFormBorder[1][2] = m_pThemeData->clrFormBorder[0][2];
    724   m_pThemeData->clrFormBorder[1][3] = m_pThemeData->clrFormBorder[0][3];
    725   m_pThemeData->clrFormBorder[1][4] = m_pThemeData->clrFormBorder[0][4];
    726   m_pThemeData->clrFormBorderLight[1] = m_pThemeData->clrFormBorderLight[0];
    727   DeactiveForm();
    728 }
    729 void CFWL_FormTP::DeactiveForm() {
    730   TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][0]);
    731   TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][1]);
    732   TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][2]);
    733   TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][3]);
    734   TransModeColor(m_pThemeData->clrTransWhite,
    735                  m_pThemeData->clrHeadEdgeLeft[1][0]);
    736   TransModeColor(m_pThemeData->clrTransWhite,
    737                  m_pThemeData->clrHeadEdgeLeft[1][1]);
    738   TransModeColor(m_pThemeData->clrTransWhite,
    739                  m_pThemeData->clrHeadEdgeLeft[1][2]);
    740   TransModeColor(m_pThemeData->clrTransWhite,
    741                  m_pThemeData->clrHeadEdgeRight[1][0]);
    742   TransModeColor(m_pThemeData->clrTransWhite,
    743                  m_pThemeData->clrHeadEdgeRight[1][1]);
    744   TransModeColor(m_pThemeData->clrTransWhite,
    745                  m_pThemeData->clrHeadEdgeRight[1][2]);
    746   TransModeColor(m_pThemeData->clrTransWhite,
    747                  m_pThemeData->clrHeadEdgeTop[1][0]);
    748   TransModeColor(m_pThemeData->clrTransWhite,
    749                  m_pThemeData->clrHeadEdgeTop[1][1]);
    750   TransModeColor(m_pThemeData->clrTransWhite,
    751                  m_pThemeData->clrHeadEdgeTop[1][2]);
    752   TransModeColor(m_pThemeData->clrTransWhite,
    753                  m_pThemeData->clrHeadEdgeBottom[1][0]);
    754   TransModeColor(m_pThemeData->clrTransWhite,
    755                  m_pThemeData->clrHeadEdgeBottom[1][1]);
    756   TransModeColor(m_pThemeData->clrTransWhite,
    757                  m_pThemeData->clrHeadEdgeBottom[1][2]);
    758   TransModeColor(m_pThemeData->clrTransWhite,
    759                  m_pThemeData->clrNormalBtBKStart[1][0]);
    760   TransModeColor(m_pThemeData->clrTransWhite,
    761                  m_pThemeData->clrNormalBtBKStart[1][1]);
    762   TransModeColor(m_pThemeData->clrTransWhite,
    763                  m_pThemeData->clrNormalBtBKStart[1][2]);
    764   TransModeColor(m_pThemeData->clrTransWhite,
    765                  m_pThemeData->clrNormalBtBKEnd[1][0]);
    766   TransModeColor(m_pThemeData->clrTransWhite,
    767                  m_pThemeData->clrNormalBtBKEnd[1][1]);
    768   TransModeColor(m_pThemeData->clrTransWhite,
    769                  m_pThemeData->clrNormalBtBKEnd[1][2]);
    770   TransModeColor(m_pThemeData->clrTransWhite,
    771                  m_pThemeData->clrNormalBtEdgeLight[1][0]);
    772   TransModeColor(m_pThemeData->clrTransWhite,
    773                  m_pThemeData->clrNormalBtEdgeLight[1][1]);
    774   TransModeColor(m_pThemeData->clrTransWhite,
    775                  m_pThemeData->clrNormalBtEdgeLight[1][2]);
    776   TransModeColor(m_pThemeData->clrTransWhite,
    777                  m_pThemeData->clrNormalBtEdgeDark[1][0]);
    778   TransModeColor(m_pThemeData->clrTransWhite,
    779                  m_pThemeData->clrNormalBtEdgeDark[1][1]);
    780   TransModeColor(m_pThemeData->clrTransWhite,
    781                  m_pThemeData->clrNormalBtEdgeDark[1][2]);
    782   TransModeColor(m_pThemeData->clrTransWhite,
    783                  m_pThemeData->clrBtnCornerLight[1][0]);
    784   TransModeColor(m_pThemeData->clrTransWhite,
    785                  m_pThemeData->clrBtnCornerLight[1][1]);
    786   TransModeColor(m_pThemeData->clrTransWhite,
    787                  m_pThemeData->clrBtnCornerLight[1][2]);
    788   TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrBtnEdgeOut[1]);
    789   TransModeColor(m_pThemeData->clrTransWhite,
    790                  m_pThemeData->clrFormBorder[1][0]);
    791   TransModeColor(m_pThemeData->clrTransWhite,
    792                  m_pThemeData->clrFormBorder[1][1]);
    793   TransModeColor(m_pThemeData->clrTransWhite,
    794                  m_pThemeData->clrFormBorder[1][2]);
    795   TransModeColor(m_pThemeData->clrTransWhite,
    796                  m_pThemeData->clrFormBorder[1][3]);
    797   TransModeColor(m_pThemeData->clrTransWhite,
    798                  m_pThemeData->clrFormBorder[1][4]);
    799   TransModeColor(m_pThemeData->clrTransWhite,
    800                  m_pThemeData->clrFormBorderLight[1]);
    801   TransModeColor(m_pThemeData->clrTransWhite,
    802                  m_pThemeData->clrCloseBtBKStart[1][0]);
    803   TransModeColor(m_pThemeData->clrTransWhite,
    804                  m_pThemeData->clrCloseBtBKStart[1][1]);
    805   TransModeColor(m_pThemeData->clrTransWhite,
    806                  m_pThemeData->clrCloseBtBKStart[1][2]);
    807   TransModeColor(m_pThemeData->clrTransWhite,
    808                  m_pThemeData->clrCloseBtBKEnd[1][0]);
    809   TransModeColor(m_pThemeData->clrTransWhite,
    810                  m_pThemeData->clrCloseBtBKEnd[1][1]);
    811   TransModeColor(m_pThemeData->clrTransWhite,
    812                  m_pThemeData->clrCloseBtBKEnd[1][2]);
    813   TransModeColor(m_pThemeData->clrTransWhite,
    814                  m_pThemeData->clrCloseBtEdgeLight[1][0]);
    815   TransModeColor(m_pThemeData->clrTransWhite,
    816                  m_pThemeData->clrCloseBtEdgeLight[1][1]);
    817   TransModeColor(m_pThemeData->clrTransWhite,
    818                  m_pThemeData->clrCloseBtEdgeLight[1][2]);
    819   TransModeColor(m_pThemeData->clrTransWhite,
    820                  m_pThemeData->clrCloseBtEdgeDark[1][0]);
    821   TransModeColor(m_pThemeData->clrTransWhite,
    822                  m_pThemeData->clrCloseBtEdgeDark[1][1]);
    823   TransModeColor(m_pThemeData->clrTransWhite,
    824                  m_pThemeData->clrCloseBtEdgeDark[1][2]);
    825 }
    826 void CFWL_FormTP::TransModeColor(FX_ARGB clrFore, FX_ARGB& clrBack) {
    827   int32_t iAlfaF, iRF, iGF, iBF;
    828   int32_t iAlfaB, iRB, iGB, iBB;
    829   ArgbDecode(clrFore, iAlfaF, iRF, iGF, iBF);
    830   ArgbDecode(clrBack, iAlfaB, iRB, iGB, iBB);
    831   clrBack = ArgbEncode(0xff, iRB + (iRF - iRB) * iAlfaF / 255,
    832                        iGB + (iGF - iGB) * iAlfaF / 255,
    833                        iBB + (iBF - iBB) * iAlfaF / 255);
    834 }
    835 void CFWL_FormTP::InitCaption(FX_BOOL bActive) {
    836   if (bActive) {
    837     CFX_FxgeDevice dev;
    838     CFX_Graphics gs;
    839     CFX_Path path;
    840     path.Create();
    841     if (m_pActiveBitmap) {
    842       delete m_pActiveBitmap;
    843       m_pActiveBitmap = NULL;
    844     }
    845     m_pActiveBitmap = new CFX_DIBitmap;
    846     m_pActiveBitmap->Create(1, FWLTHEME_CAPACITY_CYCaption, FXDIB_Argb);
    847     dev.Attach(m_pActiveBitmap);
    848     gs.Create(&dev);
    849     path.AddRectangle(0, 0, 1, 5);
    850     DrawAxialShading(&gs, 0, 0, 0, 5, m_pThemeData->clrHeadBK[0][0],
    851                      m_pThemeData->clrHeadBK[0][1], &path);
    852     path.Clear();
    853     path.AddRectangle(0, 5, 1, 15);
    854     DrawAxialShading(&gs, 0, 5, 0, 20, m_pThemeData->clrHeadBK[0][1],
    855                      m_pThemeData->clrHeadBK[0][2], &path);
    856     path.Clear();
    857     path.AddRectangle(0, 20, 1, FWLTHEME_CAPACITY_CYCaption - 19);
    858     DrawAxialShading(&gs, 0, 20, 0, FWLTHEME_CAPACITY_CYCaption,
    859                      m_pThemeData->clrHeadBK[0][2],
    860                      m_pThemeData->clrHeadBK[0][3], &path);
    861   } else {
    862     CFX_FxgeDevice dev;
    863     CFX_Graphics gs;
    864     CFX_Path path;
    865     path.Create();
    866     if (m_pDeactivebitmap) {
    867       delete m_pDeactivebitmap;
    868       m_pDeactivebitmap = NULL;
    869     }
    870     m_pDeactivebitmap = new CFX_DIBitmap;
    871     m_pDeactivebitmap->Create(1, FWLTHEME_CAPACITY_CYCaption, FXDIB_Argb);
    872     dev.Attach(m_pDeactivebitmap);
    873     gs.Create(&dev);
    874     path.AddRectangle(0, 0, 1, 5);
    875     DrawAxialShading(&gs, 0, 0, 0, 5, m_pThemeData->clrHeadBK[1][0],
    876                      m_pThemeData->clrHeadBK[1][1], &path);
    877     path.Clear();
    878     path.AddRectangle(0, 5, 1, 15);
    879     DrawAxialShading(&gs, 0, 5, 0, 20, m_pThemeData->clrHeadBK[1][1],
    880                      m_pThemeData->clrHeadBK[1][2], &path);
    881     path.Clear();
    882     path.AddRectangle(0, 20, 1, FWLTHEME_CAPACITY_CYCaption - 19);
    883     DrawAxialShading(&gs, 0, 20, 0, FWLTHEME_CAPACITY_CYCaption,
    884                      m_pThemeData->clrHeadBK[1][2],
    885                      m_pThemeData->clrHeadBK[1][3], &path);
    886   }
    887 }
    888