2015-05-08 5 views
1

В настоящее время я работаю над завершением некоторого кода, переданного мне. Это было написано в MFC в Visual Studio 2005 года назад, было приостановлено, и теперь мне привозили.MFC щелкните мышью и переместите диалоговое окно перетаскивания/перетаскивания

Хотя я знаю C++, я провел последние ~ 2 месяца, изучая код и изучая MFC, и он начинает объединяться.

GUI для кода - это SWF-файл, встроенный в невидимое диалоговое окно. У меня нет исходного кода для SWF-файла, поэтому, вероятно, в будущем его повторить в WPF или что-то еще. У меня есть WMMode, установленный в «Window», потому что в Transparent/Opaque он не отображается должным образом, где он мигает/мигает каждый раз, когда происходит событие мыши.

Как бы то ни было, в Win XP/Vista работает щелчок и перетаскивание управления вспышкой. В Windows 7/8.1 он не будет двигаться.

С радостью предоставим всю необходимую информацию. Я все еще немного перегружен диалоговыми окнами MFC, поэтому не знаю, что вы все хотели бы увидеть.

Я нашел этот вопрос: Moving window by click-drag on a control

, который выглядит, как он решает многие проблемы. Тем не менее, я не хочу, чтобы весь элемент управления был доступен как таковой, только верхняя часть. К сожалению, в представлении ресурсов MS элемент управления ActiveX пуст, так как SWF загружается только во время выполнения; Я пытался найти ресурсы для такого рода вещей, но это очень сложно, поскольку я не уверен в технических терминах, которые нужно использовать.

EDIT

Я попытался это, создав очень простое приложение MFC, который имеет статический контроль текста и ничего больше. Я пытаюсь заставить его работать, нажав на статический текст (хотя я могу рисовать себя в угол, поскольку он не имеет встроенного события lButtonDown).

Вот соответствующий код:

class MyDialog : public CDialog 
{ 
public: 
    MyDialog(CWnd* pParent = NULL) : CDialog(MyDialog::IDD, pParent) 
    { } 
    // Dialog Data, name of dialog form 
    enum{ IDD = INTERFACE1 }; 
protected: 
    virtual void DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } 
    //Called right after constructor. Initialize things here. 
    virtual BOOL OnInitDialog() 
    { 
     CDialog::OnInitDialog(); 
     pText = (CStatic *)GetDlgItem(ID_TEXT); 

     pText->SetWindowTextW(_T("Hello World!")); 

     return true; 
    } 

    afx_msg void OnLButtonDown(UINT nFlags, CPoint point); 

private: 
    CStatic * pText; 

public: 
    DECLARE_MESSAGE_MAP() 
}; 

BEGIN_MESSAGE_MAP(MyDialog, CDialog) 
    ON_WM_LBUTTONDOWN() 
END_MESSAGE_MAP() 

Переопределенный Метод:

afx_msg void MyDialog::OnLButtonDown(UINT nFlags, CPoint point) 
{ 
    CWnd::OnNcLButtonDown(HTCAPTION, point); 

} 

Я также попытался установить nFlags в 0x2, вызывая OnLButtonDown (в отличие от onNcLButtonDown), различные другие вещи. Сообщение срабатывает, но окно не перемещается (оно перемещается из строки заголовка, как обычно). Что мне не хватает?

+1

Так что, похоже, вы решили проблему. Вы переопределяете OnLButtonDown и передаете WM_NCLBUTTONDOWN. Если вы хотите только это, можно сказать, что верхняя часть окна, а затем проверить положение мыши и ничего не делать, если мышь не в нужном месте? –

+0

Спасибо за ответ. Я отредактировал свой пост выше, можете ли вы представить какое-либо дальнейшее понимание? – Moe45673

ответ

3

На самом деле, давайте попробуем этот код вместо ON_WM_NCHITTEST(). Это приведет к перетаскиванию диалогового окна, если вы щелкните мышью в любом месте клиентской области (область клиента действует как подпись). Есть строка rc.bottom = rc.top + 100, если вы раскомментируете ее, она будет перетаскиваться, только если вы нажмете верхнюю часть (я выбрал номер 100 в случайном порядке).

//declare: 
afx_msg LRESULT OnNcHitTest(CPoint point); 

BEGIN_MESSAGE_MAP(MyDialog, CDialog) 
    ON_WM_NCHITTEST() 
END_MESSAGE_MAP() 

LRESULT MyDialog::OnNcHitTest(CPoint point) 
{ 
    ScreenToClient(&point); 

    CRect rc; 
    GetClientRect(&rc); 

    //rc.bottom = rc.top + 100; 

    if (rc.PtInRect(point)) 
     return HTCAPTION; 

    return CDialog::OnNcHitTest(point); 
} 

Второй вариант: Если мы хотим, чтобы переместить диалоговое окно, нажав на дочерний элемент управления, и если это управление захватывает мышь, затем попробуйте этот метод. *** Обратите внимание: проверьте, правильно ли работает элемент управления после его перемещения.

BOOL MyDialog::PreTranslateMessage(MSG *msg) 
{ 
    if (msg->message == WM_MOUSEMOVE && (msg->wParam & MK_LBUTTON)) 
    { 
     CPoint p; 
     GetCursorPos(&p); 
     CRect r; 
     ActiveX->GetWindowRect(&r); 
     if (r.PtInRect(p)) 
     { 
      ReleaseCapture(); 
      SendMessage(WM_NCLBUTTONDOWN, HTCAPTION, 0); 
      SendMessage(WM_NCLBUTTONUP, HTCAPTION, 0); 
      return 1; 
     } 
    } 
    return CDialogEx::PreTranslateMessage(msg); 
} 
+0

Очень круто, спасибо! Он фактически работает только на пустой клиентской области, но созданный мной элемент управления Static Text игнорирует все команды щелчка и перемещения. Однако это дает мне возможность поиграть. Большое спасибо за помощь, я отправлю обратно с дальнейшими наблюдениями! – Moe45673

+0

Я думаю, что неправильно понял. У вас есть сторонний элемент управления в диалоговом окне, и вы хотите переместить весь диалог, нажав на сторонний элемент управления? Для этого вам может понадобиться крючок. –

+0

«нужен крючок для этого»? Что вы имеете в виду? – Moe45673