c++ क्या एमएफसी विंडो रहित ऐक्टिक्स में सीडब्ल्यूड क्लास का संचालन नहीं हो सकता है?



mfc activex (1)

मैंने इस बारे में पहले दो प्रश्न पूछे हैं और प्रत्येक पद के लिए मुझे कुछ समाधान दिए गए हैं, लेकिन समस्या अभी भी मौजूद है

मेरा पहला सवाल था: क्यों एक खिड़की रहित Activex संभाल वापस नहीं करता है यह सुझाव था कि "सृजन को बनाने से विंडो m_hWnd को सक्रिय करना बंद हो गया, मैंने इसे करने की कोशिश की है लेकिन अभी भी m_hWnd संपत्ति शून्य के रूप में वापस कर चुकी है क्योंकि GetSafeHwnd() पद्धति ने किया है।

दूसरा वाला एक ही सवाल था जो एक कोलकांटोलोल वर्ग पर केंद्रित था और यह पूर्वजों की सीडब्ल्यूएनडी है। इसका समाधान था "अदृश्य विंडो को अपने नियंत्रण आरंभीकरण कोड में कहीं जोड़ें। इस विंडो में भेजे गए संदेशों को संभाल लें, और सीधे नियंत्रण विधियों को कॉल करें" । इसलिए मैंने ऐसा किया, लेकिन बनाया वर्ग अभी भी शून्य हैंडल देता है

यहां मेरा नया अदृश्य वर्ग स्रोत है:

// moWind.cpp : implementation file
//
#include "stdafx.h"
#include "PINActive.h"
#include "moWind.h"
#include "include\xfspin.h"
#include <math.h>
// moWind

IMPLEMENT_DYNAMIC(moWind, CWnd)

moWind::moWind(){}

moWind::~moWind(){}

//=============================================================
LRESULT moWind::OnExecuteEvent (WPARAM wParam, LPARAM lParam)
{
    WFSRESULT *pResult = (WFSRESULT *)lParam;
    CString EK=_T("");
    CString str;
    int reskey=0;
    if (pResult->u.dwEventID=WFS_EXEE_PIN_KEY)
    {       
        LPWFSPINKEY pressedkey;
        pressedkey=(LPWFSPINKEY)pResult->lpBuffer;

    reskey = log10((double)pressedkey->ulDigit) / log10((double)2);

        EK.Format("%d",reskey);
        xfsOnKeyEvent->OnKeyRecieved(reskey);
    }
    else
    {
        str.Format("ExecuteEvent:  ID = %d\r\n", pResult->u.dwEventID);
    }
    MessageBox("a Execute message Recieved");
    return 0;
}

BEGIN_MESSAGE_MAP(moWind, CWnd)

    ON_MESSAGE(WFS_EXECUTE_EVENT,OnExecuteEvent)

END_MESSAGE_MAP()

और यह कक्षा के .h फ़ाइल है:

// moWind.h
class IXFSEvents
{
protected:
    IXFSEvents(){};
    virtual ~IXFSEvents(){};
public:
    virtual void OnKeyRecieved(int key)=0;
};

class moWind : public CWnd
{
    DECLARE_DYNAMIC(moWind)

public:
    moWind();
    virtual ~moWind();
    void Register(IXFSEvents* obj)
    {
        xfsOnKeyEvent= obj;
    }
protected:
    IXFSEvents* xfsOnKeyEvent;
    LRESULT OnExecuteEvent (WPARAM wParam, LPARAM lParam);
    DECLARE_MESSAGE_MAP()
};

और अंत में यहां इस तरह से मैंने अपने ऐक्टिव एक्स में इस वर्ग का उपयोग किया है: myActivex.h फ़ाइल में:

शामिल करें "moWind.h"

class CmyActivexCtrl : public COleControl, public IXFSEvents
{
...
Class definition
...
protected:
      moWind tmpWind;
 .
 .
 };

अंततः myActivex की सृजन विधि में मैंने घटक कॉलबैक पद्धति को प्रारंभ किया है जो इसे इसे संभाल लेना चाहता था:

CmyActivexCtrl::CmyActivexCtrl()
{
    InitializeIIDs(&IID_DmyActivex, &IID_DmyActivexEvents);
    tmpWind.Register(this);
    myOtherComponent.WindowsHandle=tmpWind.GetSafeHwnd(); //here my Cwnd derived class returns zero
        //my other component gets the handle and call an API with it to register 
        //the given handle and force the API to send the messages to that handle.
}

जैसा कि आपने उल्लेख किया है कि आपको इसके माध्यम से उपयोगकर्ता संदेश प्राप्त करने में सक्षम होने के लिए विंडो हैंडल की आवश्यकता है, आपके पास हमेशा एक सहायक विंडो बनाने का एक विकल्प है, जैसे कि संदेश केवल विंडो, केवल संदेश-केवल विंडो बनाने के लिए CreateWindowEx का उपयोग करना

अपने खिड़की नियंत्रण के लिए यह बिल्कुल ठीक नहीं है कि किसी भी विंडो को संभाल न दें, ताकि आप वास्तव में उपलब्धता को संभाल न दें जब तक कि आप अपने आप को खिड़की के पास न हों।





atl