Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Popup menu не скрывается! 
V
    Опции темы
zhekha
Дата 31.10.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



Код

class CTrayIcon : public CWindowImpl<CTrayIcon, CWindow, CNullTraits>, public MonitorManager {
private:
        HWND hParentWnd;

        HICON onIcon;
        HICON offIcon;
        HICON msgsOnIcon;
        HICON msgsOffIcon;

        int sessionOnFlag;
    
        NOTIFYICONDATA trayData;
    
        CString tip;
    
        CMenu menu;

        MonitorController* mainDlg;

    enum { UWM_APP_NOTIFYTRAYICON = WM_APP };
private:
        void showParentWindow();

        void hideParentWindow();

        void loadStartedTrayView();

        void loadStoppedTrayView();
public:
    DECLARE_WND_CLASS(NULL)

    BEGIN_MSG_MAP_EX(CTrayIcon)
        MESSAGE_HANDLER_EX(UWM_APP_NOTIFYTRAYICON, OnNotifyTrayIcon)
        MSG_WM_DESTROY(OnDestroy)
        MSG_WM_CREATE(OnCreate)

        COMMAND_ID_HANDLER_EX(ID_MENU_EXIT, OnMenuExit)
        COMMAND_ID_HANDLER_EX(ID_MENU_START, OnMenuStart)
        COMMAND_ID_HANDLER_EX(ID_MENU_STOP, OnMenuStop)
    END_MSG_MAP()

        CTrayIcon(MonitorController *c);

        virtual ~CTrayIcon();

        LRESULT OnNotifyTrayIcon(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam);

        void OnDestroy();

        LRESULT OnCreate(LPCREATESTRUCT lParam);

        LRESULT OnMenuExit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/);

        LRESULT OnMenuStart(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/);

        LRESULT OnMenuStop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/);

        void showOnTrayIcon();

        void showOffTrayIcon();

        void addTrayIcon();

        void deleteTrayIcon();
};

Код

TrayIcon::CTrayIcon(MonitorController *c) : MonitorManager(c) {

    mainDlg = c;

    sessionOnFlag = 0;

    ZeroMemory(&trayData, sizeof(trayData));
    trayData.cbSize = sizeof(trayData);

    onIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDI_ON), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);

    offIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDI_OFF), 
        IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);

    menu.LoadMenu(IDR_MENU_TRAY_START);
    tip.LoadString(IDS_TRAYICON_OFF);
}

CTrayIcon::~CTrayIcon() {
    ::DestroyIcon(onIcon);
    ::DestroyIcon(offIcon);
    menu.DestroyMenu();
}

LRESULT CTrayIcon::OnCreate(LPCREATESTRUCT lParam) {

    hParentWnd = lParam->hwndParent;
    ShowWindow(SW_HIDE);
    addTrayIcon();
        
    return 0;
}

void CTrayIcon::OnDestroy() {
    //deleteTrayIcon();
}

LRESULT CTrayIcon::OnMenuExit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/) {
//    showParentWindow();
    //::MessageBox(NULL, "exit", "", MB_OK);
    exit();
    return 0;
}

LRESULT CTrayIcon::OnMenuStart(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/) {
//    showParentWindow();
    //::MessageBox(NULL, "start", "", MB_OK);
    startSession();
    return 0;
}

LRESULT CTrayIcon::OnMenuStop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/) {
//    showParentWindow();
    //::MessageBox(NULL, "stop", "", MB_OK);
    stopSession();
    return 0;
}

LRESULT CTrayIcon::OnNotifyTrayIcon(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam) {    
    
    switch (lParam) {
        case WM_LBUTTONDOWN:
            if (::IsWindowVisible(hParentWnd)) {
                hideParentWindow();
            } else {
                showParentWindow();
            }
            break;
        case WM_MOUSEMOVE:
            break;
        case WM_RBUTTONUP:
            CMenuHandle submenu = menu.GetSubMenu(0);
            POINT pos;
            GetCursorPos(&pos);
            submenu.TrackPopupMenu(TPM_CENTERALIGN, pos.x, pos.y, m_hWnd);
            break;
    }
    
    return TRUE;
}

void CTrayIcon::addTrayIcon() {
    trayData.uFlags = NIF_ICON | NIF_MESSAGE;
    trayData.hIcon = offIcon;
    trayData.hWnd = m_hWnd;
    trayData.uCallbackMessage = UWM_APP_NOTIFYTRAYICON;
    ::Shell_NotifyIcon(NIM_ADD, &trayData);
}

void CTrayIcon::deleteTrayIcon() {
    ::Shell_NotifyIcon(NIM_DELETE, &trayData);
}

void CTrayIcon::showOnTrayIcon() {
    trayData.uFlags = NIF_ICON;
    trayData.hIcon = onIcon;
    ::Shell_NotifyIcon(NIM_MODIFY, &trayData);
    loadStartedTrayView();
}

void CTrayIcon::showOffTrayIcon() {
    trayData.uFlags = NIF_ICON;
    trayData.hIcon = offIcon;
    ::Shell_NotifyIcon(NIM_MODIFY, &trayData);
    loadStoppedTrayView();
}

void CTrayIcon::showParentWindow() {
    ::BringWindowToTop(hParentWnd);
    ::ShowWindow(hParentWnd, SW_RESTORE);
    ::SetForegroundWindow(hParentWnd);
}

void CTrayIcon::hideParentWindow() {
    ::ShowWindow(hParentWnd, SW_HIDE);
}

void CTrayIcon::loadStartedTrayView() {
    menu.DestroyMenu();
    menu.LoadMenu(IDR_MENU_TRAY_STOP);
    tip.LoadString(IDS_TRAYICON_ON);
    sessionOnFlag = 1;
}

void CTrayIcon::loadStoppedTrayView() {
    menu.DestroyMenu();
    menu.LoadMenu(IDR_MENU_TRAY_START);
    tip.LoadString(IDS_TRAYICON_OFF);
    sessionOnFlag = 0;
}


MonitorManager - абстрактный класс от которого наследуется и CMainDlg

Ситуация такая: если кликаем по иконке в трее правой кнопкой мыши - появляется всплывающее меню и не хочет исчезать при щелчке левой кнопкой где-нибудь, помимо этого меню. Но при щелчке по диалогу CMainDlg оно все-таки исчезает! (При щелчке, например, по окну другого приложения - по-прежнему висит около трея) В чем проблема - может кто сталкивался?!


Это сообщение отредактировал(а) zhekha - 31.10.2007, 13:22
PM MAIL   Вверх
Andrey44
Дата 31.10.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



Сразу после показа меню делай
Код

PostMessage(hWnd, WM_NULL, 0, 0);


Должно помочь smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
zhekha
Дата 31.10.2007, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



Вставил сюда:
Код

case WM_RBUTTONUP:
            CMenuHandle submenu = menu.GetSubMenu(0);
            POINT pos;
            GetCursorPos(&pos);
            submenu.TrackPopupMenu(TPM_CENTERALIGN, pos.x, pos.y, m_hWnd);
            ::PostMessage(m_hWnd, WM_NULL, 0, 0);
            break;

Не помогло.  smile 

Это сообщение отредактировал(а) zhekha - 31.10.2007, 14:34
PM MAIL   Вверх
Andrey44
Дата 31.10.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



Даже не знаю. У меня все работало
Код

if(lParam==WM_RBUTTONDOWN){
            SetForegroundWindow(hWnd);
            POINT ptcur;GetCursorPos(&ptcur);
            HMENU hMenu=CreatePopupMenu();
            AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
            
            AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
            UINT Command=TrackPopupMenuEx(hMenu,TPM_RETURNCMD | TPM_VERTICAL,ptcur.x,ptcur.y,hWnd,0);
            PostMessage(hWnd, WM_NULL, 0, 0);



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
zhekha
Дата 1.11.2007, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



Нашел "косяк"!!! С утра на свежую голову...
Проблема была в строчке:
Код

SetForegroundWindow(hWnd);

Точнее, в том, что у меня ее не было, а
Код

::PostMessage(m_hWnd, WM_NULL, 0, 0);

не понадобилось...

Это сообщение отредактировал(а) zhekha - 1.11.2007, 06:50
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.