/** * Sets the text in a graphing information structure. * * \param hdc The DC to perform calculations from. * \param DrawInfo A structure which contains graphing information. * The structure is modified to contain the new text information. * \param Text The text. * \param Margin The margins of the text box from the edges of the * graph. * \param Padding The padding within the text box. * \param Align The alignment of the text box. */ VOID PhSetGraphText( __in HDC hdc, __inout PPH_GRAPH_DRAW_INFO DrawInfo, __in PPH_STRINGREF Text, __in PRECT Margin, __in PRECT Padding, __in ULONG Align ) { SIZE textSize; PH_RECTANGLE boxRectangle; PH_RECTANGLE textRectangle; DrawInfo->Text = *Text; GetTextExtentPoint32(hdc, Text->Buffer, (ULONG)Text->Length / 2, &textSize); // Calculate the box rectangle. boxRectangle.Width = textSize.cx + Padding->left + Padding->right; boxRectangle.Height = textSize.cy + Padding->top + Padding->bottom; if (Align & PH_ALIGN_LEFT) boxRectangle.Left = Margin->left; else if (Align & PH_ALIGN_RIGHT) boxRectangle.Left = DrawInfo->Width - boxRectangle.Width - Margin->right; else boxRectangle.Left = (DrawInfo->Width - boxRectangle.Width) / 2; if (Align & PH_ALIGN_TOP) boxRectangle.Top = Margin->top; else if (Align & PH_ALIGN_BOTTOM) boxRectangle.Top = DrawInfo->Height - boxRectangle.Height - Margin->bottom; else boxRectangle.Top = (DrawInfo->Height - boxRectangle.Height) / 2; // Calculate the text rectangle. textRectangle.Left = boxRectangle.Left + Padding->left; textRectangle.Top = boxRectangle.Top + Padding->top; textRectangle.Width = textSize.cx; textRectangle.Height = textSize.cy; // Save the rectangles. DrawInfo->TextRect = PhRectangleToRect(textRectangle); DrawInfo->TextBoxRect = PhRectangleToRect(boxRectangle); }
VOID PhLoadWindowPlacementFromSetting( _In_opt_ PWSTR PositionSettingName, _In_opt_ PWSTR SizeSettingName, _In_ HWND WindowHandle ) { PH_RECTANGLE windowRectangle; if (PositionSettingName && SizeSettingName) { RECT rectForAdjust; windowRectangle.Position = PhGetIntegerPairSetting(PositionSettingName); windowRectangle.Size = PhGetScalableIntegerPairSetting(SizeSettingName, TRUE).Pair; PhAdjustRectangleToWorkingArea(NULL, &windowRectangle); // Let the window adjust for the minimum size if needed. rectForAdjust = PhRectangleToRect(windowRectangle); SendMessage(WindowHandle, WM_SIZING, WMSZ_BOTTOMRIGHT, (LPARAM)&rectForAdjust); windowRectangle = PhRectToRectangle(rectForAdjust); MoveWindow(WindowHandle, windowRectangle.Left, windowRectangle.Top, windowRectangle.Width, windowRectangle.Height, FALSE); } else { PH_INTEGER_PAIR position; PH_INTEGER_PAIR size; ULONG flags; flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSIZE | SWP_NOZORDER; if (PositionSettingName) { position = PhGetIntegerPairSetting(PositionSettingName); flags &= ~SWP_NOMOVE; } else { position.X = 0; position.Y = 0; } if (SizeSettingName) { size = PhGetScalableIntegerPairSetting(SizeSettingName, TRUE).Pair; flags &= ~SWP_NOSIZE; } else { size.X = 16; size.Y = 16; } SetWindowPos(WindowHandle, NULL, position.X, position.Y, size.X, size.Y, flags); } }