CreateWindowEx :: LPVOID lParam :: Как его потом получить?

Тема в разделе "WASM.BEGINNERS", создана пользователем MooN, 3 ноя 2007.

  1. MooN

    MooN New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2007
    Сообщения:
    27
    CreateWindowEx(..., lParam);
    Как его получить?
    GetWindowLong? - Не пойму никак какой из парметров.
    Помогите!
    Спасибо.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Перевести?
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    сталобыть в обработчике WM_CREATE берешь lpParam, в нем буит указатель на CREATESTRUCT, в которой твой lParam идет по смещенею 0
     
  4. MooN

    MooN New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2007
    Сообщения:
    27
    просто ситуация немного не такая стандартная

    у меня есть класс для обертки АПИ создания окна
    есть статическая фукция класса которая является функцией переходником для вызова нужного виртуального члена класса WndProc. Так вот в этом переходнике необходимо знать адрес экземпляра класса которому принадлежит текущий описатель окна. Я этот адрес передаю в структуре, адрес которой указываю при создании окна. Теперь - у меня в переходнике есть описатель окна, но как теперь получить адрес объекта?
    Юзаю GetWindowLong(hWnd, GWL_USERDATA) но увы нифига - возврат - 0;(

    Код (Text):
    1. LRESULT CustomWidow::WndProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
    2. {
    3.    CRITICAL_SECTION cSection;
    4.    ResourceTypeInt *ResInt;
    5.    InitializeCriticalSection(&cSection);
    6.    EnterCriticalSection(&cSection);
    7.    ResInt = (ResourceTypeInt *)GetWindowLong(hWnd, GWL_USERDATA); //? ==0
    8.    LeaveCriticalSection(&cSection);
    9.    return ResInt->Object->InternalProc(hWnd, msg, wparam, lparam);
    10. }
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Вот пример.

    Код (Text):
    1. Базовый класс для MDI-окон
    2.  
    3. #define MDIVIEWPROPERTY "CIDDMDIView"
    4.  
    5. class CIDDMDIView
    6. {
    7. public:
    8.     HWND m_hWnd;
    9.  
    10.     CIDDMDIView();
    11.     virtual ~CIDDMDIView();
    12.  
    13.     static LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
    14.     ...
    15.     virtual LRESULT OnMsg(UINT iMsg, WPARAM wParam, LPARAM lParam);
    16.     ...
    17. };
    18.  
    19. Создание окна
    20.    
    21. bool CIDDMDIView::Create(char* szClass, char* szTitle, UINT nID, UINT nIndex)
    22. {
    23.     BOOL bIsActiveMax = FALSE;
    24.     ...
    25.     m_hWnd = CreateMDIWindow(szClass, szTitle,
    26.         MDIS_ALLCHILDSTYLES|WS_VISIBLE|WS_CLIPCHILDREN|(bIsActiveMax?WS_MAXIMIZE:0),
    27.         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    28.         g_hMDIClient,
    29.         GetModuleHandle(NULL),
    30.         (LPARAM)this);
    31.     ...
    32.     return true;
    33. }
    34.  
    35. Статическая функция окна (общая для всех производных классов)
    36.  
    37. LRESULT CALLBACK CIDDMDIView::WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    38. {
    39.     LPCREATESTRUCT lpcs = NULL;
    40.     LPMDICREATESTRUCT lpmcs = NULL;
    41.     CIDDMDIView* pOwner = NULL;
    42.     LRESULT lResult = 0;
    43.  
    44.     if (iMsg == WM_CREATE)
    45.     {
    46.         lpcs = (LPCREATESTRUCT)lParam;
    47.         lpmcs = (LPMDICREATESTRUCT)lpcs->lpCreateParams;
    48.         pOwner = (CIDDMDIView*)lpmcs->lParam;
    49.         if (!pOwner || !SetProp(hWnd, MDIVIEWPROPERTY, (HANDLE)pOwner))
    50.         {
    51.             ...
    52.             return FALSE;
    53.         }
    54.  
    55.         pOwner->m_hWnd = hWnd;
    56.     }
    57.     else
    58.         pOwner = (CIDDMDIView*)GetProp(hWnd, MDIVIEWPROPERTY);
    59.  
    60.     if (pOwner)
    61.     {
    62.         lResult = pOwner->OnMsg(iMsg, wParam, lParam);
    63.         if (iMsg == WM_DESTROY)
    64.         {
    65.             ...
    66.             RemoveProp(hWnd, MDIVIEWPROPERTY);
    67.             pOwner->m_hWnd = NULL;
    68.             delete pOwner;
    69.         }
    70.  
    71.         return lResult;
    72.     }
    73.  
    74.     return DefMDIChildProc(hWnd, iMsg, wParam, lParam);
    75. }
    76.  
    77. Виртуальная функция окна, перегружаемая в производном классе
    78.    
    79. LRESULT CIDDMDIView::OnMsg(UINT iMsg, WPARAM wParam, LPARAM lParam)
    80. {
    81.     switch(iMsg)
    82.     {
    83.     ...
    84.     }
    85.  
    86.     return DefMDIChildProc(m_hWnd, iMsg, wParam, lParam);
    87. }
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    При создании окна передаётся this:
    Код (Text):
    1. void TMyWndClass::CreateEx (...)
    2. {
    3.     // registration, etc.
    4.     //...
    5.  
    6.     CreateWindowEx (..., this);
    7. }
    При получении WM_CREATE этот самый this присобачивается к HWND:
    Код (Text):
    1. ...
    2. SetWindowLong (hWnd, GWL_USERDATA, (LONG) pWnd);
    3. ...
    При получении сообщения иного чем WM_CREATE смотрим если this уже присобачен, тогда вызываем виртуальную процедуру окна, если нет, то тогда DefWindowProc().

    Вот приблизительно так:
    Код (Text):
    1. LRESULT CALLBACK MyWndClassProc (HWND hWnd, UINT uiMsg, WPARAM wp, LPARAM lp)
    2. {
    3.     TMyWndClass* pWnd;
    4.  
    5.     if (uiMsg == WM_CREATE)
    6.     {
    7.         // Retrieve 'this'
    8.         //
    9.         pWnd = ((TMyWndClass**) lp) [0];
    10.        
    11.         // Attach 'this' to HWND
    12.         //
    13.         SetWindowLong (hWnd, GWL_USERDATA, (LONG) pWnd);
    14.  
    15.         // Invoke window creation routine (virtual)
    16.         //
    17.         pWnd -> OnWmCreate (hWnd);
    18.         //
    19.         // Base class method for this ^^^ stores input HWND as class member,
    20.         // so it is locked in during lifetime of a window. Also, derived class must
    21.         // call base class version first, so HWND always will be initialized before
    22.         // derived class can begin its own initialization (creating child controls, etc.)
    23.  
    24.         return 0;
    25.     }
    26.     else if ((pWnd = (TMyWndClass*) GetWindowLong (hWnd, GWL_USERDATA)) != NULL)
    27.     {
    28.         // Invoke virtual message mapping routine
    29.         //
    30.         LRESULT lRes = pWnd -> MsgMap (uiMsg, wp, lp);
    31.         //
    32.         // Base class method for this ^^^ calls DefWindowProc () as needed
    33.         // Usually, it is called last (before returning) if message was not processed by
    34.         // a class
    35.  
    36.         if (uiMsg == WM_DESTROY)
    37.         {
    38.             // Detach 'this' from HWND
    39.             //
    40.             SetWindowLong (hWnd, GWL_USERDATA, 0);
    41.         }
    42.         return lRes;
    43.     }
    44.  
    45.     // Code goes here before WM_CREATE and after WM_DESTROY
    46.     //
    47.     return DefWindowProc (hWnd, uiMsg, wp, lp);
    48. }