프로그래밍/VC++

activex를 dialog base처럼 만드는법

panpro 2006. 8. 28. 11:28
2000-04-03 오후 4:21:20   /  번호: 336  / 평점: ///////// (8.7) category: ActiveX/COM  /  조회: 26,284
activex를 dialog base처럼 만드는법 김일주 / foofoo
김일주님께 메시지 보내기  김일주님을 내 주소록에 추가합니다.  김일주님의 블로그 가기   
< 제가 이 방법을 알아내려구 무진 노력했는데 정말루 힘들었습니다. >

activex로 프로그램을 제작하는데 많은 어려움중에 하나가 기본적은 app wizard가 만들어주는 소스가 view기반이라는 겁니다. 정확히 말하자면 COleControl을 기반으로 만들어진다는 소리죠. app wizard의 sdi나 mdi와 같다고 보면 되지만 함수나 속성이 조금씩은 다르죠. 뭐 activex를 보통 view기반으로 만드는게 수월한 프로그램들도 있겠지만 보통은 dialog base를 사용해야 할 경우도 많을 껍니다. 만약 view기반이라면 모든 control들을 create를 통해서 만들구 위치또한 일일이 지정해 주어야 한다는 소리죠. 하지만 activex가 dialog base라면 dialog resource를 wizard에서 마우스로 뚝딱해서 쉽게 만들수 있게 됩니다.

참 서론이 길었군요. 우선 개략적인 방법을 말하자면

1. 새로운 dialog resource를 wizard로 만들구, 만든 dialog의 속성(alt+enter)중 styles tab에 가서 style은 child, border는 none으로 설정하세요. 그 dialog를 더블클릭하면 새로운 class를 만들겠냐고 물어보는데 그때  base class를 CDialog가 아닌 CFormView를 지정하면 됩니다. - CScrollView나 CView도 가능하겠지만 CScrollView는 자체적으로 생성하기 힘들고 CView는 Scroll을 지원하지 않아서 좀 불편하거든요. CFormView는 CScrollView를 상속받았으므로 쓰기가 좋죠.

2. 새로만든 클래스를 CMyFormView라고 하면 여기서 약간 수정 할 것이 있는데요... 우선 새클래스의 생성자와 소멸자를 protected에서 public으로 옮겨 주는 겁니다. 그래야 손으로 생성을 하겠죠. 다 아시는 거겠지만 protected로 만든 생성자가 있다는 건 그 클래스를 직접쓰지 말고 상속 받아서 쓰라는 의미 아시죠?..

3. 그리구 class wizard로 CMyFormView의 함수 두개를 override해야 하는데 하나는 Create()함수이고 또하나는 PostNcDestroy()입니다. 만약 이 두함수가 않보이면 class wizard의 class info tab에 가서 새 클래스의 MessageFilter를 Dialog나 View로 바꾸어 보면 위의 두함수가 나옵니다. 둘 중에 어느건지는 잘 기억이 않나네요 (죄숑)

4. 두 함수를 다음과 같이 고칩니다.
BOOL CMyFormView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
   return CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

void CMyFormView::PostNcDestroy()
{
//    CFormView::PostNcDestroy();
}

Create()는 만든 그대로 놔두면 되는거구 PostNcDestroy()는 base를 호출하지 않게 막아야 합니다. -중요- 않그러면 프로그램이 죽습니다. (이유가 궁금하시면 멜을 보네세요 히히)

5. 이제는 control에서 이 class를 생성하기만 하면 되는데 다음과 같이 넣기만 하면 됩니다.

class CMyCtrl : public COleControl
{
// Attributes
public:
   CMyFormView m_myFormView;
....
}

int CMyCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (COleControl::OnCreate(lpCreateStruct) == -1)
       return -1;
   
   m_myFormView.Create( NULL, NULL, WS_CHILD| WS_VISIBLE, CRect(0,0,0,0), this, IDC_MY_FORM_VIEW);
   
   return 0;
}

void CMyCtrl::OnSize(UINT nType, int cx, int cy)
{
   COleControl::OnSize(nType, cx, cy);
   
   m_myFormView.MoveWindow(CRect(0,0,cx,cy));    
}

달랑 3줄만 추가하면 됩니다. 쉽죠......

6. 이제 compile해서 실행해 보세요. 그러면 control의 화면이 dialog처럼 회색바탕에 common control들이 떠있는것을 보실수 있으실껍니다.
이제는 처음에 만든 dialog resource에 여러 control들을 넣어서 사용하시면 됩니다.

7. 사용상 주의 사항 - 제일 중요 - 별건 아니지만 제 경험상 하지 말아야 할것을 말씀드지요.dialog에 넣은 common control 들은 class wizard에서 변수로 선언해서 자유롭게 써도 되지만 개중에 변수로 선언해서 쓰면 에러가 나는 경우가 생깁니다. 그것두 함수 마다 다르고 때에 따라 다르더군요.
자세히 말씀드리자면 button, edit, 등 간단한건 변수 선언(DDX로)후 그 변수를 써도 괜찮지만 CListBox, CComboBox등은 가끔 item을 삽입하는 작업을 못합니다. 원인은 그변수가 DDX 매크로에서 제대로변수와 동기화를 시켜주지 않아서 인데 아마 base class가 CDialog가 아니고 CFormView이어서 DDX가 제때 호출되지 않는것 같습니다. 하지만 어쩔때는 될때도 있거든요.
해결책은 CListBox, CComboBox같은 control들은 GetDlgItem으로 pointer를 얻어서 쓰시면 됩니다. 그리구 그게 더 속편하죠.
마소에 나온 어느 분(이름이 생각안나네요 죄송)의 CFormView내용을 보고 떠오른 생각입니다. 그럼 유용하게 쓰시구요. 문의사항 있으시면 멜 주세요.




제가 위의 것을 하다가 안 사실인데 많은 분들이 아실지도 모르겠네요.
activex control에서 대화상자등에 acticex control를 넣는 방법입니다. 보통 dialog에 grid나 chart등 다른 activex control을 넣고 싶을때 부딛히는 문제죠. 무조건 add to project해서 control을 넣으면 dialog 프로그램 자체가 뜨지 않죠. 이때는 App Class의 InitInstance()맨 위에 AfxEnableControlContainer(); 한줄만 넣으시면 됩니다. 보통의 app version의 app class에는 위 함수가 다 있는데 activex의 app class에만 없더군요.


이 글에 평점 주기:  
2000-11-29 오후 11:16:40   /  번호: 1092  / 평점: ///////// (-)
/찾던것이 여기 있었군요.전희철 / knl7777
전희철님께 메시지 보내기  전희철님을 내 주소록에 추가합니다.  전희철님의 블로그 가기   
안녕하십니까.
MFC 완전 초짜 전희철 입니다.
ActiveX 의 View (여기서도 View라고 합니까? ^^;;;)를 CFormView 를 상속받게 하려
고 무진장 삽질해봤지만 안되더라구요. (바보같죠??)
님이 주신 방법 아주 좋아보입니다.

일단 사용해 본 후에 잘되면 감사의 메일을, 안되면 빈정대는 글을 (^^;;;) 보내겠습
니다. 그럼...
이 글에 평점 주기:  
2001-12-25 오후 8:37:06   /  번호: 3720  / 평점: ///////// (-)
/첨부파일 있음[질문] 님이 올리신 정보를 활용한 질문..이혁진 / lhj544
이혁진님께 메시지 보내기  이혁진님을 내 주소록에 추가합니다.  이혁진님의 블로그 가기   

초보 입니다.
제목이 너무 광범위하게 보이는 까닭에 다소 어리둥절 하시겠지만, 질문내용은 구체적? 입니다.

사실 제가 Tip&Trick란에서 dialog 베이스로 제작하는 방법을 보고 코딩하다가 문제에 부딫혀서 이렇게 글
을 올립니다.

IDD_TEST_FORM을 기반으로 한 CMyFormView클래스를 배이스로 사용하는 것을 예제로 만들어 보고 있는데...
여기에 리스트 컨트롤을 만들고 여기에 값을 넣을 려고 하는 생각을 하고 있습니다.

그런데... 삽입 관련 함수(InsertCoumn())을 만들어서 거기에 관련 자료를 만들어서 실행을 했는데.. 이벤
트가 발생하지 않아요...
혹시나 해서 폼에 버튼을 만들어서 이버튼을 클릭하면 메세지창이라도 나오게 할려고 했는데.. 이것도 않되
더군요...

아예 CMyFormView의 IDD_TEST_FORM에 관련된 이벤트가 발생하지 않는 것 같아서 이렇게 도움을 받고자 글
을 올렸습니다.

고수님들 부디 답변 부탁드립니다.

추신 : 원래는 OleControl에서 상속받은 클래스에서 직접 윈도우를 드로잉해야 하는 것으로 알고 있지만 저
는 다른 클래스를 가지고 와서 Create시키는 형식으로 끌어다가 썼거든요... 그래서 문제가 생기는 것인
지...

참고로 여기에 test3라는 이름으로 첨부해 올립니다. 한번 봐보세요...

CMyFormView에 InsertColumn()이 있으며, 이것을 OnInitialUpdate에 넣었습니다. OnOK에는 메세지 박스를
넣었구요..
이 글에 평점 주기:  
/ 
2001-12-27 오전 11:24:55   /  번호: 3736  / 평점: ///////// (-)
       /클래스 위저드에 오토메이션이라게 있거든요...책에 나와있으니까 보면 알거에요^^timeskorea / timeskorea
timeskorea님께 메시지 보내기  timeskorea님을 내 주소록에 추가합니다.  timeskorea님의 블로그 가기   
^^
이 글에 평점 주기:  
2001-12-27 오후 12:14:05   /  번호: 3737  / 평점: ///////// (-)
       /CFormView는 CDialog가 아닙니다....김일주 / foofoo
김일주님께 메시지 보내기  김일주님을 내 주소록에 추가합니다.  김일주님의 블로그 가기   
CFormView에는 OnOK를 override하지 않습니다(아마도).
아마도 Message Handler도 없을껍니다.

일반 버튼을 올려서 MessageBox를 띠워보시면 수행되는것을 확인하실수 있습니다.
ON_BN_CLICKED(IDOK, OnOK)
뭐 이런거 넣어야 할껍니다.

그럼...
이 글에 평점 주기:  
2001-12-27 오후 5:54:45   /  번호: 3744  / 평점: ///////// (-)
               /첨부파일 있음[질문] 리스트 뷰에 컬럼을 추가하는 문제..이혁진 / lhj544
이혁진님께 메시지 보내기  이혁진님을 내 주소록에 추가합니다.  이혁진님의 블로그 가기   
답변 주셔서 정말 감사합니다.

그동안 아무런 답변도 없어서.. 정말 답답했거든요...
이제 좀 한 숨이 놓입니다. 일단 문제를 알았으니까요...

제가 컨트롤에서 불러들인 FormVew에다가 리스트 뷰를 추가했습니다. 그리고 여기에 일단 컬럼을 나누어 만
들려고 하거든요.... 컬럼을 추가한다는 표현이 더 낳겠네요...

함수 이름은 InsertColumn()입니다. 물론 ID_EDIT라는 ID를 갖는 버튼의 기능에 추가 하여놓았습니다.
그런데... 일반 FormView에서는 아무런 문제가 없는데.. 여기선 오류를 발생하더군요... 어떤 이유때문에
그런지 궁금합니다.

님 속는셈치고 한번 컴파일 해보세요.. InsertCoumn()에서 에러가 발생할 겁니다. 그런데.. 일반 프로젝트
에서는 아무런 문제가 없던 것이거든요...

첨부해서 올리겠습니다.
한 수 부탁드리겠습니다.
이 글에 평점 주기:  
/ 
2001-12-28 오전 9:13:51   /  번호: 3746  / 평점: ///////// (-)
                       /답변...김일주 / foofoo
김일주님께 메시지 보내기  김일주님을 내 주소록에 추가합니다.  김일주님의 블로그 가기   
글에도 언급했듯이 대부분의 control은 멤버로 선언해서 쓰지말고
GetDlgItem으로 그때그때 포인터를 얻어써여 한다고 했습니다.

FormView에서는 DDX/DDV가 잘 먹지 않습니다. 왜냐 다이얼로그가 아니걸랑요.

m_listBoard.InsertColumn(..

CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_LIST_BOARD);
pList->InsertColumn(..

이렇게 하세여.

이 글에 평점 주기:  
2001-12-28 오전 9:38:00   /  번호: 3747  / 평점: ///////// (-)
                               /[답변] 감사합니다. ^^*이혁진 / lhj544
이혁진님께 메시지 보내기  이혁진님을 내 주소록에 추가합니다.  이혁진님의 블로그 가기   
일단 GetDlgItem이라도 어떤식으로 써야하는지 조금 난감했는데... 정말 감사합니다.

님이 알려주신대로 해보겠습니다.
유익한 정보를 알려주셔서 정말 감사합니다.
이 글에 평점 주기:  
2001-12-31 오후 3:35:17   /  번호: 3755  / 평점: ///////// (-)
                               /첨부파일 있음[질문] 마지막으로 한가지 질문(제발 부탁드려요)이혁진 / lhj544
이혁진님께 메시지 보내기  이혁진님을 내 주소록에 추가합니다.  이혁진님의 블로그 가기   
여러번 글을 올려서 죄송합니다. 한가지만 물어볼려고 합니다.

임의로 띄운 다이알로그에서 View의 인스턴스를 이용해서 View클래스가 가지고 있는 함수를 실행시킬 수 있
나요?
예를 들어:
다이알로그 박스를 닫을 때, FormView의 특정 함수를 실행시킬려고 하거든요. 그래서 다이알로그에
FormView인스턴스를 선언 하고 해당 버튼 이벤트에 FormView.SetData() //setdata는 임시로 만든 함수..
를 구현 했습니다. 물론 View에는 SetData()라는 함수가 있구요. 그런데....
FormView인스턴스를 선언하니 엄청난 에러가 발생하는데... 그 이유를 모르겠습니다. 부디 답변 부탁드립니
다. 다이알로그에 FormView에 관련된 선언을 하지 않으면 아무이상 없는데...

참고 :
FormView의 이름은 CMyFormView
컨트롤 이름은 CTest3Ctrl
다이알로그 이름은 CInDataDlg
입니다.

부디 한번 컴파일을 해보세요... 다이알로그에서 CMyFormView에 관련된 내용을 지우면 에러가 발생하지 않
습니다.

제발 이번만큼은 꼭 님의 도움이 필요합니다.
이 글에 평점 주기:  
/ 
2002-01-02 오전 9:45:11   /  번호: 3761  / 평점: ///////// (-)
                                       /첨부파일 있음상호참조문제...김일주 / foofoo
김일주님께 메시지 보내기  김일주님을 내 주소록에 추가합니다.  김일주님의 블로그 가기   
서로 참조해야 하는 경우 둘중에 하나는 포인터형이어야 합니다.
new로 만들어서 쓰는 경우가 제일 무난하구여.

m_poDlg = new COutDataDlg(this);
m_piDlg = new CInDataDlg(this);

CWnd파생 class의 생성자에 this를 넣으면 CInDataDlg에서

CMyFormView* pView = (CMyFormView*)GetParent();
pView->SetData();

같이 쓸수 있습니다.
변경된 소스 참고하세요.
이 글에 평점 주기:  
/ 
2002-01-03 오후 6:04:45   /  번호: 3767  / 평점: ///////// (-)
                                               /[질문] 정말 죄송합니다. 이번 한번 만 더 물어보겠습니다......(m_hWnd)이혁진 / lhj544
이혁진님께 메시지 보내기  이혁진님을 내 주소록에 추가합니다.  이혁진님의 블로그 가기   
아... 정말 죄송해서 뭐라 말씀드릴 것이 없다는...

한가지만 질문하려 합니다.
이미 님께서도 아시겠지만 SetData()에서 작업을 할려고 합니다. 하지만 CMyFormView의
핸들이 없다는 오류가 계속발생합니다. 원인을 나름대로 해결하려고 계속 노력은 하고
있지만 좀처럼 해결되지 않네요..

무엇보다도 자신의 핸들값을 모른다는 것이 이해가 되지 않습니다. CMyFormView에
IDC_MAIN_DATA라는 ID값을 갖는 에디트 박스를 만들경우 여기에 값을 넣기 위해서 간단
히 GetDlgItem(IDC_MAIN_DATA)->SetWindowText("test");로 코딩을 했는데... 놀랍게도
m_hWnd가 ???로 나타나는 오류가 나오더군요... CInDataDlg가 아닌 자신의 클래스
CMyFormView에 있는 에디트 박스를 CMyFormView에서 작업을 한 것인데.. 이런 오류가 나
다니...

초기 OnCreate에서의 this는 CTest3Ctrl의 m_hWnd의 값으로 알고 있습니다. 그런데...
OnCreate함수에서 CMyFormView의 개체를 호출하면 이상없이 됩니다. 이건 왜 그럴까요?

아래에 보시면
int CTest3Ctrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
   if (COleControl::OnCreate(lpCreateStruct) == -1)
       return -1;
   CRect rt;
   // TODO: Add your specialized creation code here
   m_myFormView.Create(NULL,NULL,WS_CHILD | WS_VISIBLE, CRect(0,0,0,0),
this,IDD_TEST_FORM);
   m_myFormView.InsertColumn();
   CEdit* pdEdit = (CEdit*)m_myFormView.GetDlgItem(IDC_MAIN_DATA);
   pdEdit->SetWindowText("test");
   return 0;
}
에서는 오류없이 동작이 됩니다. test라는 글자가 CMyFormView상에 있는 IDC_MAIN_DATA
라는 ID를 같는 에디트 박스에 값을 넣는 다는 것이죠..

그런데.. 아래의 경우
void CMyFormView::SetData(CString m_strData)
{
   CString m_strName;
   MessageBox(m_strData,"test",MB_OK);
   CEdit* pdEdit = (CEdit*)GetDlgItem(IDC_MAIN_DATA);
   pdEdit->SetWindowText(m_strData);
   
   MessageBox(m_strData,"test",MB_OK);
}
인 경우 SetWindowText(m_strData)에서 m_hWnd가 없다는 메세지가 나옵니다. 이상하지
않나요?? m_strData값은 이상없이 넘어 옵니다.
사실... 다이알로그 박스를 여기서 불러서 작업을 하고 싶으나... 그문제도 만만치 않
고 일단 CInDataDlg안에서 작업을 하면 그문제는 일단 해결이 되니 넘어갔습니다.

하지만 왜 CMyFormView에선... 자신의 개체를 컨트롤 할 수 없는 일이 일어나는지 알
수 가 없습니다.
님 정말 죄송합니다. 이렇게 자꾸 글을 올리게되서... 하고 계신일도 많으시리라는 것
을 압니다만..... 워나 저의 지식이 짧고 이번에 처음 ActiveX를 해보는 지라... 경험
이 짧습니다.

아무쪼록 귀찮으시더라도 이번 한번 만 도와주세요... 부탁드립니다.

이 글에 평점 주기:  
2001-12-27 오전 11:00:36   /  번호: 3735  / 평점: ///////// (-)
/ActiveX Form View Resizetimeskorea / timeskorea
timeskorea님께 메시지 보내기  timeskorea님을 내 주소록에 추가합니다.  timeskorea님의 블로그 가기   
안녕하세요..님이 남긴흔적은 잘보았읍니다.
한가지 질문이 있어서요.
님이 만든 폼이 브라우저로 불러올때 디폴트로 너무작아서 좀 크게 하고 싶다면 어디서 조정을해야하나요.
알고싶습니다.
크기가 좀 300/500으로 하고싶은데 자꾸만 30/75로 나옴니다. 이미지는 큰데 그것을 보여주는 창이 작아서
스크롤이 생기내여 ^^ 그럼 부탁드려요
이 글에 평점 주기:  
2001-12-27 오후 12:20:19   /  번호: 3738  / 평점: ///////// (-)
       /resize김일주 / foofoo
김일주님께 메시지 보내기  김일주님을 내 주소록에 추가합니다.  김일주님의 블로그 가기   
크기가 좀 300/500으로 하고싶은데 자꾸만 30/75로 나옴니다.

라는게 구체적으로 어떻다는거죠?
Form크기는 Dialog Resource의 크기를 변경하면 변경됩니다.
Dialog Resource의 크기보다 Browser크기가 크면 스크롤 창이 안나오고
작으면 나오져.
크기조정은 동적으로 할수도 있지만...

30/75라는건 CFormView의 Dialog Resource의 크기가 아닌가요?

그럼...
이 글에 평점 주기:  
2001-12-27 오후 1:04:55   /  번호: 3739  / 평점: ///////// (-)
               /Re;:sizetimeskorea / timeskorea
timeskorea님께 메시지 보내기  timeskorea님을 내 주소록에 추가합니다.  timeskorea님의 블로그 가기   
음..
분명 사이즈는 500/700이랍니다 리소스에선.
그런데 브라으저에서나 아님 액티브 컨테이너에서 보면 그 크기는 큰데
보여지는 창은 무지 조그맣답니다.
예를들어 킹콩이 작은 거울을 보면 실제는 무지 큰데 거울이 작아서 일부만 보이는거.
말이죠 여기서 킹콩은 액티브고 거울은 부라우저이죠.
만약 액티브 컨트롤패드같은곳에서 속성을 설정할때 좀크게하면 크게 나오지만요.
전 설정안하고 액티브의 크기만큼의 영역을 할당해서 충분한 크기로 나오게 하고 싶답니다.
물런 무지 크진않입니다. 제가원하는 크기는 200/350 정도거든요.
그럼 부탁드려요...그래두 님이 남긴 흔적이 많은 돔이 된답니다. 그럼...
이 글에 평점 주기:  
2001-12-27 오후 4:32:37   /  번호: 3743  / 평점: ///////// (-)
                       /size...김일주 / foofoo
김일주님께 메시지 보내기  김일주님을 내 주소록에 추가합니다.  김일주님의 블로그 가기   
아마 자기를 담고있는 Container의 크기를 키울수 없느냐는 말씀이신거 같은데
그렇다면 아마 Container의 COM객체 Pointer를 얻어서 Invoke해야하는 과정이 필요한거
같네여. 근데 거기까지는 제가 잘 알지 못해서...
한계인거 같습니다.

그럼...
이 글에 평점 주기:  
2002-02-05 오후 5:44:34   /  번호: 3886  / 평점: ///////// (-)
/[참고] 사이즈 박희찬 / youpo
박희찬님께 메시지 보내기  박희찬님을 내 주소록에 추가합니다.  박희찬님의 블로그 가기   
브라우저에서 보신다면, 다음처럼 크기를 지정하면 되지 않을까요...
<OBJECT ID="AXGrid" WIDTH=1000 HEIGHT=600 CLASSID="CLSID:CC93F5A6-1A21-11D6-9F0C-
0003471B33A4">
이 글에 평점 주기:  
2002-05-02 오전 12:01:53   /  번호: 4250  / 평점: ///////// (-)
/[부탁]Resize 어떻게 하는지좀...한세용 / hansy
한세용님께 메시지 보내기  한세용님을 내 주소록에 추가합니다.  한세용님의 블로그 가기   
안녕하세요.
님 덕택에 다이얼로그 배이스 화면을 꾸몄습니다.
근데요~
OnSize에

CTreeCtrl *m_pTree = (CTreeCtrl *)GetDlgItem(IDC_TREE1);
m_pTree->MoveWindow(CRect(100,100,1000,cy),TRUE);

이렇게 너어서 테스트를 했더니
무조건 오류가 나데요~
Access Violation 인가??? 그리고 윈도우 핸들을 Assert 하는데서
에러가 나더군요...

이런식으로 Resize를 하면 않되나요?
이 글에 평점 주기:  
2003-04-24 오전 2:31:39   /  번호: 6204  / 평점: ///////// (-)
/저 함수에 하나 더 넣으라고 그럽니다..도와주세요장진형 / bongse1
장진형님께 메시지 보내기  장진형님을 내 주소록에 추가합니다.  장진형님의 블로그 가기   

int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

...

m_myFormView.Create( NULL, NULL, WS_CHILD| WS_VISIBLE, CRect(0,0,0,0), this, IDC_MY_FORM_VIEW);

여기서 하나 더 넣으라고 나오던데요..?뭔지 아세요 6개가 아니라 7개 넣고..

7번쨰에 CCreateContext*    pContext

를 넣으라고 그러던데,,뭘 넣어야 하죠??

..도와주세요

}

이 글에 평점 주기:  
2003-04-24 오전 6:46:01   /  번호: 6205  / 평점: ///////// (-)
       /activeX를 다이알로그 방식으로 만드는 더 정확한 방법...장진형 / bongse1
장진형님께 메시지 보내기  장진형님을 내 주소록에 추가합니다.  장진형님의 블로그 가기   

아래는 코드구르에서 출처한 방법입니다..




먼저 active X 워크 스페이스를 만든 다음에,

리소스에서 다이알로그를 하나 추가한다...

그리고, 그 다이알로그->마우스 오른쪽 클릭->property


   styles ->style   : child        ,

   styles -> border : dialog frame     ,

   more Style  ->     visible  ->틱 선택 되어지게  ,

   more Style  ->     control  ->틱 선택 되어지게  ,

   extended style  ->  static edge  ->틱 선택 되어지게 ,


이렇게 만들어 주고 나서, 그 다이알로그를 더불 클릭하여서 클래스를 하나 만든다..

그리고, 이 클래스의 인스탄스를 ~Ctrl 클래스에서 생성 시켜준다...

예)위에 다이알로그로 더블 클릭 생성된 클래스 이름이 MyDialog  이라고 가정하고,



( #include "MyDialog.h" 를 하는것을 잊지 말자)


class ~~~Ctrl : public COleControl

{

....


MyDialog*   m_MyDialog         ;

....


}


그리고, 클래스 위자드에서 WM_CREATE에 해당하는 함수인 다음 함수를 아래와 같이 고쳐준다..




int CDialogCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

   if (COleControl::OnCreate(lpCreateStruct) == -1)

       return -1;

   // TODO: Add your specialized creation code here


   m_MyDialog  =   new     MyDialog      ;

   m_MyDialog->Create(

               리소스에서 이 다이알로그의ID    ,   //------예) IDD_MYDIALOG ---------

               this

              );

   return 0;

}




이러면 끝이다..실제 보면 다이알로그 베이스로 activeX가 그려진다..











http://www.codeguru.com/activex/dialogctrl.shtml


This article was contributed by Petr Stejskal.


I wanted to create a control which would behave as a dialog or formview (you can place controls here).

There is a simple way to do it - to take advantage of ActiveX.


Create a new MFC ActiveX ControlWizard workspace (no need to special options).

Insert a new dialog resource named IDC_MYDIALOG

(check following:

   style -  child,

    border - dialog frame,

   <more Style>     visible    ,

   <more Style>     control    ,

   <extended style> static edge

)


Insert a new MFC class named CMyDialog (base class CDialog)

Add CMyDialog m_MyDialog member to your CDialogCtrl header source (don't forget to add #include "MyDialog.h")


Using classwizard add a member function OnCreate (WM_CREATE)

int CDialogCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

   if (COleControl::OnCreate(lpCreateStruct) == -1)

       return -1;


   m_MyDialog.Create(IDD_MYDIALOG, this);

   return 0;

}


Modify the member function OnDraw

(the dialog's size depends on the WIDTH and HEIGHT specified in the HTML file):


void CDialogCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)

{

  // TODO: Replace the following code with your own drawing code.

  // pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));

  // pdc->Ellipse(rcBounds);


  m_MyDialog.MoveWindow(rcBounds, TRUE);

}


To show the control in your browser use this simple HTML:


<html>

<head>

<title>DialogControl</title>

</head>

<body>


<center>

<OBJECT ID="DialogControl"  CLASSID="CLSID:insert here the GUID from ODL file"

  HEIGHT=300 WIDTH=300>

</OBJECT>

</center>


</body>

</html>


Last updated: 17 November 1998