Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка TVN_ITEMEXPANDED 
V
    Опции темы
dMaxis
Дата 7.4.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здраствуйте, уважаемые форумчане.
При написании своего приложения на WinAPI возникла у меня следующая проблема.
Создаю на главном окне два TreeView один находится непосредственно на окне (т.е. родителем является главное окно), а второй находится на компоненте STATIC, родителем которого является главное окно (TreeView parent - STATIC, Static parent - главное окно).
Вопрос заключается в следующем: как мне в главном окне обработать TVN_ITEMEXPANDED от второго TreeView?

Код

#include <windows.h>
#include <commctrl.h>
#include <tchar.h>

#pragma comment(lib,"comctl32.lib")

BOOL RegClass(WNDPROC,LPCTSTR,UINT);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE hInstance;
TCHAR szClass[]=_T("MainWindow");

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpszCmdLine, int nCmdShow)
{
        MSG msg;
        HWND hwnd;
        ::hInstance=hInstance;

        if(!RegClass(WndProc,szClass,COLOR_APPWORKSPACE))return FALSE;
        hwnd=CreateWindow(szClass,
                          _T("TreeView"),
                          WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,
                          CW_USEDEFAULT,CW_USEDEFAULT,
                          CW_USEDEFAULT,CW_USEDEFAULT,
                          0,0,hInstance,NULL);
        if(!hwnd)return FALSE;

        ShowWindow(hwnd,SW_SHOWMAXIMIZED);

        INITCOMMONCONTROLSEX init;
        init.dwSize=sizeof(INITCOMMONCONTROLSEX);
        init.dwICC=ICC_TREEVIEW_CLASSES;
        InitCommonControlsEx(&init);

        while(GetMessage(&msg,0,0,0))
        {
    TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return msg.wParam;
}

BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground)
{
        WNDCLASSEX wc;
        wc.cbSize=sizeof(wc);
        wc.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
        wc.cbClsExtra=0;
        wc.cbWndExtra=0;
        wc.lpfnWndProc=Proc;
        wc.hInstance=hInstance;
        wc.hIcon=wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
        wc.hCursor=LoadCursor(NULL,IDC_ARROW);
        wc.hbrBackground=(HBRUSH)(brBackground);
        wc.lpszMenuName=NULL;
        wc.lpszClassName=szName;
        return (RegisterClassEx(&wc)!=0);
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
        static HWND hTreeview, hPanel, hTreeviewP;
        switch(msg)
        {
        case WM_CREATE:
        {
    //---------------------------Treeview
    hTreeview=CreateWindowEx(0,WC_TREEVIEW,TEXT("Tree View"),
                            WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|
            TVS_HASLINES|TVS_HASBUTTONS|TVS_TRACKSELECT|TVS_SHOWSELALWAYS|TVS_LINESATROOT,
                            10,10,300,300,
                            hwnd,NULL,hInstance,NULL);
            .................................
            .................................
    //--------------------Treeview in panel
    hPanel=CreateWindowEx(WS_EX_STATICEDGE,_T("Static"),_T(""),
            WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|ES_READONLY|ES_CENTER,
            360,10,350,350,hwnd,0,hInstance,NULL);
    hTreeviewP=CreateWindowEx(0,WC_TREEVIEW,TEXT("Tree View"),
                            WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|
            TVS_HASLINES|TVS_HASBUTTONS|TVS_TRACKSELECT|TVS_SHOWSELALWAYS|TVS_LINESATROOT,
                            10,10,300,300,hPanel,NULL,hInstance,NULL);
            ............................................
            ............................................
            break;
        }
        case WM_NOTIFY:
        {
            LPNMHDR lpnm=(LPNMHDR)lParam;
            switch (lpnm->code)
            {
            case TVN_ITEMEXPANDED:
        {  MessageBox(hwnd,_T("TREEVIEW"),_T("PROG"),MB_OK);
            break;}
            }
            break;
        }
        case WM_DESTROY:
        {  PostQuitMessage(0);
            break;}
     }
     return DefWindowProc(hwnd, msg, wParam, lParam);
}

PM MAIL   Вверх
586
Дата 7.4.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Придётся делать субклассинг для hPanel. И в перехваченной поцедуре обрабатывать события TreeView.
Код
SetWindowLong(hPanel, GWL_WNDPROC, ...);

Посмотри в гугле, там много примеров.
PM   Вверх
Earnest
Дата 8.4.2009, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(586 @  7.4.2009,  17:47 Найти цитируемый пост)
И в перехваченной поцедуре обрабатывать события TreeView.

Или просто транслировать их главному окну.


--------------------
...
PM   Вверх
Dem_max
Дата 8.4.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А если родителем сделать при создании TreeView тоже самое главное окно ?


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
dMaxis
Дата 8.4.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



586, Спасибо, всё получилось
Код

            ..............................
            ..............................
LRESULT CALLBACK PanelProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
      case WM_NOTIFY:
      {
          LPNMHDR lpnm=(LPNMHDR)lParam;
          switch (lpnm->code)
          {
              case TVN_ITEMEXPANDED:
              {
                MessageBox(hwnd,_T("TREEVIEW 2"),_T("PROG"),MB_OK);
                break;
              }
          }
          break;
      }
    }
    return CallWindowProc((WNDPROC)GetWindowLong(hwnd, GWL_USERDATA),hwnd,msg,wParam,lParam);
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
                         WPARAM wParam, LPARAM lParam)
{
            ..............................
            ..............................
            //--------------------Treeview in panel
            hPanel=CreateWindowEx(WS_EX_STATICEDGE,_T("Static"),_T(""),
                        WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|ES_READONLY|ES_CENTER,
                        360,10,350,350,hwnd,0,hInstance,NULL);
            SetWindowLong(hPanel,GWL_USERDATA,SetWindowLong(hPanel,GWL_WNDPROC,long(&PanelProc)));
            ..............................
            ..............................
          case WM_NOTIFY:
          {
            LPNMTOOLBAR lpnmtb=(LPNMTOOLBAR)lParam;
            LPNMHDR lpnm=(LPNMHDR)lParam;
            switch (lpnm->code)
            {
              case TVN_ITEMEXPANDED:
              {
                MessageBox(hwnd,_T("TREEVIEW 1"),_T("PROG"),MB_OK);
                break;
              }
            }
            break;
          }
            ..............................
            ..............................
}

PM MAIL   Вверх
586
Дата 8.4.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А для переносимости кода под Win64 следует использовать SetWindowLongPtr.
Код
SetWindowLongPtr(hPanel, GWLP_WNDPROC, (LONG_PTR)...);

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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