ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

advappdlg.c
Go to the documentation of this file.
00001 /* $Id: advappdlg.c 24836 2007-02-12 03:12:56Z tkreuzer $
00002  *
00003  * COPYRIGHT:       See COPYING in the top level directory
00004  * PROJECT:         ReactOS Display Control Panel
00005  * FILE:            dll/cpl/desk/advappdlg.c
00006  * PURPOSE:         Advanced appearance dialog
00007  *
00008  * PROGRAMMER:      Timo Kreuzer (timo[dot]kreuzer[at]web[dot]de)
00009  *
00010  */
00011 
00012 #include "desk.h"
00013 
00014 /******************************************************************************/
00015 
00016 typedef struct
00017 {
00018     int Size;
00019     int Size2;
00020     int Color1;
00021     int Color2;
00022     int Font;
00023     int FontColor;
00024 } ASSIGNMENT;
00025 
00026 /* This const assigns the color and metric numbers to the elements from the elements list */
00027 
00028 /* Size 1 (width)   Size 2 (height) Color 1                 Color 2                         Font            Fontcolor */
00029 const ASSIGNMENT g_Assignment[NUM_ELEMENTS] =
00030 { {-1,              -1,             COLOR_DESKTOP,          -1,                             -1,             -1},                /* -Desktop */
00031   {SIZE_CAPTION_Y,  -1,             COLOR_INACTIVECAPTION,  COLOR_GRADIENTINACTIVECAPTION,  FONT_CAPTION,   -1},                /* inactive window caption */
00032   {SIZE_BORDER_X,   SIZE_BORDER_Y,  COLOR_INACTIVEBORDER,   -1,                             -1,             -1},                /* inactive window border */
00033   {SIZE_CAPTION_Y,  -1,             COLOR_ACTIVECAPTION,    COLOR_GRADIENTACTIVECAPTION,    FONT_CAPTION,   COLOR_CAPTIONTEXT}, /* -active window caption */
00034   {SIZE_BORDER_X,   SIZE_BORDER_Y,  COLOR_ACTIVEBORDER,     -1,                             -1,             -1},                /* active window border */
00035   {SIZE_MENU_SIZE_X,SIZE_MENU_Y,    COLOR_MENU,             -1,                             FONT_MENU,      COLOR_MENUTEXT},    /* menu */
00036   {SIZE_MENU_SIZE_X,SIZE_MENU_Y,    COLOR_HIGHLIGHT,        -1,                             FONT_HILIGHT,   COLOR_HIGHLIGHTTEXT},/* marked element */
00037   {-1,              -1,             COLOR_WINDOW,           -1 /*COLOR_WINDOWFRAME*/,               -1,             COLOR_WINDOWTEXT},  /* window */
00038   {SIZE_SCROLL_X,   SIZE_SCROLL_Y,  COLOR_SCROLLBAR,        -1,                             -1,             -1},                /* scroll bar */
00039   {-1,              -1,             COLOR_3DFACE,           -1,                             -1,             COLOR_BTNTEXT},     /* 3d objects */
00040   {SIZE_SMCAPTION_Y,-1,             -1,                     -1,                             FONT_SMCAPTION, -1},                /* palette window caption */
00041   {-1,              -1,             -1,                     -1,                             -1,             -1},                /* symbol caption FIXME: Access? */
00042   {SIZE_CAPTION_Y,  -1,             -1,                     -1,                             -1,             -1},                /* caption bar */
00043   {-1,              -1,             -1,                     -1,                             -1,             COLOR_GRAYTEXT},    /* inactive menu item FIXME: Access? */
00044   {-1,              -1,             -1,                     -1,                             FONT_DIALOG,    COLOR_WINDOWTEXT},  /* dialog */
00045   {-1,              -1,             -1,                     -1,                             -1,             -1},                /* scrollbar controls FIXME: Access? */
00046   {-1,              -1,             COLOR_APPWORKSPACE,     -1,                             -1,             -1},                /* application background */
00047   {-1,              -1,             -1,                     -1,                             -1,             -1},                /* small caption bar FIXME: Access? */
00048   {SIZE_ICON_SPC_X, -1,             -1,                     -1,                             -1,             -1},                /* symbol distance horiz. */
00049   {SIZE_ICON_SPC_Y, -1,             -1,                     -1,                             -1,             -1},                /* symbol distance vert. */
00050   {-1,              -1,             COLOR_INFOBK,           -1,                             FONT_INFO,      COLOR_INFOTEXT},    /* quickinfo */
00051   {SIZE_ICON_X,     SIZE_ICON_Y,    -1,                     -1,                             FONT_ICON,      -1}};               /* symbol */
00052 
00053 /******************************************************************************/
00054 
00055 /* Draw the current color on the color picker buttons */
00056 static VOID
00057 UpdateButtonColor(HWND hwndDlg, GLOBALS* g, INT ID, INT nButton, INT nColor)
00058 {
00059     HDC hdcColorButton, hdcCompat;
00060     RECT rect;
00061     HBRUSH hbrush;
00062     HWND hwndColorButton;
00063     HGDIOBJ hgdiTmp;
00064 
00065     if (nColor != -1)
00066     {
00067         /* Create a DC to draw on */
00068         hwndColorButton = GetDlgItem(hwndDlg, ID);
00069         hdcColorButton = GetDC(hwndColorButton);
00070         hdcCompat = CreateCompatibleDC(hdcColorButton);
00071         ReleaseDC(hwndColorButton, hdcColorButton);
00072 
00073         /* Select the button image to it */
00074         hgdiTmp = SelectObject(hdcCompat, g->hbmpColor[nButton]);
00075 
00076         /* Create a brush and draw the rectangle */
00077         rect.left = 2;
00078         rect.top = 2;
00079         rect.right = 22;
00080         rect.bottom = 13;
00081         hbrush = CreateSolidBrush(g->SchemeAdv.crColor[nColor]);
00082         FillRect(hdcCompat, &rect, hbrush);
00083         DeleteObject(hbrush);
00084 
00085         /* hdcCompat is not needed anymore */
00086         SelectObject(hdcCompat,hgdiTmp);
00087         DeleteDC(hdcCompat);
00088 
00089         SendDlgItemMessage(hwndDlg, ID, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)g->hbmpColor[nButton]);
00090         EnableWindow(GetDlgItem(hwndDlg, ID), TRUE);
00091     }
00092     else
00093     {
00094         SendDlgItemMessage(hwndDlg, ID, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)NULL);
00095         EnableWindow(GetDlgItem(hwndDlg, ID), FALSE);
00096     }
00097 }
00098 
00099 
00100 /* Create the basic bitmaps for the color picker buttons */
00101 static VOID
00102 InitColorButtons(HWND hwndDlg, GLOBALS* g)
00103 {
00104     INT i;
00105     HDC hdcColorButton, hdcCompat;
00106     RECT rect;
00107     HBRUSH hbrush;
00108     HPEN hPen;
00109     HWND hwndColorButton;
00110     HGDIOBJ hgdiTemp;
00111     COLOR_SCHEME *scheme = &g->SchemeAdv;
00112 
00113     const POINT Points[3] = {{29,6},{33,6},{31,8}};
00114 
00115     hwndColorButton = GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_COLOR1_B);
00116     hdcColorButton = GetDC(hwndColorButton);
00117     for (i = 0; i <= 2; i++)
00118     {
00119         /* Create a DC to draw on */
00120         hdcCompat = CreateCompatibleDC(hdcColorButton);
00121 
00122         /* Create the button image */
00123         g->hbmpColor[i] = CreateCompatibleBitmap(hdcColorButton, 36, 15);
00124 
00125         /* Select the button image to the DC */
00126         hgdiTemp = SelectObject(hdcCompat, g->hbmpColor[i]);
00127 
00128         /* Draw the buttons background color */
00129         rect.left = 0;
00130         rect.top = 0;
00131         rect.right = 36;
00132         rect.bottom = 15;
00133         hbrush = CreateSolidBrush(scheme->crColor[COLOR_BTNFACE]);
00134         FillRect(hdcCompat, &rect, hbrush);
00135         DeleteObject(hbrush);
00136 
00137         /* Draw the rectangle */
00138         rect.left = 1;
00139         rect.top = 1;
00140         rect.right = 23;
00141         rect.bottom = 14;
00142         hbrush = CreateSolidBrush(scheme->crColor[COLOR_BTNTEXT]);
00143         FillRect(hdcCompat, &rect, hbrush);
00144         DeleteObject(hbrush);
00145 
00146         /* Draw left side of line */
00147         hPen = CreatePen(PS_SOLID, 1, scheme->crColor[COLOR_BTNSHADOW]);
00148         SelectObject(hdcCompat, hPen);
00149         MoveToEx(hdcCompat, 26, 1, NULL);
00150         LineTo(hdcCompat, 26, 14);
00151         SelectObject(hdcCompat, GetStockObject(BLACK_PEN));
00152         DeleteObject(hPen);
00153 
00154         /* Draw right side of line */
00155         hPen = CreatePen(PS_SOLID, 1, scheme->crColor[COLOR_BTNHIGHLIGHT]);
00156         SelectObject(hdcCompat,hPen);
00157         MoveToEx(hdcCompat, 27, 1, NULL);
00158         LineTo(hdcCompat, 27, 14);
00159         SelectObject(hdcCompat, GetStockObject(BLACK_PEN));
00160         DeleteObject(hPen);
00161 
00162         /* Draw triangle */
00163         hPen = CreatePen(PS_SOLID, 1, scheme->crColor[COLOR_BTNTEXT]);
00164         hbrush = CreateSolidBrush(scheme->crColor[COLOR_BTNTEXT]);
00165         SelectObject(hdcCompat, hPen);
00166         SelectObject(hdcCompat, hbrush);
00167         SetPolyFillMode(hdcCompat, WINDING);
00168 
00169         /* FIXME: HACK, see Points definition */
00170         Polygon(hdcCompat, Points, 3);
00171 
00172         /* Cleanup */
00173         SelectObject(hdcCompat,hgdiTemp);
00174         DeleteDC(hdcCompat);
00175         DeleteObject(hPen);
00176         DeleteObject(hbrush);
00177     }
00178 
00179     ReleaseDC(hwndColorButton, hdcColorButton);
00180 
00181     /* Set the images of the buttons */
00182     SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_COLOR1_B, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)g->hbmpColor[0]);
00183     SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_COLOR2_B, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)g->hbmpColor[1]);
00184     SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTCOLOR_B, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)g->hbmpColor[2]);
00185 }
00186 
00187 
00188 /* This is the callback function to add the installed fonts to the font combo */
00189 static int CALLBACK
00190 EnumFontFamExProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, DWORD dwFontType, LPARAM lParam)
00191 {
00192     /* Don't enumerate more than 100 fonts */
00193     if (SendMessage((HWND)lParam, CB_GETCOUNT, 0, 0) >= 100)
00194         return 0;
00195 
00196     /* Only add the string once */
00197     if (SendMessage((HWND)lParam, CB_FINDSTRINGEXACT, -1, (WPARAM)&(lpelfe->elfLogFont.lfFaceName)) != CB_ERR)
00198         return 2;
00199 
00200     SendMessage((HWND)lParam, CB_ADDSTRING, 0, (WPARAM)&(lpelfe->elfLogFont.lfFaceName));
00201 
00202     return 1;
00203 }
00204 
00205 
00206 /* Update all the controls with the current values for the selected screen element */
00207 static VOID
00208 UpdateControls(HWND hwndDlg, GLOBALS *g)
00209 {
00210     INT iElement;
00211     HDC hdcDlg;
00212 
00213     iElement = g->CurrentElement;
00214 
00215     /* First enable / disable the controls */
00216     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E), (g_Assignment[iElement].Size != -1));
00217     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD), (g_Assignment[iElement].Size != -1));
00218     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_T), (g_Assignment[iElement].Size != -1));
00219     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_COLOR1_T), (g_Assignment[iElement].Color1 != -1));
00220     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_COLOR2_T), (g_Assignment[iElement].Color2 != -1));
00221     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONT_T), (g_Assignment[iElement].Font != -1));
00222     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONT_C), (g_Assignment[iElement].Font != -1));
00223     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_T), (g_Assignment[iElement].Font != -1));
00224     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E), (g_Assignment[iElement].Font != -1));
00225     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTCOLOR_T), (g_Assignment[iElement].FontColor != -1));
00226     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD), (g_Assignment[iElement].Font != -1));
00227     EnableWindow(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC), (g_Assignment[iElement].Font != -1));
00228 
00229     /* Update the colors of the color buttons */
00230     UpdateButtonColor(hwndDlg, g, IDC_ADVAPPEARANCE_COLOR1_B, 0, g_Assignment[iElement].Color1);
00231     UpdateButtonColor(hwndDlg, g, IDC_ADVAPPEARANCE_COLOR2_B, 1, g_Assignment[iElement].Color2);
00232     UpdateButtonColor(hwndDlg, g, IDC_ADVAPPEARANCE_FONTCOLOR_B, 2, g_Assignment[iElement].FontColor);
00233 
00234     if (g_Assignment[iElement].Size != -1)
00235         SetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, g->SchemeAdv.Size[g_Assignment[iElement].Size], FALSE);
00236     else
00237         SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, TEXT(""));
00238 
00239     hdcDlg = GetDC(hwndDlg);
00240     if (g_Assignment[iElement].Font != -1)
00241     {
00242         LOGFONT lfFont = g->SchemeAdv.lfFont[g_Assignment[iElement].Font];
00243 
00244         SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, lfFont.lfFaceName);
00245         SetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, -MulDiv(g->SchemeAdv.lfFont[g_Assignment[iElement].Font].lfHeight, 72, GetDeviceCaps(hdcDlg, LOGPIXELSY)),FALSE);
00246         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, CB_FINDSTRINGEXACT, -1, (WPARAM)lfFont.lfFaceName);
00247         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_SETCHECK, g->SchemeAdv.lfFont[g_Assignment[iElement].Font].lfWeight == FW_BOLD?1:0, 0);
00248         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_SETCHECK, g->SchemeAdv.lfFont[g_Assignment[iElement].Font].lfItalic, 0);
00249     }
00250     else
00251     {
00252         SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, NULL);
00253         SetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, NULL);
00254         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_SETCHECK, 0, 0);
00255         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_SETCHECK, 0, 0);
00256     }
00257 
00258     ReleaseDC(hwndDlg, hdcDlg);
00259 }
00260 
00261 
00262 static VOID
00263 SaveCurrentValues(HWND hwndDlg, GLOBALS *g)
00264 {
00265     BOOL bTranslated;
00266     HDC hdcDlg = GetDC(hwndDlg);
00267 
00268     if (g_Assignment[g->CurrentElement].Size != -1)
00269     {
00270         g->SchemeAdv.Size[g_Assignment[g->CurrentElement].Size] = GetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_SIZE_E, &bTranslated, FALSE);
00271     }
00272 
00273     if (g_Assignment[g->CurrentElement].Font != -1)
00274     {
00275         g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight = -MulDiv(GetDlgItemInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, &bTranslated, FALSE), GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
00276         g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfWeight = (SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0) == 1) ? FW_BOLD : FW_NORMAL;
00277         g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfItalic = (BYTE)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0);
00278         GetDlgItemText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C, g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfFaceName, LF_FACESIZE * sizeof(TCHAR));
00279     }
00280 
00281     ReleaseDC(hwndDlg, hdcDlg);
00282 }
00283 
00284 
00285 /* Select a color using a color picker */
00286 static BOOL
00287 GetColor(HWND hwndDlg, GLOBALS* g, INT nButton)
00288 {
00289     CHOOSECOLOR cc;
00290     COLORREF crCustom[16] = { 0 };
00291     COLORREF crColor;
00292     INT ID = 0;
00293     INT ColorIndex = 0;
00294 
00295     /* Get the color index from the element index and button number */
00296     switch (nButton)
00297     {
00298         case 0:
00299             ColorIndex = g_Assignment[g->CurrentElement].Color1;
00300             ID = IDC_ADVAPPEARANCE_COLOR1_B;
00301             break;
00302 
00303         case 1:
00304             ColorIndex = g_Assignment[g->CurrentElement].Color2;
00305             ID = IDC_ADVAPPEARANCE_COLOR2_B;
00306             break;
00307 
00308         case 2:
00309             ColorIndex = g_Assignment[g->CurrentElement].FontColor;
00310             ID = IDC_ADVAPPEARANCE_FONTCOLOR_B;
00311             break;
00312     }
00313 
00314     crColor = g->SchemeAdv.crColor[ColorIndex];
00315 
00316     /* Prepare cc structure */
00317     cc.lStructSize = sizeof(CHOOSECOLOR);
00318     cc.hwndOwner = hwndDlg;
00319     cc.hInstance = NULL;
00320     cc.rgbResult = crColor;
00321     cc.lpCustColors = crCustom;
00322     cc.Flags = CC_ANYCOLOR | CC_FULLOPEN | CC_RGBINIT;
00323     cc.lCustData = 0;
00324     cc.lpfnHook = NULL;
00325     cc.lpTemplateName = NULL;
00326 
00327     /* Create the colorpicker */
00328     if (ChooseColor(&cc))
00329     {
00330         g->SchemeAdv.crColor[ColorIndex] = cc.rgbResult;
00331         if (crColor != cc.rgbResult)
00332         {
00333             UpdateButtonColor(hwndDlg, g, ID, nButton, ColorIndex);
00334             SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00335             return TRUE;
00336         }
00337     }
00338 
00339     return FALSE;
00340 }
00341 
00342 
00343 /* Initialize the advanced appearance dialog */
00344 static VOID
00345 AdvAppearanceDlg_Init(HWND hwndDlg, GLOBALS *g)
00346 {
00347     INT i, iElement, iListIndex, iDeskIndex = 0;
00348     TCHAR tstrText[80];
00349     LOGFONT lfFont;
00350     LOGFONT lfButtonFont;
00351     HFONT hMyFont;
00352     HDC hScreenDC;
00353     TCHAR Size[4];
00354 
00355     /* Copy the current theme values */
00356     g->SchemeAdv = g->Scheme;
00357 
00358     SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00359 
00360 
00361     /* Add the elements to the combo */
00362     for (iElement = 0; iElement < NUM_ELEMENTS; iElement++)
00363     {
00364         LoadString(hApplet, IDS_ELEMENT_1 + iElement, (LPTSTR)&tstrText, 79);
00365         iListIndex = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_ADDSTRING, 0, (LPARAM)&tstrText);
00366         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_SETITEMDATA, (WPARAM)iListIndex, (LPARAM)iElement);
00367     }
00368 
00369     /* Get the list index of the desktop element */
00370     for (iListIndex = 0; iListIndex < NUM_ELEMENTS; iListIndex++)
00371     {
00372         iElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, (WPARAM)iListIndex, 0);
00373         if (iElement == 0)
00374         {
00375             iDeskIndex = iListIndex;
00376             break;
00377         }
00378     }
00379 
00380     SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_SETCURSEL, iDeskIndex, 0);
00381 
00382     /* Create font for bold button */
00383     lfButtonFont = g->Scheme.lfFont[FONT_DIALOG];
00384     lfButtonFont.lfWeight = FW_BOLD;
00385     lfButtonFont.lfItalic = FALSE;
00386     hMyFont = CreateFontIndirect(&lfButtonFont);
00387     if (hMyFont)
00388     {
00389         if (g->hBoldFont)
00390             DeleteObject(g->hBoldFont);
00391 
00392         g->hBoldFont = hMyFont;
00393     }
00394 
00395     /* Create font for italic button */
00396     lfButtonFont.lfWeight = FW_REGULAR;
00397     lfButtonFont.lfItalic = TRUE;
00398     hMyFont = CreateFontIndirect(&lfButtonFont);
00399     if (hMyFont)
00400     {
00401         if (g->hItalicFont)
00402             DeleteObject(g->hItalicFont);
00403 
00404         g->hItalicFont = hMyFont;
00405     }
00406 
00407     /* Set the fonts for the font style buttons */
00408     SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, WM_SETFONT, (WPARAM)g->hBoldFont, (LPARAM)TRUE);
00409     SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, WM_SETFONT, (WPARAM)g->hItalicFont, (LPARAM)TRUE);
00410 
00411     /* Draw Bitmaps for the colorbuttons */
00412     InitColorButtons(hwndDlg, g);
00413 
00414     /* Make the UpDown control count correctly */
00415     SendMessage(GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD), UDM_SETRANGE, 0L, MAKELONG (200, 1));
00416 
00417     /* Fill font selection combo */
00418     lfFont.lfCharSet = DEFAULT_CHARSET;
00419     lfFont.lfFaceName[0] = (TCHAR)0;
00420     lfFont.lfPitchAndFamily = 0;
00421     hScreenDC = GetDC(0);
00422     EnumFontFamiliesEx(hScreenDC, &lfFont, (FONTENUMPROC)EnumFontFamExProc, (LPARAM)GetDlgItem(hwndDlg, IDC_ADVAPPEARANCE_FONT_C), 0);
00423     ReleaseDC(0, hScreenDC);
00424 
00425     /* Fill font size combo */
00426     for (i = 6; i <= 24; i++)
00427     {
00428         wsprintf(Size, TEXT("%d"), i);
00429         SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E, CB_ADDSTRING, 0, (LPARAM)&Size);
00430     }
00431 
00432     /* Update the controls */
00433     iListIndex = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETCURSEL, 0, 0);
00434     g->CurrentElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, (WPARAM)iListIndex, 0);
00435     UpdateControls(hwndDlg, g);
00436 }
00437 
00438 
00439 static VOID
00440 AdvAppearanceDlg_CleanUp(HWND hwndDlg, GLOBALS* g)
00441 {
00442     DeleteObject(g->hBoldFont);
00443     DeleteObject(g->hItalicFont);
00444 }
00445 
00446 
00447 static VOID
00448 SelectComboByElement(HWND hwnd, INT id, LPARAM lParam)
00449 {
00450     INT nCount;
00451     INT i;
00452 
00453     nCount = SendDlgItemMessage(hwnd, id, CB_GETCOUNT, 0, 0);
00454     if (nCount == CB_ERR)
00455         return;
00456 
00457     for (i = 0; i < nCount; i++)
00458     {
00459         if (SendDlgItemMessage(hwnd, id, CB_GETITEMDATA, (WPARAM)i, 0) == lParam)
00460         {
00461             SendDlgItemMessage(hwnd, id, CB_SETCURSEL, (WPARAM)i, 0);
00462             break;
00463         }
00464     }
00465 }
00466 
00467 
00468 static VOID
00469 GetSelectedComboText(HWND hwnd, INT id, LPWSTR lpStr)
00470 {
00471     INT nCount;
00472 
00473     nCount = SendDlgItemMessage(hwnd, id, CB_GETCURSEL, 0, 0);
00474     if (nCount == CB_ERR)
00475     {
00476         *lpStr = 0;
00477         return;
00478     }
00479 
00480     nCount = SendDlgItemMessage(hwnd, id, CB_GETLBTEXT, (WPARAM)nCount, (LPARAM)lpStr);
00481     if (nCount == CB_ERR)
00482     {
00483         *lpStr = 0;
00484     }
00485 }
00486 
00487 
00488 static INT
00489 GetSelectedComboInt(HWND hwnd, INT id)
00490 {
00491     TCHAR szBuffer[80];
00492     INT nCount;
00493 
00494     nCount = SendDlgItemMessage(hwnd, id, CB_GETCURSEL, 0, 0);
00495     if (nCount == CB_ERR)
00496         return 0;
00497 
00498     nCount = SendDlgItemMessage(hwnd, id, CB_GETLBTEXT, (WPARAM)nCount, (LPARAM)szBuffer);
00499     if (nCount == CB_ERR)
00500         return 0;
00501 
00502     return _ttoi(szBuffer);
00503 }
00504 
00505 
00506 static INT
00507 GetEditedComboInt(HWND hwnd, INT id)
00508 {
00509     INT nCount;
00510     BOOL bTranslated;
00511 
00512     nCount = GetDlgItemInt(hwnd, id, &bTranslated, FALSE);
00513     if (bTranslated == FALSE)
00514         return 12;
00515 
00516     return nCount;
00517 }
00518 
00519 
00520 
00521 INT_PTR CALLBACK
00522 AdvAppearanceDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
00523 {
00524     INT iListIndex;
00525     GLOBALS* g;
00526 
00527     g = (GLOBALS*)GetWindowLongPtr(hwndDlg, DWLP_USER);
00528 
00529     switch (uMsg)
00530     {
00531         case WM_INITDIALOG:
00532             g = (GLOBALS*)lParam;
00533             SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)g);
00534             AdvAppearanceDlg_Init(hwndDlg, g);
00535             break;
00536 
00537         case WM_DESTROY:
00538             AdvAppearanceDlg_CleanUp(hwndDlg, g);
00539             break;
00540 
00541         case WM_COMMAND:
00542             switch(LOWORD(wParam))
00543             {
00544                 case IDOK:
00545                     SaveCurrentValues(hwndDlg, g);
00546                     EndDialog(hwndDlg, IDOK);
00547                     break;
00548 
00549                 case IDCANCEL:
00550                     g->SchemeAdv = g->Scheme;
00551                     EndDialog(hwndDlg, IDCANCEL);
00552                     break;
00553 
00554                 case IDC_APPEARANCE_PREVIEW:
00555                     SaveCurrentValues(hwndDlg, g);
00556                     SelectComboByElement(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, lParam);
00557                     g->CurrentElement = (INT)lParam;
00558                     UpdateControls(hwndDlg, g);
00559                     break;
00560 
00561                 case IDC_ADVAPPEARANCE_ELEMENT:
00562                     if (HIWORD(wParam) == CBN_SELCHANGE)
00563                     {
00564                         SaveCurrentValues(hwndDlg, g);
00565                         iListIndex = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETCURSEL, 0, 0);
00566                         g->CurrentElement = SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_ELEMENT, CB_GETITEMDATA, (WPARAM)iListIndex, 0);
00567                         UpdateControls(hwndDlg, g);
00568                     }
00569                     break;
00570 
00571                 case IDC_ADVAPPEARANCE_SIZE_E:
00572                     if (g && HIWORD(wParam) == EN_CHANGE)
00573                     {
00574                         INT i = (INT)LOWORD(SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_SIZE_UD, UDM_GETPOS,0,0L));
00575 
00576                         switch (g->CurrentElement)
00577                         {
00578                             case IDX_INACTIVE_CAPTION:
00579                             case IDX_ACTIVE_CAPTION:
00580                             case IDX_CAPTION_BUTTON:
00581                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCYCAPTION, 0, i);
00582                                 break;
00583 
00584                             case IDX_MENU:
00585                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCYMENU, 0, i);
00586                                 break;
00587 
00588                             case IDX_SCROLLBAR:
00589                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCXSCROLLBAR, 0, i);
00590                                 break;
00591 
00592                             case IDX_INACTIVE_BORDER:
00593                             case IDX_ACTIVE_BORDER:
00594                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_SETCYSIZEFRAME, 0, i);
00595                                 break;
00596                         }
00597                     }
00598                     break;
00599 
00600                 case IDC_ADVAPPEARANCE_FONT_C:
00601                     if (g && HIWORD(wParam) == CBN_SELCHANGE)
00602                     {
00603                         switch (g->CurrentElement)
00604                         {
00605                             case IDX_INACTIVE_CAPTION:
00606                             case IDX_ACTIVE_CAPTION:
00607                                 GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C,
00608                                     g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfFaceName);
00609                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00610                                 break;
00611 
00612                             case IDX_MENU:
00613                                 GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C,
00614                                     g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfFaceName);
00615                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00616                                 break;
00617 
00618                             case IDX_DIALOG:
00619                                 GetSelectedComboText(hwndDlg, IDC_ADVAPPEARANCE_FONT_C,
00620                                     g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfFaceName);
00621                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00622                                 break;
00623                         }
00624                     }
00625                     break;
00626 
00627                 case IDC_ADVAPPEARANCE_FONTSIZE_E:
00628                     if (g && HIWORD(wParam) == CBN_SELCHANGE)
00629                     {
00630                         HDC hdcDlg = GetDC(hwndDlg);
00631                         INT i;
00632 
00633                         switch (g->CurrentElement)
00634                         {
00635                             case IDX_INACTIVE_CAPTION:
00636                             case IDX_ACTIVE_CAPTION:
00637                                 i = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
00638                                 g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight =
00639                                     -MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
00640                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00641                                 break;
00642 
00643                             case IDX_MENU:
00644                                 i = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
00645                                 g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight =
00646                                     -MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
00647                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00648                                 break;
00649 
00650                             case IDX_DIALOG:
00651                                 i = GetSelectedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
00652                                 g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight =
00653                                     -MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
00654                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00655                                 break;
00656                         }
00657 
00658                         ReleaseDC(hwndDlg, hdcDlg);
00659                     }
00660                     else if (g && HIWORD(wParam) == CBN_EDITCHANGE)
00661                     {
00662                         HDC hdcDlg = GetDC(hwndDlg);
00663                         INT i;
00664 
00665                         switch (g->CurrentElement)
00666                         {
00667                             case IDX_INACTIVE_CAPTION:
00668                             case IDX_ACTIVE_CAPTION:
00669                                 i = GetEditedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
00670                                 g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight =
00671                                     -MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
00672                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00673                                 break;
00674 
00675                             case IDX_MENU:
00676                                 i = GetEditedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
00677                                 g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight =
00678                                     -MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
00679                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00680                                 break;
00681 
00682                             case IDX_DIALOG:
00683                                 i = GetEditedComboInt(hwndDlg, IDC_ADVAPPEARANCE_FONTSIZE_E);
00684                                 g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfHeight =
00685                                     -MulDiv(i , GetDeviceCaps(hdcDlg, LOGPIXELSY), 72);
00686                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00687                                 break;
00688                         }
00689 
00690                         ReleaseDC(hwndDlg, hdcDlg);
00691                     }
00692                     break;
00693 
00694                 case IDC_ADVAPPEARANCE_FONTBOLD:
00695                     if (g && HIWORD(wParam) == BN_CLICKED)
00696                     {
00697                         INT i;
00698 
00699                         switch (g->CurrentElement)
00700                         {
00701                             case IDX_INACTIVE_CAPTION:
00702                             case IDX_ACTIVE_CAPTION:
00703                                 i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0);
00704                                 g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfWeight =
00705                                     (i == BST_CHECKED) ? FW_BOLD : FW_NORMAL;
00706                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00707                                 break;
00708 
00709                             case IDX_MENU:
00710                                 i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0);
00711 
00712                                 g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfWeight =
00713                                     (i == BST_CHECKED) ? FW_BOLD : FW_NORMAL;
00714                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00715                                 break;
00716 
00717                             case IDX_DIALOG:
00718                                 i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTBOLD, BM_GETCHECK, 0, 0);
00719                                 g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfWeight =
00720                                     (i == BST_CHECKED) ? FW_BOLD : FW_NORMAL;
00721                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00722                                 break;
00723                         }
00724                     }
00725                     break;
00726 
00727                 case IDC_ADVAPPEARANCE_FONTITALIC:
00728                     if (g && HIWORD(wParam) == BN_CLICKED)
00729                     {
00730                         INT i;
00731 
00732                         switch (g->CurrentElement)
00733                         {
00734                             case IDX_INACTIVE_CAPTION:
00735                             case IDX_ACTIVE_CAPTION:
00736                                 i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0);
00737                                 g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfItalic =
00738                                     (i == BST_CHECKED) ? TRUE : FALSE;
00739                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00740                                 break;
00741 
00742                             case IDX_MENU:
00743                                 i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0);
00744                                 g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfItalic =
00745                                     (i == BST_CHECKED) ? TRUE : FALSE;
00746                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00747                                 break;
00748 
00749                             case IDX_DIALOG:
00750                                 i = (INT)SendDlgItemMessage(hwndDlg, IDC_ADVAPPEARANCE_FONTITALIC, BM_GETCHECK, 0, 0);
00751                                 g->SchemeAdv.lfFont[g_Assignment[g->CurrentElement].Font].lfItalic =
00752                                     (i == BST_CHECKED) ? TRUE : FALSE;
00753                                 SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, PVM_UPDATETHEME, 0, (LPARAM)&g->SchemeAdv);
00754                                 break;
00755                         }
00756                     }
00757                     break;
00758 
00759                 case IDC_ADVAPPEARANCE_COLOR1_B:
00760                     GetColor(hwndDlg, g, 0);
00761                     break;
00762 
00763                 case IDC_ADVAPPEARANCE_COLOR2_B:
00764                     GetColor(hwndDlg, g, 1);
00765                     break;
00766 
00767                 case IDC_ADVAPPEARANCE_FONTCOLOR_B:
00768                     GetColor(hwndDlg, g, 2);
00769                     break;
00770 
00771                 default:
00772                     return FALSE;
00773             }
00774             break;
00775 
00776         default:
00777             return FALSE;
00778     }
00779 
00780     return TRUE;
00781 }

Generated on Mon May 28 2012 04:20:32 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.