VC++ 관련 질문 입니다(죄송 ; 하도 답답 해서요.)
물론 이곳이 VC++ 관련질문 올리는 곳은 아니라고 알고 있습니다.
데브피아에 올려도 답변이 없어 플그램을 하시는 분이면 이곳에도 VC++에 대해 아시는 고수분들도 많을것 같아 질문 올립니다.(죄송합니다.)
아래는 데브피아에 올린 질문 내용입니다.
아시는분 답변 주시면 감사하겠습니다.
====================================
아래처럼 OnInitDialog() 함수에 OnTrayNotification() 함수를 내부 함수로 사용해야 하는데 아래와 같은 에러가 발생합니다.
OnInitDialog() 함수에 OnTrayNotification() 함수를 꼭 써야 하는 이유는 OnInitDialog() 함수내에 While문을 두어 1분 간격으로 작업을 처리 하고 있습니다.
따라서 OnInitDialog() 함수내에 While문 때문에 OnTrayNotification()를 외부 함수로 사용하면 동작을 하지를 않더군요.
물론 While문 없이 외부 함수로 사용해 보면 에러 없이 잘 동작 됩니다.
검색을 해보면 많은 비슷한 내용들이 올라와 있는데 제가 초보인지라 잘 이해를 못하겠군요.
에러 내용
: error C2039: 'OnTrayNotification' : is not a member of '`global namespace''
: error C2275: 'WPARAM' : illegal use of this type as an expression
: see declaration of 'WPARAM'
: error C2146: syntax error : missing ')' before identifier 'wParam'
: error C2059: syntax error : ')'
: error C2143: syntax error : missing ';' before '{'
: error C2065: 'lParam' : undeclared identifier
==================================================
BOOL CIpnara_Win_ExeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
......... //트레이 아이콘 생성
....... //기타 작업처리
While(true)
{
.........
........
.........
// 트레이 아이콘의 팝업메뉴 처리부분
::OnTrayNotification(WPARAM wParam, LPARAM lParam)
{
CMenu menu, *pSubMenu;
// 오른쪽 마우스 버튼이 눌렸을 경우: 컨텍스트 메뉴 출력
if (LOWORD(lParam) == WM_RBUTTONUP)
{
if (!menu.LoadMenu(IDR_MAINFRAME)) return 0;
if (!(pSubMenu = menu.GetSubMenu(0))) return 0;
CPoint pos;
GetCursorPos(&pos);
SetForegroundWindow();
// 컨텍스트 메뉴 출력
pSubMenu->TrackPopupMenu(TPM_RIGHTALIGN, pos.x, pos.y, this);
SetForegroundWindow();
menu.DestroyMenu();
}
// 왼쪽 마우스 버튼이 더블 클릭되었을 경우
else if (LOWORD(lParam) == WM_LBUTTONDBLCLK)
{
// 프로그램 정보 대화상자 출력
SendMessage(WM_COMMAND, ID_APP_ABOUT);
}
return 1;
}
// 트레이 아이콘 팝업메뉴 처리부분 끝
Sleep(60000);
} // While end
return TRUE; // return TRUE unless you set the focus to a control
}
이럴경우 에러처리를 어떻게 해 주어야 하는지요.
참고로 Platform SDK도 설치 되어 잇습니다.
물론 OnInitDialog() 함수밖에서 아래처럼 사용하면 아무런 문제 없이 잘 됩니다.
밤을 새워 해결 할려고 해봐도 도저히 방법이 없군요.
체계적으로 공부를 못해 기초가 부실한것을 죄송하게 생각 합니다.
도움 좀 주시면 감사하겠습니다.
LRESULT CIpnara_Win_ExeDlg::OnDispNotify(WPARAM wParam, LPARAM lParam)
{
if(lParam != 517) //mouse Right Click시만 처리
return 1L;
........
.....
..........
return 1;
}
함수 안에서 다른
함수 안에서 다른 함수를 정의하고 계신데, C++에 그런게 있었단 말인가요? 밑에 에러는 분명히 그로 인한 syntax error같습니다만
Block되면 윈도우
Block되면 윈도우 메시지를 처리못해서 프로그램이 먹통될거에요.
windows에서 메시지 callback들은 무조건 리턴해야 됩니다.
대략 코드를 보니 프로그램이 편법적으로 이벤트를 받아 처리하려고 하는것같은데
프로그램이 조금 비정상적으로 짜여져 있는것 같네요.
1. 구지 코드를 유지시키려면 OnTrayNotification콜백을 외부에 선언해서
거기에 Sleep(60000)을 넣으세요. (단, 60초동안 이벤트 먹통됩니다.)
2. sleep하는 시간동안의 click이벤트를 무시할수 없다면(그런데 이런 경우는 없을겁니다.)
OnTimer를 사용하여 60초 마다 한번씩 호출하도록 만드세요. 물론 sleep을 제거하시고요.
3. sleep하는 시간동안의 click이벤트를 무시해도 좋다면
time을 선언해서 이전 클릭시간에서 60초가 지난지를 확인하고 지났으면 해당내용을 처리하고
지나지 않았으면 그냥 리턴하시면된다.(<-- 가능하다면 이거로 하세요)
1분 간격으로 뭐를
1분 간격으로 뭐를 하시려고 한다면 타이머를 쓰세요..
그리고 OnInitDialog() 내에 while문 같은걸 쓰시는건 좀 위험합니다.
작업관련 무한루프 같은건 쓰레드를 만드시고 메인 루프에서 독립시키시는게 좋을 듯합니다.
--
Linux강국 KOREA
http://ydongyol.tistory.com/
--
Linux강국 KOREA
http://ydongyol.tistory.com/
댓글 달기