PDA

View Full Version : نمایش فرم در dll



sara_she
چهارشنبه 12 اردیبهشت 1386, 09:47 صبح
با سلام
من تو visual c++.net یه dll دارم و با add existing item چند تا (win form(.net به اون اضافه کردم . می خوام بدونم چطور می شه مشخص کرد که با اجرای هر فرمانی مثل کلیک روی دکمه ای خاص کدوم فرم باز بشه . دستور نمایش فرم چیه؟

sara_she
سه شنبه 18 اردیبهشت 1386, 09:40 صبح
کسی نیست به داد من برسه ؟ !

حسین محمدی
یک شنبه 23 اردیبهشت 1386, 17:06 عصر
با سلام!
من یک برنامه در mfc نوشته ام که یک فرم Windows Form .Net را باز می کند.

آنرا ببین شاید مشکلت را حل کند.
اگر سوالی باشد بگو تا برایت توضیح دهم.

ابتدا یک پروژه از نوع MFC Single Document می سازیم و نام پروژه را ManagedCpp می گذاریم.
بنابراین علاوه بر کلاسهای CAboutDlg و CMainFrame سه 3 کلاس دیگر CManagedCppApp و CManagedCppDoc و CManagedCppView خواهیم داشت.
در کلاس CManagedCppView یک کنترل از نوع CButton تعریف کنید. و در متد OnCreate این کلاس، آنرا بسازید.


Btn1->Create("Click me!", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10, 10, 100, 40), this, 1);

یک کلاس از نوع Windows Form (.NET) در پروژه خود اضافه کنید و نام آنرا AboutFrm بگذارید.
در هدر کلاس CManagedCppView دستورات زیر را اضافه کنید:


#include "AboutFrm.h"
using namespace ManagedCpp;

در تعریف کلاس خود یک تابع به شکل


afx_msg void OnBtn1Clicked();

تعریف کنید. و در BEGIN_MESSAGE_MAP یک خط به شکل


ON_BN_CLICKED(1, OnBtn1Clicked)

اضافه کنید.
در هدر کلاس CManagedCppView کد


gcroot<AboutFrm *> About;

را اضافه کنید:
در تابع OnBtn1Clicked موارد زیر را بنویسید:


#pragma push_macro("new")
#undef new
About = new AboutFrm();
About->Show();
//or you can use this
//Application::Run(new AboutFrm());
#pragma pop_macro("new")

البته برای راحتی کار Source کد برنامه را فقط کلاس CManagedCppView که تغییرات در آن انجام می شود را در اینجا می آورم:



// ManagedCppView.h : interface of the CManagedCppView class
//
#pragma once
#include "AboutFrm.h"
using namespace ManagedCpp;

class CManagedCppView : public CView
{
protected: // create from serialization only
CManagedCppView();
DECLARE_DYNCREATE(CManagedCppView)
// Attributes
public:
CManagedCppDoc* GetDocument() const;
// Operations
public:
// Overrides
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
// Implementation
public:
virtual ~CManagedCppView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// Generated message map functions
protected:
DECLARE_MESSAGE_MAP()
public:
CButton *Btn1;
afx_msg void OnBtn1Clicked();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
gcroot<AboutFrm *> About;
};
#ifndef _DEBUG // debug version in ManagedCppView.cpp
inline CManagedCppDoc* CManagedCppView::GetDocument() const
{ return reinterpret_cast<CManagedCppDoc*>(m_pDocument); }
#endif



// ManagedCppView.cpp : implementation of the CManagedCppView class
//
#include "stdafx.h"
#include "ManagedCpp.h"
#include "ManagedCppDoc.h"
#include "ManagedCppView.h"
#include ".\managedcppview.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CManagedCppView
IMPLEMENT_DYNCREATE(CManagedCppView, CView)
BEGIN_MESSAGE_MAP(CManagedCppView, CView)
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
ON_WM_CREATE()
ON_BN_CLICKED(1, OnBtn1Clicked)
END_MESSAGE_MAP()
// CManagedCppView construction/destruction
CManagedCppView::CManagedCppView()
: Btn1(NULL)
{
// TODO: add construction code here
}
CManagedCppView::~CManagedCppView()
{
}
BOOL CManagedCppView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
// CManagedCppView drawing
void CManagedCppView::OnDraw(CDC* /*pDC*/)
{
CManagedCppDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: add draw code for native data here
}

// CManagedCppView printing
BOOL CManagedCppView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CManagedCppView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CManagedCppView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}

// CManagedCppView diagnostics
#ifdef _DEBUG
void CManagedCppView::AssertValid() const
{
CView::AssertValid();
}
void CManagedCppView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CManagedCppDoc* CManagedCppView::GetDocument() const // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CManagedCppDoc)));
return (CManagedCppDoc*)m_pDocument;
}
#endif //_DEBUG

// CManagedCppView message handlers
int CManagedCppView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
Btn1 = new CButton();
Btn1->Create("Click me!", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10, 10, 100, 40), this, 1);
return 0;
}
void CManagedCppView::OnBtn1Clicked()
{
#pragma push_macro("new")
#undef new
About = new AboutFrm();
About->Show();
//or you can use this
//Application::Run(new AboutFrm());
#pragma pop_macro("new")
}


البته این برنامه دارای یک مشکل است که هنگام بستن برنامه به وجود می آید که به دلیل اینکه سرم بسیار شلوغ است فرصت پرداختن به آنرا نداشتم.
امیدوارم به دردت بخورد.

حسین محمدی
یک شنبه 23 اردیبهشت 1386, 17:13 عصر
البته در قسمت آخر هر دو کد یک خروجی را خواهند داشت:


About = new AboutFrm ();
About->Show();


در کد زیر دیگر نیاز به تعریف About نداریم و می توانیم آنرا از هدر فایل کلاس CManagedCppView پاک کنیم.


Application::Run(new AboutFrm());

sara_she
دوشنبه 24 اردیبهشت 1386, 09:11 صبح
ممنون
مشکلم با نمایش فرم حل شده الان تنها اشکالی که وجو داره استفاده از messagebox که اولش که تنهایی می نوشتم خطا می گرفت که این کد رو نمی شناسه ومتد show‌ ناشناخته است الان که به پیشنهاد دوستان از undef# قبلش استفاده می کنم خطایی نمی گیره ولی چیزی به عنوان messagebox هم نشون نمی ده !

sara_she
پنج شنبه 03 خرداد 1386, 10:09 صبح
سلام
مگه نه اینکه mfc یک کد مدیرت نشده است و فرم net.‌ از کد میدریت شده استفاده می کنه
برای اضافه کردن یک کد مدیرت شده به پروژه مدیرت نشده باید در property مربوط به پروژه قسمت c\c++ قسمت use manage extension رو yes کنیم

شما بدون انجام این کار تونستید یک فرم net.‌ به پروژه mfc‌ تو اضافه کنید؟