Example #1
0
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);
}
Example #2
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;
}
Example #6
0
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();
}
Example #7
0
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);
}
Example #9
0
Font::~Font()
{
    AssertCriticalWinApiResult(DeleteObject(handle));
}
Example #10
0
void HotKeyInputWindow::ShowCustomCaret() const
{
    AssertCriticalWinApiResult(CreateCaret(windowHandle, (HBITMAP)nullptr, 1, lineHeight));
    AssertCriticalWinApiResult(SetCaretPos(currentTextPoistion.GetX(), borderWidth + padding));
    AssertCriticalWinApiResult(ShowCaret(windowHandle));
}
Example #11
0
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);
}