2013-10-23 2 views
0

CDialog를 호출하고 여는 CFormView SDI가 있습니다. CDialog에는 비트 맵이 표시된 단추가 있습니다. CDialog를 닫을 때까지 모든 것이 잘 작동합니다. (Create 함수를 사용하여) 동일한 CDialog를 열면 버튼이 나타나고 버튼의 기능이 있지만 비트 맵이 사라집니다.버튼의 비트 맵이 사라집니다.

누군가가 이후에 CDialog를 호출 할 때 단추의 비트 맵이 사라지는 이유를 설명해 주실 수 있습니까?

미리 감사드립니다. 를 CDialog에서

void CTest4View::OnButton1() 
{ 
    m_dialog_calculator.Create(IDD_DIALOG1, GetDesktopWindow()); 
    m_dialog_calculator.ShowWindow(SW_SHOW); 
} 

I이 비트 맵은 InitDialog의 버튼 뒀다 :

BOOL CCalculator::OnInitDialog() 
    { 
    CDialog::OnInitDialog(); 
    if(!bitmapNew.LoadBitmap(IDB_BITMAP_NEW)){ 
    MessageBox("problem in loadbitmap"); 
    } 
    if(!m_button.SetBitmap(bitmapNew)){ 
    MessageBox("problem in SetBitmap"); 
    } 
    bitmapOpen.LoadBitmap(IDB_BITMAP_OPEN); 
    m_buttonOpen.SetBitmap(bitmapOpen); 
    //========================== 

    return TRUE; // return TRUE unless you set the focus to a control 
       // EXCEPTION: OCX Property Pages should return FALSE 
    } 
I는를 CDialog을 생성하는 버튼을 가지고하여 CformView에서 : 여기

는 코드

추가 조사에 문제가있는 것 같습니다 : m_button.SetBitmap (bitmapNew) 이것은 FALSE를 반환하기 때문에 발생합니다. 누군가 나를 도울 수 있습니까?

+0

소스 코드에 문제가있을 수 있습니다. 아마도 당신은 어떤 것을 보여줄 수 있습니까? –

답변

0

빠른 수정 :

void CTest4View::OnButton1() 
{ 
    // only create the dialog once 
    if (m_dialog_calculator.m_hWnd==NULL) 
     m_dialog_calculator.Create(IDD_DIALOG1, GetDesktopWindow()); 
    m_dialog_calculator.ShowWindow(SW_SHOW);  
} 

추가 정보 1 : OP는 자신의 질문에 제공

정보는/코드는 매우 작은, 그래서 실제로 무엇인지 추측 유사한 테스트 프로젝트를 다시 만들어야 누락 된 비트 맵이 잘못되었습니다. 내가 찾은 것은 CDialog와 CBitmap이 버튼을 눌렀을 때 여러 번 생성된다는 것이고, 이는 첫 번째 생성 호출 외의 후속 생성 API 호출이 실패하게 만든다. 결과는 예기치 못한 동작입니다.

프로그램으로 인해 작성 실패에 디버그 모드에서 실행할 때 일부 주장의 오류를 생성 해,하지만 릴리스 모드에서 컴파일 OP 그래서 모든 경고가 억제되고있는 것 같아요. 계산기 대화가 활성화 DoModal 통상의 방법에 비해 모덜리스 대화로 생성되기 때문에

문제가 발생. 이러한 모덜리스 대화 상자를 수행하는 일반적인 방법은 m_hWnd 멤버 변수를 모니터링하여 대화 상자를 한 번만 생성하는 것입니다. 사용자가 대화 상자를 닫으려는 경우, 대화 상자는 단순히 파괴되는 대신 숨겨집니다. 이렇게하면 여러 개의 생성 문제를 모두 피할 수 있습니다.

현재 계산기 대화 상자는 대화 상자의 오른쪽 상단에있는 "X"버튼을 클릭하여 닫히고 파손되는 것으로 가정합니다. 사실은 실제로는 숨겨져 있지만 실제로는 CDialog의 기본 처리로 파괴되지 않습니다 . 모덜리스 계산기 대화 상자를 닫는 올바른 방법은 ShowWindow (SW_HIDE)를 사용하여 OnClose 이벤트를 숨기도록 Onclose 이벤트를 오버라이드하는 것입니다. 다시 활성화하려면 ShowWindow (SW_SHOWNORMAL)를 사용하십시오.

+0

안녕하세요 Coder123, 사용자가 대화 상자를 닫을 수있게하고 다시 열려고하는 경우. 문제는 다시 열립니다. – user2859884

+0

Coder123의 솔루션이 완벽하게 작동하므로 문제가 어디에 있습니까? –

+0

@ user2859884 - 추가 된 정보는 읽으십시오. – coder123

관련 문제