• Как правильно нарисовать линию в WINAPI?

    SerJook
    @SerJook
    кодер
    Несколько комментариев по вашему коду:

    Переменные Pen, ptPrevious, fDraw не сохраняются между вызовами функции, сделайте их статическими или глобальными. В текущем варианте ваш код создает ОГРОМНОЕ количество GDI-объектов.

    static HPEN Pen =  CreatePen(PS_SOLID, 3, RGB(0, 0, 255));
    static BOOL fDraw = FALSE;
    static POINT ptPrevious = { 0, 0 };


    При обработке WM_PAINT нельзя использовать GetDC(). Если вы не заметили, это нагружает процессор.
    Правильно будет использовать BeginPaint() и EndPaint();

    case WM_PAINT: {
            PAINTSTRUCT ps;
            hdc = BeginPaint(hWnd, &ps);
            // TODO: рисовать здесь
            EndPaint(hWnd, &ps);
            break;
        }


    Чтобы нарисованное не стиралось при обновлении окна, вам надо рисовать в Back Buffer (не знаю, как это по-русски). Для этого вам надо создать BITMAP c помощью CreateCompatibleBitmap, HDC с помощью CreateCompatibleDC, загрузить в созданный HDC BITMAP с помощью SelectObject, и рисовать на HDC. Потом вызывать BitBlt и копировать бэкбуфер в реальный HDC окна (внутри обработчика WM_PAINT).
    Другой вариант (без back buffer): сохраняйте координаты ваших линий в некий массив, и выводите их все в обработчике WM_PAINT.

    Если же вам не нужно, чтоб нарисованное не стиралось, просто уберите обработчик WM_PAINT.

    Еще небольшая придирка: вместо LOWORD(lParam) при получении координат надо использовать GET_X_LPARAM и GET_Y_LPARAM.

    ptPrevious.x = GET_X_LPARAM(lParam);
    ptPrevious.y = GET_Y_LPARAM(lParam);
    Ответ написан
    1 комментарий
  • Как отредактировать metadata jpeg файла-например поле Software?

    SerJook
    @SerJook
    кодер
    Можно попробовать PEL: PHP Exif Library.

    use \lsolesen\pel\PelJpeg;
    use \lsolesen\pel\PelTag;
    
    $jpeg = new PelJpeg("test.jpg");
    $ifd0 = $jpeg->getExif()->getTiff()->getIfd();
    $entry = $ifd0->getEntry(PelTag::SOFTWARE);
    if ($entry !== null){
        $entry->setValue('Edited by PEL');
    }
    $jpeg->saveFile("test_out.jpg");
    Ответ написан
    Комментировать
  • Как к четырем элементам массива добавить ещё два?

    SerJook
    @SerJook
    кодер
    Используйте std::vector.

    #include <iostream>
    #include <conio.h>
    #include <vector>
    using namespace std;
    
    int main()
    {
        int rez;
        int arr_src[] = {1,8,3,2};
        std::vector<int> arr(arr_src, arr_src + sizeof(arr_src)/sizeof(arr_src[0]));
    
        arr.push_back(7);
        arr.push_back(8);
    
        rez = arr.size();          //кол-во элементов в массиве
        cout << rez << endl;
    
        for (int i = 0; i < rez; i++)
            cout << arr[i] << ' ';
    
        getch();
        return 0;
    }


    Еще у вас ошибка в условии выхода из цикла.
    Ответ написан
    Комментировать
  • Почему нельзя перегрузить оператор?

    SerJook
    @SerJook
    кодер
    В целях оптимизации памяти стандарт языка C++ называет vector<bool> специальным стандартным контейнером, в котором каждый элемент bool использует только один бит памяти вместо того, чтобы занимать 1 байт, как занимает обычный bool. Ценой этой оптимизации является то, что этот контейнер не предоставляет всех возможностей и интерфейс, как это делает нормальный стандартный контейнер.

    Т.к. мы не можем получить адрес отдельного бита в байте, такие вещи, как operator[] не могут вернуть bool&, а вместо этого возвращают прокси-объект, который позволяет манипулировать отдельным битом. Этот прокси не является типом bool&, вы не можете присвоить его адрес указателю с типом bool*, как вы могли бы сделать с "нормальным" контейнером. Это означает что bool &pb =v[0] не является валидным кодом.
    Ответ написан
    Комментировать
  • Почему не передаются данные в getJSON (JQuery), источником которых является var_dump?

    SerJook
    @SerJook
    кодер
    Вызова var_dump тут не должно быть. Она портит вывод.
    Скорее всего, функция getMakes() должна возвращать некий массив данных.
    $arr = [];
    while($el = $rsData->fetch()){
          $arr[] = $el;
    }
    return $arr;
    Ответ написан
    6 комментариев
  • Как в c++ совместить свойства и лямба функции?

    SerJook
    @SerJook
    кодер
    Не получится это сделать.
    Согласно синтаксису свойства (property) после слова get должно идти имя функции и ни что иное.
    __declspec( property( get=get_func_name, put=put_func_name ) ) declarator

    Когда компилятор видит обращение к этому полю, он заменяет его на обращение к функциям get или put.
    Ответ написан
  • Как засунуть Content-Type audio/mpeg в плеер?

    SerJook
    @SerJook
    кодер
    Генерируйте плейлист (к примеру M3U-файл) с единственной записью, ссылающейся на ваш скрипт, и предлагайте скачать

    <?php
    header("Content-Type: audio/x-mpegurl");
    header("Content-Disposition: attachment; filename=\"playlist.m3u\""); ?>
    #EXTM3U
    
    #EXTINF:-1, Stream name
    http://example.com/stream.php
    Ответ написан
    Комментировать
  • Как выбрать элементы, которые не перечёркнуты?

    SerJook
    @SerJook
    кодер
    foreach($html->find('div.span4 p a') as $e) {
        if (preg_match('/text-decoration:\sline-through/i', $e->style)) {
            continue;
        }
        echo $e->innertext . '<br>';
        echo $e->href . '<br>';
        echo '<br>';
    }
    Ответ написан
  • Можно ли вывести список enum?

    SerJook
    @SerJook
    кодер
    На чистых плюсах решения получаются трудно поддерживаемыми, можно воспользоваться библиотекой better-enums.

    #include "enum.h"
    
    BETTER_ENUM(etype, int, laborer, secretary, manager, accountant, executive, researcher);
    
    //...
    struct employee {
        int number;
        float pension;
        etype post = etype::laborer;
        date start;
    };
    
    int main()
    {
        //... пропущено
        for (etype i : etype::_values())
        {
            std::cout << i << " ";
        }
        std::cout << std::endl;
        std::string etypeStr;
        std::cin >> etypeStr;
        first.post = etype::_from_string(etypeStr.c_str());   
    }
    Ответ написан
    Комментировать
  • [C++] Как получить размер и длительность аудиофайла по URL?

    SerJook
    @SerJook
    кодер
    Можно воспользоваться библиотекой ffmpeg. Для этого эта библиотека должна быть собрана с поддержкой сети. Для соединений https нужно собрать с поддержкой openssl.

    Вот приблизительный код, который получает длительность и размер файла:

    extern "C"
    {
    #include <libavcodec/avcodec.h>
    #include <libavformat/avformat.h>
    }
       
    ... 
    const char    *url = "http://localhost/test.mp3";
    AVFormatContext *pFormatCtx = NULL;
    int ret = avformat_open_input(&pFormatCtx, url, NULL, NULL);
    if (ret >= 0) {
            avformat_find_stream_info(pFormatCtx, NULL);
            int seconds = (pFormatCtx->duration / AV_TIME_BASE);
            int64_t size = avio_size(pFormatCtx->pb);
            avformat_close_input(&pFormatCtx);
            avformat_free_context(pFormatCtx);
    }


    Как показала практика, этот код не скачивает файл полностью, а лишь начальный кусок.
    Ответ написан
    1 комментарий
  • Как настроить перерисовку окна диалога при его деактивации [MFC C++]?

    SerJook
    @SerJook
    кодер
    Попробуйте переопределить ON_WM_NCACTIVATE и ON_WM_ACTIVATE:

    void CMFCApplication1Dlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) {
        Default();
    }
    
    BOOL CMFCApplication1Dlg::OnNcActivate(BOOL active)
    {
        if (m_nFlags & WF_STAYACTIVE)
            active = TRUE;
        return(BOOL)DefWindowProc(WM_NCACTIVATE, active, 0L);
    }


    Взято отсюда: https://stackoverflow.com/questions/53768653/mfcs-...
    Ответ написан
    Комментировать
  • Работа с графикой. С++ builder. Как нарисовать рамку вокруг рисунка?

    SerJook
    @SerJook
    кодер
    В зависимости от того, какая рамка вам нужна, я сделал в классе MyBitmap 2 метода: AddBorderOutside() и AddBorderInside().
    Я без понятия, скомпилируется ли код в C++ Builder, потому что я использовал Visual Studio.

    Код под спойлером
    #include <fstream>
    #include <ios>
    #include <ctime>
    #include <iostream>
    #include <windows.h>
    
    class MyBitmap {
        BITMAPFILEHEADER header_;
        BITMAPINFOHEADER info_;
        bool loaded_;
        char* pixels_;
        size_t data_size_;
        size_t row_padded_;
    public:
        MyBitmap(const char* fileName) {
            loaded_ = false;
            pixels_ = 0;
            std::ifstream bmp(fileName, std::ios::binary);
            if (!bmp) {
                return;
            }
            bmp.read((char*)&header_, sizeof(header_));
            if (!bmp) {
                return;
            }
            if (header_.bfType != 'MB') {
                std::cout << "Format is not supported" << std::endl;
                return;
            }
            bmp.read((char*)&info_, sizeof(info_));
    
            if (!bmp) {
                return;
            }
    
            if (info_.biBitCount != 24) {
                std::cout << "Format is not supported" << std::endl;
                return;
            };
    
            row_padded_ = (info_.biWidth * 3 + 3) & (~3);
            int height = info_.biHeight; 
            data_size_ = row_padded_ * height;
            pixels_ = new char[data_size_];
            bmp.read(pixels_, data_size_);
    
            if (bmp) {
                loaded_ = true;
            }
            return;
        }
    
        bool Save(const char* fileName) {
            if (!loaded_) {
                return false;
            }
            std::ofstream f(fileName, std::ios::binary);
            
            if (!f) {
                return false;
            }
            f.write((char*)&header_, sizeof(header_));
            f.write((char*)&info_, sizeof(info_));
            f.write(pixels_, data_size_);
            if (f) {
                return true;
            }
            return false;
        }
    
        void AddBorderInside(int borderSize = 15) {
            for (int i = 0; i < info_.biWidth; i++) {
                for (int j = 0; j < info_.biHeight; j++) {
                    if (i < borderSize || i >= info_.biWidth - borderSize 
                        || j < borderSize || j >= info_.biHeight - borderSize) {
                        int pos = row_padded_* j + i * 3;
                        pixels_[pos] = rand() % 256;
                        pixels_[pos + 1] = rand() % 256;
                        pixels_[pos + 2] = rand() % 256;
                    }
                }
            }
        }
    
        void AddBorderOutside(int borderSize = 15) {
            int new_width = info_.biWidth + borderSize * 2;
            int new_row_padded = (new_width * 3 + 3) & (~3);
            int new_height = info_.biHeight + borderSize * 2;
            int new_data_size = new_row_padded * new_height;
    
            char* new_pixels_ = new char[new_data_size];
            for (int i = 0; i < info_.biHeight; i++) {
                int old_pos = row_padded_* i;
                int new_pos = new_row_padded * (borderSize+i) +3 * borderSize;
                memcpy(new_pixels_ + new_pos, pixels_ + old_pos, info_.biWidth * 3);
            }
    
            delete[] pixels_;
            info_.biWidth = new_width;
            info_.biHeight = new_height;
            pixels_ = new_pixels_;
            row_padded_ = new_row_padded;
            data_size_ = new_data_size;
            AddBorderInside(borderSize);
        }
    
        bool IsLoaded() const {
            return loaded_;
        }
    
        ~MyBitmap() {
            delete[] pixels_;
        }
    
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        srand(time(0));
        MyBitmap bmp("input.bmp");
    
        if (!bmp.IsLoaded()) {
            std::cout << "Unable to load bitmap" << std::endl;
            return 1;
        }
        bmp.AddBorderOutside();
        if (!bmp.Save("output.bmp")) {
            std::cout << "Unable to save bitmap" << std::endl;
        }
    	return 0;
    }
    Ответ написан
    Комментировать
  • Qt checkbox this combobox?

    SerJook
    @SerJook
    кодер
    Посмотрите, как сделано здесь
    https://habr.com/ru/post/215289/
    Ответ написан
    Комментировать
  • Как передать cookies из WinInet в WinSock?

    SerJook
    @SerJook
    кодер
    Сначала посылаете запрос с помощью WinInet, потом вызываете функцию InternetGetCookie с нужным вам URL и получаете куки. Но учтите, что она может вернуть не все куки:

    InternetGetCookie does not return cookies that the server marked as non-scriptable with the "HttpOnly" attribute in the Set-Cookie header.


    Полученные таким образом куки отправляете через сокеты (Добавив в заголовки запроса HTTP-заголовок "Cookie")
    Ответ написан
    Комментировать
  • Как сделать приложение независимым от VC++ Redistributable?

    SerJook
    @SerJook
    кодер
    Подключай статический рантайм, и тогда не будет зависимости.
    Свойства солюшена -> C\C++ -> Code generation -> Runtime Library -> Multi-threaded (/MT)
    5c461267175c3212801722.png
    Ответ написан
  • Как обратиться к php переменной в js?

    SerJook
    @SerJook
    кодер
    Что мешает конвертировать $result в json и передать во вьюшку, а потом в js файле использовать эти данные?
    Или сделать AJAX запрос.
    Ответ написан
    Комментировать
  • Как организовать хранение токенов для нескольких пользователей в Google client?

    SerJook
    @SerJook
    кодер
    Я не увидел, где у вас тут множество пользователей. Вы имеете в виду множество пользователей вашего сайта?
    Вы храните данные в сессии, у каждого своя сессия, поэтому по идее они не должны пересекаться.

    Во-первых, вы не проверяете то, что вернул вам вызов $client->authenticate($_REQUEST['code']);
    а сразу пишете результат в сессию.
    Сделайте проверку вроде
    if (isset($token['access_token'])) { }

    Потом, надо обновлять access token, если истек срок действия. Что-то вроде:

    $client->setAccessToken($_SESSION['accessToken']);
    
    if ($client->isAccessTokenExpired()) {
            $new_token = $client->refreshToken(null);
            if (isset($new_token['access_token'])) {
                $_SESSION['accessToken'] = $new_token;
            }
    }
    Ответ написан
    Комментировать
  • Как развернуть сокращенную ссылку ВК?

    SerJook
    @SerJook
    кодер
    Первую ссылку можно расшифровать без перехода по ней.
    Потом выполнять запросы с выключенным CURLOPT_FOLLOWLOCATION.
    Естественно надо проверять на ошибки и возможно зациклить.
    <?php
    function get_location($ch, $output){
        $curl_info = curl_getinfo($ch);
        $headers = substr($output, 0, $curl_info["header_size"]); //split out header
        preg_match("!\r\n(?:Location|URI): *(.*?) *\r\n!", $headers, $matches);
        return $matches[1];
    }
    $link = "https://vk.com/away.php?to=https%3A%2F%2Fvk.cc%2F8L3cD8&post=-75604109_25935&cc_key=";
    $arr = parse_url($link);
    parse_str($arr['query'], $output);
    
    $vk_cc_link = $output['to'];
    
    $ch = curl_init();
    
    curl_setopt($ch, CURLOPT_URL, $vk_cc_link);
    // Я задал эти параметры, потому что у меня на локалхосте не настроен SSL
    //curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
    //curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
    curl_setopt($ch, CURLOPT_HEADER, true);
    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
    $output = curl_exec($ch);
    
    $link = get_location($ch, $output);
    
    $arr = parse_url($link);
    
    parse_str($arr['query'], $out);
    $new_link = $out['to'];
    curl_setopt($ch, CURLOPT_URL, $new_link);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
    $output = curl_exec($ch);
    $link = get_location($ch, $output);
    echo $link;
    ?>


    Должно вывести:
    https://boom.ru/redirect/album/6101146?web=1
    Ответ написан
    1 комментарий
  • Как отображать поисковый запрос на localhost?

    SerJook
    @SerJook
    кодер
    Можно было бы настроить прокси, но яндекс блокирует автоматические запросы и проверяет домен.
    Можно было бы открыть яндекс в iframe, но яндекс блокирирует открытие своего сайта в iframe.
    Можно попробовать использовать XML API яндекса https://tech.yandex.ru/xml/ и выводить результаты, как вы хотите. Но там много ограничений.
    Может быть вам нужен поиск яндекса для сайта? https://site.yandex.ru/
    Ответ написан
    Комментировать
  • Как добавить нули к строке / числу на php?

    SerJook
    @SerJook
    кодер
    str_pad($num, 10, '0');
    Ответ написан
    Комментировать