C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[70101] Re:Re:질문 몇가지
주누 [junesaku] 3273 읽음    2013-09-10 14:13
일단 이미지 크기변경은 GDI+를 이용해서 해결은 했습니다.
WinAPI는 생각 안해봤었네요..

예외문제는 타사의 DLL을 써야하고 또 타사에게 문의가 힘든 상황이라서 그렇게 됬습니다.
트레이로 Minimize이후로 얻어오는 헨들 문제도 위 예외 처리를 추가 한 뒤로 생겼었구요.
예외 관련은 해당 책을 한번 찾아봐야 겠습니다.

동기화 문제는 아마 아닐것 같습니다.
다른 프로그램이 트레이로 숨은 프로그램을 FindWindow해서 받은 헨들이 달라지는 것이라서요.
일단 단순히 tray의 Minimize를 쓰지 않고 그냥 폼을 Hide시켜서 비슷한 결과가 나오게 해버렸습니다.
(나름 최소화 한것처럼 작업표시줄에도 사라지더라구요.)
최소화 버튼은 메세지를 후킹으로 최소화가 아닌 Hide로 바뀌게 해두고요.
다만 작업표시줄을 눌러서 최소화 하는건 어찌하는지 몰라서 일단 냅뒀지만요.

답변 감사합니다.

박우성 님이 쓰신 글 :
: 질문 1.
:
: 윈도우 API 함수 StretchBlt로 바꾸어 보세요. 그래도 문제가 생긴다면, StretchDraw의 문제는 아닌거죠.
:
:
: 질문 2.
:
: 예외라는 것이 윈도우 OS에서 발생되는 것이 있고, C++ 소스의  throw에 의해서 발생되는 것이 있습니다. 이 두가지의 차이점에서 생긴 문제로 보여 집니다.  그리고, 예외창도 윈도우 OS에서 띄우는 것이 있고, C++빌더에서 띄우는 것이 있습니다.
:
: 솔직히 윈도우 OS자체의 예외는 좀 복잡하더군요. 제프리 리처의 WINDOWS via C/C++ 책의24장과 25장을 참고하시면 도움이 될 것 같구요.
:
: 단순히 윈도우 예외창에 대한 제어는, SetErrorMode함수를 이용하면 됩니다.
:
: 그리고, 될 수 있으면  DLL의 예외는 DLL자체에서 모두 해결해야 되며, DLL을 호출한 EXE로 전가되는 것을 피해주는 것이 좋습니다.
:
:
: 질문 3.
:
: BCB6에서 테스트 해 보니까 잘 됩니다.
:
:
#define WM_TEST (WM_USER+1000)
: 
: //---------------------------------------------------------------------------
: class TForm1 : public TForm
: {
: __published:	// IDE-managed Components
:     TTrayIcon *TrayIcon1;
:     TImageList *ImageList1;
:     TButton *Button1;
:     TTimer *Timer1;
:     TMemo *Memo1;
:     void __fastcall Timer1Timer(TObject *Sender);
:     void __fastcall Button1Click(TObject *Sender);
: private:	// User declarations
: 	void __fastcall OnTest( TMessage &Msg );
: 	BEGIN_MESSAGE_MAP
: 	MESSAGE_HANDLER(WM_TEST, TMessage, OnTest)
: 	END_MESSAGE_MAP(TForm)
: public:		// User declarations
:     __fastcall TForm1(TComponent* Owner);
: };
: 
: 
: //---------------------------------------------------------------------------
: 
: void __fastcall TForm1::Timer1Timer(TObject *Sender)
: {
:     HWND hwnd = FindWindow( "TForm1", "Form1" );
:     if( hwnd ){
:         PostMessage( hwnd, WM_TEST, 0, 0 );
:     }else{
:         Memo1->Lines->Add("FindWindow Failed!");
:     }
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::OnTest( TMessage &Msg )
: {
:     Memo1->Lines->Add("OK!");
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
:     TrayIcon1->Minimize();
: }

:
: 쓰레드 이야기가 나온 것으로 보아서 동기화 문제일 수도 있겠다 싶은데, 디버깅을 해 보시기 바랍니다.
:
:
: 주누 님이 쓰신 글 :
: : BCB6 Ent에서 질문입니다.
: :
: : 질문 1.
: :
: : 비트맵 이미지 크기를 변경하기 위해서
: : Graphics::TBitmap을 두개 생성한뒤 한 비트맵에서 다른 비트맵으로
: : Graphics::TBitmap의 맴버함수인 StretchDraw를 이용하여 크기를 변경할경우
: :
: : 어디선가 메모리 누수가 일어 나는 것 같습니다. (두 비트맵은 std::auto_ptr을 이용하여 만들었습니다.)
: : 다만 실제 메모리 사이즈는 크게 증가하지는 않고 다만 사용하다가 리소스 부족이라고 뜨는 것을 봐서는
: : 단순 메모리 누수가 아닌 다른 문제 같은데요.
: : 해결 방법이 있나요? 문제는 약 초당 20번씩 크기를 변경할때 한두시간이 지나야 발생합니다.
: :
: :
: : 질문 2.
: :
: : 프로그램 문제인지 빌더의 버그인지 간혹 try... catch문이 정상 동작을 안하는것 같습니다.
: : dll에서 발생하는 예외를 처리하기 위해서 WinAPI의 SetUnhandledExceptionFilter를 이용하여 잡도록 하였고 정상 동작을 하다가..
: : 어느 순간... 프로젝트명의 cpp파일의 try catch부분의 ShowException를 비활성 하였음에도 불구하고 예외발생시 메세지를 띄우는 경우가 생기고 이후로 몇몇 부분의 예외 처리가 정상 동작을 안합니다.
: : 어느부분에서 실수 한 것일까요?
: : 현재 강제로 Application->OnException을 만들어서 지정해주니 메세지 뜨는 부분을 해결 됬지만 WinAPI의 SetUnhandledExceptionFilter부분은 정상 동작을 안하는 것같습니다.
: :
: :
: : 질문 3.
: :
: : 빌더의 기본제공되는 TTrayIcon을 이용하여 프로그램을 제작 하였더니 TrayIcon->Minimize()를 해버리면 FindWindow를 했을시 다른 값을 반환 합니다.
: : Minimize이전에는 정상적으로 헨들을 가져오고 해당 헨들을 이용하여 메세지를 정상적으로 보낼수 있지만
: : 이후 숨김상태에서는 실패값이 아닌 다른 헨들을 가져와서 이후 메세지를 정상적으로 보낼수가 없습니다. (받는 프로그램이 못받음으로)
: : 이건 원래 이런건 가요?
: : 특이 사항으로 Minimize시 몇몇 부분의 코드는 작동하고(타이머나 쓰레드) 몇몇 부분은 멈춤니다.
: : 다만 창을 하나라도 띄우거나 트레이에 등록한 PopupMemu를 띄우거나 하면 또 정상적으로 받아와 집니다.

+ -

관련 글 리스트
70095 질문 몇가지 주누 3039 2013/09/09
70100     Re:질문 몇가지 박우성 2378 2013/09/10
70101         Re:Re:질문 몇가지 주누 3273 2013/09/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.