VC++ 관련 질문 입니다(죄송 ; 하도 답답 해서요.)

kimyh의 이미지

물론 이곳이 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;
}

totohero의 이미지

함수 안에서 다른 함수를 정의하고 계신데, C++에 그런게 있었단 말인가요? 밑에 에러는 분명히 그로 인한 syntax error같습니다만

익명사용자의 이미지

Block되면 윈도우 메시지를 처리못해서 프로그램이 먹통될거에요.
windows에서 메시지 callback들은 무조건 리턴해야 됩니다.

대략 코드를 보니 프로그램이 편법적으로 이벤트를 받아 처리하려고 하는것같은데
프로그램이 조금 비정상적으로 짜여져 있는것 같네요.

1. 구지 코드를 유지시키려면 OnTrayNotification콜백을 외부에 선언해서
거기에 Sleep(60000)을 넣으세요. (단, 60초동안 이벤트 먹통됩니다.)

2. sleep하는 시간동안의 click이벤트를 무시할수 없다면(그런데 이런 경우는 없을겁니다.)
OnTimer를 사용하여 60초 마다 한번씩 호출하도록 만드세요. 물론 sleep을 제거하시고요.

3. sleep하는 시간동안의 click이벤트를 무시해도 좋다면
time을 선언해서 이전 클릭시간에서 60초가 지난지를 확인하고 지났으면 해당내용을 처리하고
지나지 않았으면 그냥 리턴하시면된다.(<-- 가능하다면 이거로 하세요)

ydongyol의 이미지

1분 간격으로 뭐를 하시려고 한다면 타이머를 쓰세요..

그리고 OnInitDialog() 내에 while문 같은걸 쓰시는건 좀 위험합니다.

작업관련 무한루프 같은건 쓰레드를 만드시고 메인 루프에서 독립시키시는게 좋을 듯합니다.
--
Linux강국 KOREA
http://ydongyol.tistory.com/

--
Linux강국 KOREA
http://ydongyol.tistory.com/

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.