|
지금의 Tray 방식은 폼에서 생성을 하고 폼의 메뉴를 의존하기 때문에, 폼이 올라와 있지 않은 경우에 에러가 발생합니다. 이 때, 두가지 방법으로 처리가 가능합니다.
1. 시작시 폼을 강제로 안보이게 하는 방법
// 아래 이벤트를 추가
void __fastcall TForm1::FormActivate(TObject *Sender)
{
ShowWindow(Form1->Handle, SW_HIDE);
ShowWindow(Application->Handle, SW_HIDE);
}
// 아래의 이벤트에서 밑의 두 줄을 추가
void __fastcall TForm1::N11Click(TObject *Sender)
{
ShowWindow(Form1->Handle, SW_SHOW); <<- 추가
ShowWindow(Application->Handle, SW_SHOW); <<- 추가
pTray->Restore();
}
2. Tray 아이콘을 만드는 방식을 바꿈
아래는 제가 사용하던 트레이 아이콘 만드는 루틴 입니다. WM_USER + 1 의 메세지 번지가 다른 프로그램에서 사용하고 있지 않아야 합니다.
<<헤더 파일에 선언>>
#include "TrayIcon.h"
TTrayIcon *pTray;
void __fastcall TrayOnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y);
<<소스 파일에 선언>>
UINT uiTrayMessage;
/****************************************************************
Tmain
- Main Initialize
****************************************************************/
__fastcall TMain::TMain(TComponent* Owner) : TForm(Owner)
{
// Receive Register Message From Windows
uiTrayMessage = RegisterWindowMessage ("MyIconNotify");
}
/****************************************************************
AddTray
- Add icon to tray-bar
****************************************************************/
void __fastcall TMain::AddTray()
{
NOTIFYICONDATA niIcon;
memset(&niIcon, 0x00, sizeof(niIcon));
niIcon.cbSize = sizeof(niIcon);
niIcon.hWnd = Handle;
strncpy(niIcon.szTip, "Hi-Net Communicator", sizeof(niIcon.szTip));
niIcon.hIcon = Application->Icon->Handle;
niIcon.uCallbackMessage = WM_USER + 1;
niIcon.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
Shell_NotifyIcon(NIM_ADD, &niIcon);
}
/****************************************************************
RemoveTray
- Remove icon from tray-bar
****************************************************************/
void __fastcall TMain::RemoveTray()
{
NOTIFYICONDATA niIcon;
memset(&niIcon, 0x00, sizeof(niIcon));
niIcon.cbSize = sizeof(niIcon);
niIcon.hWnd = Handle;
Shell_NotifyIcon(NIM_DELETE, &niIcon);
}
void __fastcall TForm1::TrayOnMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
if( Button == mbRight ) {
pTray->ShowMenu();
}
}
쉬운 방법으로 선택하시면 됩니다.
초짜 ^^ 님이 쓰신 글 :
: 답변 감사드립니다.
:
: Application->ShowMainForm = false; 이 부분을 프로젝트에 포함시키니
:
: 폼이 화면에 나타나지 않더군요.
:
: 근데 트레이에서 폼을 표시할려고 오른쪽 마우스 버튼을 누르니깐 에러가
:
: 나거든요..
:
: 어떻게 해결해야하나요?
:
: 트레이 오른쪽 버튼을 누르면 팝업창에 뜨고 폼이 생성해야하는데
:
: 잘 안되는군요.
:
: 다시한번 답변 부탁드립니다.
:
: 그럼 수고하세요.. ^^
|