void HotKeyInputWindow::SubclassNativeControl() { baseWindowProcedure = (WNDPROC)SetWindowLongPtr(windowHandle, GWLP_WNDPROC, (LONG_PTR)WindowProcedureWrapper); AssertCriticalWinApiResult(baseWindowProcedure); LONG exStyle = GetWindowLong(windowHandle, GWL_EXSTYLE); AssertCriticalWinApiResult(exStyle); exStyle &= ~WS_EX_CLIENTEDGE; AssertCriticalWinApiResult(SetWindowLong(windowHandle, GWL_EXSTYLE, exStyle)); AssertCriticalWinApiResult(SetWindowPos(windowHandle, nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER)); SendMessage(windowHandle, HKM_SETHOTKEY, currentHotkey, 0); }
NativeWindowHolder::~NativeWindowHolder() { if(windowHandle != nullptr) { AssertCriticalWinApiResult(DestroyWindow(windowHandle)); } }
wstring StringUtilities::GetUtf16StringFromChar(const char* text) { if (text == nullptr) { return wstring(); } int requiredLen = MultiByteToWideChar(CP_UTF8, 0, text, -1, nullptr, 0); AssertCriticalWinApiResult(requiredLen); wchar_t* buffer = new wchar_t[requiredLen + 1]; AssertCriticalWinApiResult(MultiByteToWideChar(CP_UTF8, 0, text, -1, buffer, requiredLen)); wstring result(buffer); delete[] buffer; return result; }
string StringUtilities::GetUtf8StringFromChar(const wchar_t* text) { if(text == nullptr) { return string(); } int requiredLen = WideCharToMultiByte(CP_UTF8, 0, text, -1, nullptr, 0, nullptr, nullptr); AssertCriticalWinApiResult(requiredLen); char* buffer = new char[requiredLen + 1]; AssertCriticalWinApiResult(WideCharToMultiByte(CP_UTF8, 0, text, -1, buffer, requiredLen, nullptr, nullptr)); string result(buffer); delete[] buffer; return result; }
Gdiplus::Metafile* HoverIconButtonControl::LoadMetafileFromResource(DWORD resourceId) const { HRSRC hResource = FindResource(Instance, MAKEINTRESOURCE(resourceId), RT_RCDATA); AssertCriticalWinApiResult(hResource); DWORD imageSize = SizeofResource(Instance, hResource); AssertCriticalWinApiResult(imageSize); void* pResourceData = LockResource(LoadResource(Instance, hResource)); AssertCriticalWinApiResult(pResourceData); HGLOBAL globalBuffer = GlobalAlloc(GMEM_MOVEABLE, imageSize); AssertCriticalWinApiResult(globalBuffer); void* pBuffer = GlobalLock(globalBuffer); AssertCriticalWinApiResult(pBuffer); CopyMemory(pBuffer, pResourceData, imageSize); IStream* pStream = nullptr; Gdiplus::Metafile* metafile; if (CreateStreamOnHGlobal(globalBuffer, FALSE, &pStream) == S_OK) { metafile = new Gdiplus::Metafile(pStream); pStream->Release(); } else { throw SelectedTextTranslateException(L"Unable to CreateStreamOnHGlobal"); } GlobalUnlock(globalBuffer); GlobalFree(globalBuffer); return metafile; }
void HotKeyInputWindow::Initialize() { Size hotkeyInputSize = Size(width, lineHeight + padding * 2 + borderWidth * 2); descriptor = WindowDescriptor::CreateFixedWindowDescriptor(descriptor.GetPosition(), hotkeyInputSize); // Ensure that the common control DLL is loaded. INITCOMMONCONTROLSEX icex; icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_HOTKEY_CLASS; AssertCriticalWinApiResult(InitCommonControlsEx(&icex)); ChildWindow::Initialize(); SubclassNativeControl(); Render(); }
void NativeWindowHolder::Initialize() { WNDCLASSEX windowClass = { 0 }; if(className == nullptr) { throw SelectedTextTranslateFatalException(L"Window class name should be provided."); } if (!GetClassInfoEx(instance, className, &windowClass)) { windowClass.hInstance = instance; windowClass.lpszClassName = className; windowClass.lpfnWndProc = WindowProcedureWrapper; windowClass.cbSize = sizeof(WNDCLASSEX); windowClass.hCursor = LoadCursor(nullptr, IDC_ARROW); windowClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); SpecifyWindowClass(&windowClass); AssertCriticalWinApiResult(RegisterClassEx(&windowClass)); } }
LRESULT HoverButtonControl::WindowProcedure(UINT message, WPARAM wParam, LPARAM lParam) { TRACKMOUSEEVENT tme; tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.hwndTrack = Handle; tme.dwHoverTime = 10; switch (message) { case WM_LBUTTONUP: { if(state == ButtonStates::Disabled) { return TRUE; } state = ButtonStates::Hovered; Render(); OnClick.Notify(); return TRUE; } case WM_LBUTTONDOWN: { if (state == ButtonStates::Disabled) { return TRUE; } state = ButtonStates::Pressed; Render(); return TRUE; } case WM_MOUSEMOVE: { tme.dwFlags = TME_HOVER | TME_LEAVE; AssertCriticalWinApiResult(TrackMouseEvent(&tme)); return TRUE; } case WM_MOUSEHOVER: { if (state == ButtonStates::Normal) { state = ButtonStates::Hovered; Render(); SetCursor(LoadCursor(nullptr, IDC_HAND)); return TRUE; } break; } case WM_SETCURSOR: return TRUE; case WM_MOUSELEAVE: { if (state != ButtonStates::Normal && state != ButtonStates::Disabled) { state = ButtonStates::Normal; Render(); SetCursor(LoadCursor(nullptr, IDC_ARROW)); return TRUE; } break; } } return ControlView::WindowProcedure(message, wParam, lParam); }
Font::~Font() { AssertCriticalWinApiResult(DeleteObject(handle)); }
void HotKeyInputWindow::ShowCustomCaret() const { AssertCriticalWinApiResult(CreateCaret(windowHandle, (HBITMAP)nullptr, 1, lineHeight)); AssertCriticalWinApiResult(SetCaretPos(currentTextPoistion.GetX(), borderWidth + padding)); AssertCriticalWinApiResult(ShowCaret(windowHandle)); }
LRESULT HotKeyInputWindow::WindowProcedure(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_SETFOCUS: { hasFocus = true; RenderToBuffer(); ShowCustomCaret(); InvalidateRect(windowHandle, nullptr, TRUE); context->GetMessageBus()->SuspendHotkeys(); return TRUE; } case WM_KILLFOCUS: { hasFocus = false; RenderToBuffer(); AssertCriticalWinApiResult(HideCaret(windowHandle)); InvalidateRect(windowHandle, nullptr, TRUE); context->GetMessageBus()->EnableHotkeys(); return TRUE; } case WM_SETCURSOR: { SetCursor(LoadCursor(nullptr, IDC_IBEAM)); return TRUE; } case WM_PAINT: { PAINTSTRUCT ps; AssertCriticalWinApiResult(BeginPaint(GetHandle(), &ps)); Draw(false); EndPaint(GetHandle(), &ps); if (GetFocus() == windowHandle) { ShowCustomCaret(); } return TRUE; } case WM_KEYDOWN: case WM_KEYUP: { int procedureResult = CallBaseWindowProcedure(message, wParam, lParam); currentHotkey = SendMessage(windowHandle, HKM_GETHOTKEY, 0, 0); int virtualCode = LOBYTE(LOWORD(currentHotkey)); int modifier = HIBYTE(LOWORD(currentHotkey)); if(message == WM_KEYUP) { OnHotkeyChanged.Notify(currentHotkey); } else { bool isModifierInvalid = modifier == 0 || (modifier & HOTKEYF_EXT) == HOTKEYF_EXT; bool isKeyInvalid = virtualCode != 0 && MapVirtualKey(virtualCode, MAPVK_VK_TO_CHAR) == 0; if (isModifierInvalid || isKeyInvalid) { currentHotkey = 0; SendMessage(windowHandle, HKM_SETHOTKEY, 0, 0); } } RenderToBuffer(); return procedureResult; } } return ChildWindow::WindowProcedure(message, wParam, lParam); }