1 /* 2 * PROJECT: PAINT for ReactOS 3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later) 4 * PURPOSE: Window procedures of the dialog windows plus launching functions 5 * COPYRIGHT: Copyright 2015 Benedikt Freisen <b.freisen@gmx.net> 6 */ 7 8 #include "precomp.h" 9 #include "dialogs.h" 10 11 #include <winnls.h> 12 13 CMirrorRotateDialog mirrorRotateDialog; 14 CAttributesDialog attributesDialog; 15 CStretchSkewDialog stretchSkewDialog; 16 CFontsDialog fontsDialog; 17 18 /* FUNCTIONS ********************************************************/ 19 20 void ShowError(INT stringID, ...) 21 { 22 va_list va; 23 va_start(va, stringID); 24 25 CStringW strFormat, strText; 26 strFormat.LoadString(stringID); 27 strText.FormatV(strFormat, va); 28 29 CStringW strProgramName; 30 strProgramName.LoadString(IDS_PROGRAMNAME); 31 32 mainWindow.MessageBox(strText, strProgramName, MB_ICONERROR); 33 va_end(va); 34 } 35 36 LRESULT CMirrorRotateDialog::OnInitDialog(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 37 { 38 CheckDlgButton(IDD_MIRRORROTATERB1, BST_CHECKED); 39 CheckDlgButton(IDD_MIRRORROTATERB4, BST_CHECKED); 40 return TRUE; 41 } 42 43 LRESULT CMirrorRotateDialog::OnClose(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 44 { 45 EndDialog(0); 46 return 0; 47 } 48 49 LRESULT CMirrorRotateDialog::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 50 { 51 if (IsDlgButtonChecked(IDD_MIRRORROTATERB1)) 52 EndDialog(1); 53 else if (IsDlgButtonChecked(IDD_MIRRORROTATERB2)) 54 EndDialog(2); 55 else if (IsDlgButtonChecked(IDD_MIRRORROTATERB4)) 56 EndDialog(3); 57 else if (IsDlgButtonChecked(IDD_MIRRORROTATERB5)) 58 EndDialog(4); 59 else if (IsDlgButtonChecked(IDD_MIRRORROTATERB6)) 60 EndDialog(5); 61 return 0; 62 } 63 64 LRESULT CMirrorRotateDialog::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 65 { 66 EndDialog(0); 67 return 0; 68 } 69 70 LRESULT CMirrorRotateDialog::OnRadioButton3(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 71 { 72 if (IsDlgButtonChecked(IDD_MIRRORROTATERB3) != BST_CHECKED) 73 return 0; 74 75 ::EnableWindow(GetDlgItem(IDD_MIRRORROTATERB4), TRUE); 76 ::EnableWindow(GetDlgItem(IDD_MIRRORROTATERB5), TRUE); 77 ::EnableWindow(GetDlgItem(IDD_MIRRORROTATERB6), TRUE); 78 return 0; 79 } 80 81 LRESULT CMirrorRotateDialog::OnRadioButton12(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 82 { 83 if (IsDlgButtonChecked(IDD_MIRRORROTATERB1) != BST_CHECKED && 84 IsDlgButtonChecked(IDD_MIRRORROTATERB2) != BST_CHECKED) 85 { 86 return 0; 87 } 88 89 ::EnableWindow(GetDlgItem(IDD_MIRRORROTATERB4), FALSE); 90 ::EnableWindow(GetDlgItem(IDD_MIRRORROTATERB5), FALSE); 91 ::EnableWindow(GetDlgItem(IDD_MIRRORROTATERB6), FALSE); 92 return 0; 93 } 94 95 LRESULT CAttributesDialog::OnInitDialog(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 96 { 97 newWidth = imageModel.GetWidth(); 98 newHeight = imageModel.GetHeight(); 99 100 CheckDlgButton(IDD_ATTRIBUTESRB3, BST_CHECKED); 101 SetDlgItemInt(IDD_ATTRIBUTESEDIT1, newWidth, FALSE); 102 SetDlgItemInt(IDD_ATTRIBUTESEDIT2, newHeight, FALSE); 103 104 if (imageModel.IsBlackAndWhite()) 105 CheckRadioButton(IDD_ATTRIBUTESRB4, IDD_ATTRIBUTESRB5, IDD_ATTRIBUTESRB4); 106 else 107 CheckRadioButton(IDD_ATTRIBUTESRB4, IDD_ATTRIBUTESRB5, IDD_ATTRIBUTESRB5); 108 109 if (g_isAFile) 110 { 111 WCHAR date[100], temp[100]; 112 GetDateFormatW(LOCALE_USER_DEFAULT, 0, &g_fileTime, NULL, date, _countof(date)); 113 GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &g_fileTime, NULL, temp, _countof(temp)); 114 StringCchCatW(date, _countof(date), L" "); 115 StringCchCatW(date, _countof(date), temp); 116 CStringW strSize; 117 strSize.Format(IDS_FILESIZE, g_fileSize); 118 SetDlgItemText(IDD_ATTRIBUTESTEXT6, date); 119 SetDlgItemText(IDD_ATTRIBUTESTEXT7, strSize); 120 } 121 122 CStringW strUnit; 123 GetDlgItemText(IDD_ATTRIBUTESTEXT8, strUnit); 124 125 CStringW strRes; 126 if (strUnit == L"dpi") 127 strRes.Format(IDS_PRINTRES, ROUND(g_xDpi), ROUND(g_yDpi)); 128 else 129 strRes.Format(IDS_PRINTRES, ROUND(PpcmFromDpi(g_xDpi)), ROUND(PpcmFromDpi(g_yDpi))); 130 131 SetDlgItemText(IDD_ATTRIBUTESTEXT8, strRes); 132 return TRUE; 133 } 134 135 LRESULT CAttributesDialog::OnClose(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 136 { 137 EndDialog(0); 138 return 0; 139 } 140 141 LRESULT CAttributesDialog::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 142 { 143 m_bBlackAndWhite = (IsDlgButtonChecked(IDD_ATTRIBUTESRB4) == BST_CHECKED); 144 EndDialog(1); 145 return 0; 146 } 147 148 LRESULT CAttributesDialog::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 149 { 150 EndDialog(0); 151 return 0; 152 } 153 154 LRESULT CAttributesDialog::OnDefault(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 155 { 156 newWidth = imageModel.GetWidth(); 157 newHeight = imageModel.GetHeight(); 158 CheckDlgButton(IDD_ATTRIBUTESRB3, BST_CHECKED); 159 CheckDlgButton(IDD_ATTRIBUTESRB5, BST_CHECKED); 160 SetDlgItemInt(IDD_ATTRIBUTESEDIT1, newWidth, FALSE); 161 SetDlgItemInt(IDD_ATTRIBUTESEDIT2, newHeight, FALSE); 162 return 0; 163 } 164 165 LRESULT CAttributesDialog::OnRadioButton1(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 166 { 167 if (IsDlgButtonChecked(IDD_ATTRIBUTESRB1) != BST_CHECKED) 168 return 0; 169 170 CStringW strNum; 171 strNum.Format(L"%.3lf", newWidth / g_xDpi); 172 SetDlgItemText(IDD_ATTRIBUTESEDIT1, strNum); 173 strNum.Format(L"%.3lf", newHeight / g_yDpi); 174 SetDlgItemText(IDD_ATTRIBUTESEDIT2, strNum); 175 return 0; 176 } 177 178 LRESULT CAttributesDialog::OnRadioButton2(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 179 { 180 if (IsDlgButtonChecked(IDD_ATTRIBUTESRB2) != BST_CHECKED) 181 return 0; 182 183 CStringW strNum; 184 strNum.Format(L"%.3lf", newWidth / PpcmFromDpi(g_xDpi)); 185 SetDlgItemText(IDD_ATTRIBUTESEDIT1, strNum); 186 strNum.Format(L"%.3lf", newHeight / PpcmFromDpi(g_yDpi)); 187 SetDlgItemText(IDD_ATTRIBUTESEDIT2, strNum); 188 return 0; 189 } 190 191 LRESULT CAttributesDialog::OnRadioButton3(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 192 { 193 if (IsDlgButtonChecked(IDD_ATTRIBUTESRB3) != BST_CHECKED) 194 return 0; 195 196 SetDlgItemInt(IDD_ATTRIBUTESEDIT1, newWidth, FALSE); 197 SetDlgItemInt(IDD_ATTRIBUTESEDIT2, newHeight, FALSE); 198 return 0; 199 } 200 201 LRESULT CAttributesDialog::OnEdit1(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 202 { 203 if (Edit_GetModify(hWndCtl)) 204 { 205 WCHAR tempS[100]; 206 if (IsDlgButtonChecked(IDD_ATTRIBUTESRB1)) 207 { 208 GetDlgItemText(IDD_ATTRIBUTESEDIT1, tempS, _countof(tempS)); 209 newWidth = max(1, (int)(wcstod(tempS, NULL) * g_xDpi)); 210 } 211 else if (IsDlgButtonChecked(IDD_ATTRIBUTESRB2)) 212 { 213 GetDlgItemText(IDD_ATTRIBUTESEDIT1, tempS, _countof(tempS)); 214 newWidth = max(1, (int)(wcstod(tempS, NULL) * PpcmFromDpi(g_xDpi))); 215 } 216 else if (IsDlgButtonChecked(IDD_ATTRIBUTESRB3)) 217 { 218 GetDlgItemText(IDD_ATTRIBUTESEDIT1, tempS, _countof(tempS)); 219 newWidth = max(1, _wtoi(tempS)); 220 } 221 Edit_SetModify(hWndCtl, FALSE); 222 } 223 return 0; 224 } 225 226 LRESULT CAttributesDialog::OnEdit2(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 227 { 228 if (Edit_GetModify(hWndCtl)) 229 { 230 WCHAR tempS[100]; 231 if (IsDlgButtonChecked(IDD_ATTRIBUTESRB1)) 232 { 233 GetDlgItemText(IDD_ATTRIBUTESEDIT2, tempS, _countof(tempS)); 234 newHeight = max(1, (int)(wcstod(tempS, NULL) * g_yDpi)); 235 } 236 else if (IsDlgButtonChecked(IDD_ATTRIBUTESRB2)) 237 { 238 GetDlgItemText(IDD_ATTRIBUTESEDIT2, tempS, _countof(tempS)); 239 newHeight = max(1, (int)(wcstod(tempS, NULL) * PpcmFromDpi(g_yDpi))); 240 } 241 else if (IsDlgButtonChecked(IDD_ATTRIBUTESRB3)) 242 { 243 GetDlgItemText(IDD_ATTRIBUTESEDIT2, tempS, _countof(tempS)); 244 newHeight = max(1, _wtoi(tempS)); 245 } 246 Edit_SetModify(hWndCtl, FALSE); 247 } 248 return 0; 249 } 250 251 252 253 LRESULT CStretchSkewDialog::OnInitDialog(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 254 { 255 SetDlgItemInt(IDD_STRETCHSKEWEDITHSTRETCH, 100, FALSE); 256 SetDlgItemInt(IDD_STRETCHSKEWEDITVSTRETCH, 100, FALSE); 257 SetDlgItemInt(IDD_STRETCHSKEWEDITHSKEW, 0, FALSE); 258 SetDlgItemInt(IDD_STRETCHSKEWEDITVSKEW, 0, FALSE); 259 return TRUE; 260 } 261 262 LRESULT CStretchSkewDialog::OnClose(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 263 { 264 EndDialog(0); 265 return 0; 266 } 267 268 LRESULT CStretchSkewDialog::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 269 { 270 CStringW strrcIntNumbers, strrcPercentage, strrcAngle; 271 BOOL tr1, tr2, tr3, tr4; 272 273 strrcIntNumbers.LoadString(g_hinstExe, IDS_INTNUMBERS); 274 strrcPercentage.LoadString(g_hinstExe, IDS_PERCENTAGE); 275 strrcAngle.LoadString(g_hinstExe, IDS_ANGLE); 276 277 percentage.x = GetDlgItemInt(IDD_STRETCHSKEWEDITHSTRETCH, &tr1, FALSE); 278 percentage.y = GetDlgItemInt(IDD_STRETCHSKEWEDITVSTRETCH, &tr2, FALSE); 279 angle.x = GetDlgItemInt(IDD_STRETCHSKEWEDITHSKEW, &tr3, TRUE); 280 angle.y = GetDlgItemInt(IDD_STRETCHSKEWEDITVSKEW, &tr4, TRUE); 281 282 if (!(tr1 && tr2 && tr3 && tr4)) 283 MessageBox(strrcIntNumbers, NULL, MB_ICONEXCLAMATION); 284 else if (percentage.x < 1 || percentage.x > 500 || percentage.y < 1 || percentage.y > 500) 285 MessageBox(strrcPercentage, NULL, MB_ICONEXCLAMATION); 286 else if (angle.x < -89 || angle.x > 89 || angle.y < -89 || angle.y > 89) 287 MessageBox(strrcAngle, NULL, MB_ICONEXCLAMATION); 288 else 289 EndDialog(1); 290 return 0; 291 } 292 293 LRESULT CStretchSkewDialog::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) 294 { 295 EndDialog(0); 296 return 0; 297 } 298 299 static INT CALLBACK 300 EnumFontFamProc(ENUMLOGFONTW *lpelf, NEWTEXTMETRICW *lpntm, INT FontType, LPARAM lParam) 301 { 302 CSimpleArray<CStringW>& arrFontNames = *reinterpret_cast<CSimpleArray<CStringW>*>(lParam); 303 LPWSTR name = lpelf->elfLogFont.lfFaceName; 304 if (name[0] == L'@') // Vertical fonts 305 return TRUE; 306 307 for (INT i = 0; i < arrFontNames.GetSize(); ++i) 308 { 309 if (arrFontNames[i] == name) // Already exists 310 return TRUE; 311 } 312 313 arrFontNames.Add(name); 314 return TRUE; 315 } 316 317 // TODO: AutoComplete font names 318 // TODO: Vertical text 319 CFontsDialog::CFontsDialog() 320 { 321 } 322 323 void CFontsDialog::InitFontNames() 324 { 325 // List the fonts 326 CSimpleArray<CStringW> arrFontNames; 327 HDC hDC = CreateCompatibleDC(NULL); 328 if (hDC) 329 { 330 EnumFontFamiliesW(hDC, NULL, (FONTENUMPROCW)EnumFontFamProc, 331 reinterpret_cast<LPARAM>(&arrFontNames)); 332 ::DeleteDC(hDC); 333 } 334 335 // Actually add them to the combobox 336 HWND hwndNames = GetDlgItem(IDD_FONTSNAMES); 337 ::SendMessageW(hwndNames, CB_RESETCONTENT, 0, 0); 338 for (INT i = 0; i < arrFontNames.GetSize(); ++i) 339 { 340 ComboBox_AddString(hwndNames, arrFontNames[i]); 341 } 342 343 ::SetWindowTextW(hwndNames, registrySettings.strFontName); 344 } 345 346 void CFontsDialog::InitFontSizes() 347 { 348 static const INT s_sizes[] = 349 { 350 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72 351 }; 352 353 HWND hwndSizes = GetDlgItem(IDD_FONTSSIZES); 354 ComboBox_ResetContent(hwndSizes); 355 356 WCHAR szText[16]; 357 for (UINT i = 0; i < _countof(s_sizes); ++i) 358 { 359 StringCchPrintfW(szText, _countof(szText), L"%d", s_sizes[i]); 360 INT iItem = ComboBox_AddString(hwndSizes, szText); 361 if (s_sizes[i] == (INT)registrySettings.PointSize) 362 ComboBox_SetCurSel(hwndSizes, iItem); 363 } 364 365 if (ComboBox_GetCurSel(hwndSizes) == CB_ERR) 366 { 367 StringCchPrintfW(szText, _countof(szText), L"%d", (INT)registrySettings.PointSize); 368 ::SetWindowTextW(hwndSizes, szText); 369 } 370 } 371 372 void CFontsDialog::InitToolbar() 373 { 374 HWND hwndToolbar = GetDlgItem(IDD_FONTSTOOLBAR); 375 ::SendMessageW(hwndToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0); 376 ::SendMessageW(hwndToolbar, TB_SETBITMAPSIZE, 0, MAKELPARAM(16, 16)); 377 ::SendMessageW(hwndToolbar, TB_SETBUTTONWIDTH, 0, MAKELPARAM(20, 20)); 378 379 TBADDBITMAP AddBitmap; 380 AddBitmap.hInst = g_hinstExe; 381 AddBitmap.nID = IDB_FONTSTOOLBAR; 382 ::SendMessageW(hwndToolbar, TB_ADDBITMAP, 4, (LPARAM)&AddBitmap); 383 384 HIMAGELIST himl = ImageList_LoadImage(g_hinstExe, MAKEINTRESOURCEW(IDB_FONTSTOOLBAR), 385 16, 8, RGB(255, 0, 255), IMAGE_BITMAP, 386 LR_CREATEDIBSECTION); 387 ::SendMessageW(hwndToolbar, TB_SETIMAGELIST, 0, (LPARAM)himl); 388 389 TBBUTTON buttons[] = 390 { 391 { 0, IDM_BOLD, TBSTATE_ENABLED, TBSTYLE_CHECK }, 392 { 1, IDM_ITALIC, TBSTATE_ENABLED, TBSTYLE_CHECK }, 393 { 2, IDM_UNDERLINE, TBSTATE_ENABLED, TBSTYLE_CHECK }, 394 { 3, IDM_VERTICAL, 0, TBSTYLE_CHECK }, // TODO: 395 }; 396 ::SendMessageW(hwndToolbar, TB_ADDBUTTONS, _countof(buttons), (LPARAM)&buttons); 397 398 ::SendMessageW(hwndToolbar, TB_CHECKBUTTON, IDM_BOLD, registrySettings.Bold); 399 ::SendMessageW(hwndToolbar, TB_CHECKBUTTON, IDM_ITALIC, registrySettings.Italic); 400 ::SendMessageW(hwndToolbar, TB_CHECKBUTTON, IDM_UNDERLINE, registrySettings.Underline); 401 } 402 403 LRESULT CFontsDialog::OnInitDialog(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 404 { 405 // TODO: Tooltips 406 InitFontNames(); 407 InitFontSizes(); 408 InitToolbar(); 409 410 if (registrySettings.FontsPositionX != 0 || registrySettings.FontsPositionY != 0) 411 { 412 SetWindowPos(NULL, 413 registrySettings.FontsPositionX, registrySettings.FontsPositionY, 414 0, 0, 415 SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOZORDER); 416 SendMessage(DM_REPOSITION, 0, 0); 417 } 418 419 if (!registrySettings.ShowTextTool) 420 ShowWindow(SW_HIDE); 421 422 return TRUE; 423 } 424 425 LRESULT CFontsDialog::OnClose(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 426 { 427 ShowWindow(SW_HIDE); // Just hide. Recycle for optimization 428 return 0; 429 } 430 431 void CFontsDialog::OnFontName(UINT codeNotify) 432 { 433 HWND hwndNames = GetDlgItem(IDD_FONTSNAMES); 434 INT iItem = CB_ERR; 435 UINT cch; 436 WCHAR szText[LF_FACESIZE]; 437 438 switch (codeNotify) 439 { 440 case CBN_SELCHANGE: 441 iItem = ComboBox_GetCurSel(hwndNames); 442 cch = ComboBox_GetLBTextLen(hwndNames, iItem); 443 if (iItem != CB_ERR && 0 < cch && cch < _countof(szText)) 444 ComboBox_GetLBText(hwndNames, iItem, szText); 445 break; 446 447 case CBN_EDITCHANGE: 448 GetDlgItemText(IDD_FONTSNAMES, szText, _countof(szText)); 449 iItem = ComboBox_FindStringExact(hwndNames, -1, szText); 450 break; 451 } 452 453 if (iItem != CB_ERR && registrySettings.strFontName.CompareNoCase(szText) != 0) 454 { 455 registrySettings.strFontName = szText; 456 toolsModel.NotifyToolChanged(); 457 } 458 } 459 460 void CFontsDialog::OnFontSize(UINT codeNotify) 461 { 462 HWND hwndSizes = GetDlgItem(IDD_FONTSSIZES); 463 WCHAR szText[8]; 464 INT iItem, PointSize = 0; 465 UINT cch; 466 467 switch (codeNotify) 468 { 469 case CBN_SELCHANGE: 470 iItem = ComboBox_GetCurSel(hwndSizes); 471 cch = ComboBox_GetLBTextLen(hwndSizes, iItem); 472 if (iItem != CB_ERR && 0 < cch && cch < _countof(szText)) 473 { 474 ComboBox_GetLBText(hwndSizes, iItem, szText); 475 PointSize = _wtoi(szText); 476 } 477 break; 478 479 case CBN_EDITCHANGE: 480 ::GetWindowTextW(hwndSizes, szText, _countof(szText)); 481 PointSize = _wtoi(szText); 482 break; 483 } 484 485 if (PointSize > 0) 486 { 487 registrySettings.PointSize = PointSize; 488 toolsModel.NotifyToolChanged(); 489 } 490 } 491 492 LRESULT CFontsDialog::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 493 { 494 UINT id = LOWORD(wParam); 495 UINT codeNotify = HIWORD(wParam); 496 HWND hwndToolbar = GetDlgItem(IDD_FONTSTOOLBAR); 497 BOOL bChecked = (BOOL)::SendMessageW(hwndToolbar, TB_ISBUTTONCHECKED, id, 0); 498 499 switch (id) 500 { 501 case IDCANCEL: 502 ShowWindow(SW_HIDE); 503 registrySettings.ShowTextTool = FALSE; 504 break; 505 506 case IDD_FONTSNAMES: 507 OnFontName(codeNotify); 508 break; 509 510 case IDD_FONTSSIZES: 511 OnFontSize(codeNotify); 512 break; 513 514 case IDM_BOLD: 515 registrySettings.Bold = bChecked; 516 toolsModel.NotifyToolChanged(); 517 break; 518 519 case IDM_ITALIC: 520 registrySettings.Italic = bChecked; 521 toolsModel.NotifyToolChanged(); 522 break; 523 524 case IDM_UNDERLINE: 525 registrySettings.Underline = bChecked; 526 toolsModel.NotifyToolChanged(); 527 break; 528 529 case IDM_VERTICAL: 530 // TODO: 531 break; 532 } 533 return 0; 534 } 535 536 LRESULT CFontsDialog::OnNotify(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 537 { 538 NMHDR *pnmhdr = reinterpret_cast<NMHDR *>(lParam); 539 if (pnmhdr->code == TTN_NEEDTEXT) 540 { 541 LPTOOLTIPTEXTW pToolTip = reinterpret_cast<LPTOOLTIPTEXTW>(lParam); 542 pToolTip->hinst = g_hinstExe; 543 switch (pnmhdr->idFrom) 544 { 545 case IDM_BOLD: pToolTip->lpszText = MAKEINTRESOURCEW(IDS_BOLD); break; 546 case IDM_ITALIC: pToolTip->lpszText = MAKEINTRESOURCEW(IDS_ITALIC); break; 547 case IDM_UNDERLINE: pToolTip->lpszText = MAKEINTRESOURCEW(IDS_UNDERLINE); break; 548 case IDM_VERTICAL: pToolTip->lpszText = MAKEINTRESOURCEW(IDS_VERTICAL); break; 549 550 default: 551 break; 552 } 553 } 554 return 0; 555 } 556 557 LRESULT CFontsDialog::OnMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 558 { 559 RECT rc; 560 GetWindowRect(&rc); 561 registrySettings.FontsPositionX = rc.left; 562 registrySettings.FontsPositionY = rc.top; 563 return 0; 564 } 565 566 LRESULT CFontsDialog::OnToolsModelToolChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 567 { 568 if (wParam != TOOL_TEXT) 569 ShowWindow(SW_HIDE); 570 571 return 0; 572 } 573 574 LRESULT CFontsDialog::OnMeasureItem(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 575 { 576 if (wParam == IDD_FONTSNAMES) 577 { 578 LPMEASUREITEMSTRUCT pMeasureItem = reinterpret_cast<LPMEASUREITEMSTRUCT>(lParam); 579 RECT rc; 580 ::GetClientRect(GetDlgItem(IDD_FONTSNAMES), &rc); 581 pMeasureItem->itemWidth = rc.right - rc.left; 582 pMeasureItem->itemHeight = GetSystemMetrics(SM_CYVSCROLL); 583 return TRUE; 584 } 585 return 0; 586 } 587 588 LRESULT CFontsDialog::OnDrawItem(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 589 { 590 // TODO: Owner-draw the font types 591 if (wParam == IDD_FONTSNAMES) 592 { 593 LPDRAWITEMSTRUCT pDrawItem = reinterpret_cast<LPDRAWITEMSTRUCT>(lParam); 594 if (pDrawItem->itemID == (UINT)-1) 595 return TRUE; 596 597 ::SetBkMode(pDrawItem->hDC, TRANSPARENT); 598 599 HWND hwndItem = pDrawItem->hwndItem; 600 RECT rcItem = pDrawItem->rcItem; 601 if (pDrawItem->itemState & ODS_SELECTED) 602 { 603 ::FillRect(pDrawItem->hDC, &rcItem, GetSysColorBrush(COLOR_HIGHLIGHT)); 604 ::SetTextColor(pDrawItem->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); 605 } 606 else 607 { 608 ::FillRect(pDrawItem->hDC, &rcItem, GetSysColorBrush(COLOR_WINDOW)); 609 ::SetTextColor(pDrawItem->hDC, GetSysColor(COLOR_WINDOWTEXT)); 610 } 611 612 WCHAR szText[LF_FACESIZE]; 613 if ((UINT)ComboBox_GetLBTextLen(hwndItem, pDrawItem->itemID) < _countof(szText)) 614 { 615 szText[0] = 0; 616 ComboBox_GetLBText(hwndItem, pDrawItem->itemID, szText); 617 618 rcItem.left += 24; 619 ::DrawTextW(pDrawItem->hDC, szText, -1, &rcItem, DT_LEFT | DT_VCENTER | DT_SINGLELINE); 620 } 621 622 if (pDrawItem->itemState & ODS_FOCUS) 623 ::DrawFocusRect(pDrawItem->hDC, &pDrawItem->rcItem); 624 625 return TRUE; 626 } 627 return 0; 628 } 629