mfc drag & drop

Тема в разделе "WASM.BEGINNERS", создана пользователем tr4b, 11 сен 2017.

  1. tr4b

    tr4b New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2017
    Сообщения:
    8
    Всем привет.
    Первый раз работаю с mfc.
    Делаю приложение для объединения изображений и дальнейшей печати, т.к. устал пользоваться фотошопом :)
    Использую visual studio community 2017, приложение на MFC, элемент формы Picture control, по сути IDC_STATIC.
    Как сделать чтобы загрузка картинки происходила при бросании картинки на элемент формы?( пока сделал загрузку просто через EditBrowse ).
    Гуглил но ничего внятного так и не нашел, обработки WM_DROP нету, вобще задача начала казаться довольно сложной в рамках решения ее в MFC.
    Может кто что посоветует кроме MFC, где будет проще и интуитивней ?
    2017 год, а возникают такие сложности с drag & drop картинки :)
    В идеале хочется сделать типа альбома, куда можно просто и быстро бросать картинки.
     
    Последнее редактирование: 11 сен 2017
    yashechka нравится это.
  2. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Обожая MFC+ VS6+2003+2005+2008. Дальше уже нет :)
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    tr4b,
    Начни с WM_DROPFILES
     
    yashechka нравится это.
  4. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    Сейчас два основных направления гуеделания - wpf (но он на вражеском .net) и qt . MFC - это страх и ужас.
    Был раньше борланд ещё весьма ничего, но он , похоже, всё.
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Обычный winapi, только в классы обернут. А, ну да... :)
     
  6. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Да ну нафик. Вот мне наоборот не нравится ни делфи ни борланд си - считаю их для девочек. Другое дело MFC и QT. Ещё есть WxWidgets. Но я его не пробовал. Вообще классно создавать нестандартные интерфейсы на MFC. Давно не работал ни с MFC и QT, нужно что-нибудь написать годное чтобы все пользовались.:boast::boast::boast:
     
  7. tr4b

    tr4b New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2017
    Сообщения:
    8
    rmn, спасибо разобрался.

    В свой класс диалога нужно добавить OnInitDialog и разрешить прием файлов.

    Код (Text):
    1.  
    2. BOOL CPageImageAddDialog::OnInitDialog()
    3. {
    4.    DragAcceptFiles();
    5.  
    6.    CWnd *m_picture = (CStatic *)GetDlgItem( IDC_STATICIMAGELEFT );
    7.  
    8.    if ( m_picture )
    9.    {
    10.      m_picture->DragAcceptFiles( TRUE ); // это можно в свойствах разрешить у IDC_STATICIMAGELEFT
    11.    }
    12.    return 0;
    13. }
    14.  
    так же добавить в MESSAGE_MAP диалога строку ON_WM_DROPFILES() и добавить уже сам обработчик afx_msg void CPageImageAddDialog::OnDropFiles( HDROP hDropInfo ).

    Все работает, так же читал что могут быть проблемы с сообщениями( WM_* ) из за UAC, если у приложения недостаточно прав.( я этого не проверял )

    нарыл такой код для обхода

    Код (Text):
    1.  
    2. ChangeWindowMessageFilter (WM_DROPFILES, MSGFLT_ADD);
    3. ChangeWindowMessageFilter (WM_COPYDATA, MSGFLT_ADD);
    4. ChangeWindowMessageFilter (0x0049, MSGFLT_ADD);
    5.  
    6.  
    7.  
     
    yashechka нравится это.
  8. tr4b

    tr4b New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2017
    Сообщения:
    8
    Хотя нет, продолжил разбираться и понял что наврал :)
    drag&drop работает, но если перетаскивать файл на окно(IDC_STATIC), где включена приемка файлов DragAcceptFiles( TRUE ), то OnDropFiles не вызывается, но за всей областью окна срабатывает
     
  9. tr4b

    tr4b New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2017
    Сообщения:
    8
    Вобщем решил проблему через установку в диалог своего обработчика PreTranslateMessage, в котором уже ловлю WM_DROPFILES, а по hWnd могу точно определять какому окну идет файл, без всяких DragDetect.