기본 콘텐츠로 건너뛰기

3월, 2017의 게시물 표시

C++ - SendMessage - MESSAGE_HANDLER 예제

define.h #define     TM_START   WM_USER + 2000        // 자동검사시작 #define     TM_STOP   WM_USER + 2001        // 검사중지 FormMeasureInfo.cpp SendMessage(BaseForm->nForm[stage]->Handle, TM_START, 0, 0); FormTotal.h BEGIN_MESSAGE_MAP MESSAGE_HANDLER(TM_START, TMessage, OnStart) MESSAGE_HANDLER(TM_STOP , TMessage, OnStop) MESSAGE_HANDLER(TM_SIZE  , TMessage, OnSize) MESSAGE_HANDLER(TM_IR  , TMessage, OnIr) MESSAGE_HANDLER(TM_OCV  , TMessage, OnOcv) END_MESSAGE_MAP(TForm) void __fastcall OnStart(TMessage& Msg);    // 상태 전환 void __fastcall OnStop(TMessage& Msg); // 수동 시작 FormTotal.cpp void __fastcall TTotalForm::OnStart(TMessage& Msg){} SendMessage(TM_START) -> MESSAGE_HANDLER(TM_START,  TMessage, OnStart)  -> OnStart(TMessage& Msg)

C++ - SendMessage 예제 - BEGIN_MESSAGE_MAP/ END_MESSAGE_MAP

클래스간 데이터 전달을 하는 방법이 무엇이 있을까. 1. 전역변수 2. 헤더 include 후 변수 접근 3. SendMessage SendMessage를 이용하면 클래스간 데이터 전달이 용이함을 알고, 사용해보았다(몇번의 삽질과 함께...) LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 ) throw(); static LRESULT SendMessage( HWND hWnd, UINT message, // 메시지 이름 WPARAM wParam, // 정수형 포인터 전달인자 LPARAM lParam // 실수형 포인터 전달인자 ) throw(); 주로 static을 쓰게 될텐데... 선언해주어야 하는 파트는 3파트. 1. 메시지 등록 - '이런 메시지를 쓰겠습니다.' 하는 부분          - 메시지 등록은 이 메시지를 받을 곳 메시지 맵에 등록을 한다. 던져줬는데 받는놈이 뭔지 모르면 그건 스팸일테니... 매시지 맵의 역할에 대해서는 따로 공부..           ex) BEGIN_MESSAGE_MAP(CsendMessageDlg, CDialog) ON_MESSAGE(메시지 구별자, 처리함수)       END_MESSAGE_MAP()   2. 처리함수 정의 - 위의 처리함수를 정의하는 부분.   3. 메시지 전달 - 메시지를 전달하는 부분 ex) ::SendMessage(전달 받을 곳의 핸들(받는사람) , 메시지 구별자, 전달인자1, 전달인자2);   흐름 SendMessage - 받는 핸들 찾음 - 처리 함수 호출 #sendMessageDlg.cpp /...

C++ - 윈도우간 통신 SendMessage() 와 PostMessage(), PostThreadMessage()

윈도우간 통신 SendMessage() 와 PostMessage(), PostThreadMessage() ■  PostMessage() 1. 원형 BOOL PostMessage(     HWND hWnd,      // 이 메시지를 받을 윈도우 핸들     UINT Msg,       // 전달할 메시지     WPARAM wParam,  // 여분 데이터     LPARAM lParam   // 여분 데이터 );    2. 동작    - Msg 인수로 지정된 메시지를 hWnd 윈도우의 메시지 큐에 집어 넣는다.    - 메시지를 받은 윈도우는 윈도우 프로시저에서 이 메시지를 처리한다.    - 메시지를 메시지 큐에 넣기만 하고 바로 리턴 한다.    - 큐에 붙인 메시지는 GetMessage() 에 의해 읽혀지고, DispatchMessage() 에 의해 윈도우 프로시저로 보내짐 3. 리턴값에 대하여     - TRUE : 메시지를 메시지 큐에 붙이기 성공     - FALSE : 메시지를 메시지 큐에 붙이기 실패     ※ 가급적이면 리턴값을 점검해 보는 것이 좋다.         메시지 큐는 크기가 한정되어 있기 때문에 고속으로 전송되는 모든 메시지를 다 수용하지 못할 수도 있기때문 4. 장...

C++ - SetWindowLong/GetWindowLong

해당 윈도우에 설정을 변경하거나 사용자의 특별한 정보(Data )를 저장하고 싶을때 사용하는 API. 만약 Window를 하나 만들면서 그 Window를 생성한 부모의 Window정보를 저장하고 싶거나 생성한 Window가 List용인지 Popup용인지를 알수 있도록 Window의 태생 정보를 저장해 두고 싶을 때 사용. 물론 이 API를 사용하지 않고 Window의 정보를 저장할 수 있는 방법은 많지만 별도의 저장 공간도 필요하고 관리 메커니즘도 필요. Window 가 생성될때 소멸될때 일일이 처리 해 줘야 하니 SetWindowLong / GetWindowLong으로 깔끔하게 해결 할 수 있음.

C++ - C++ Builder(Delphi) Frame 속성

BorderStyle  -  폼의 경계선 모양을 지정한다 .  이 속성을 어떻게 지정하는가에 따라 폼의 모양은 물론 폼의 기능에도 변화가 생긴다 .  경계선은 단순한 장식이 아니며 경계선의 모양에 따라 폼 전체의 모양과 기능이 달라지기 때문이다 . bsDialog 크기 조정이 불가능 하며 대화상자 형태를 가진다 . bsNone 경계선을 가지지 않으며 최소 ,   최대 ,   조절 메뉴도 가지지 않는다 .   크기 조정은 물론 불가능 하며 타이틀 바도 없기 때문에 위치를 옮길 수도 없다 . bsSingle 크기 조정이 불가능 하며 선 하나로 된 경계선을 가진다 . bsSizeable 크기 조정이 가능한  표준적인 경계선을 가진다 .   이 속성이  디폴트 이다 . bsToolWindow ,  bsSizeToolWindow bsToolWindow :  bsSingle 과 같되 타이틀 바의 높이가 좁으며 시스템 메뉴와 닫기 버튼이 없다 . bsSizeToolWindow :  bsToolWindow 같으나,  크기 조정 가능 BorderIcons    폼의 타이틀바에 나타나는 버튼의 종류를 설정한다 (Ture : 설정, False : 미설정)  - biSystemMenu : 시스템 메뉴  - biMinimize : 최소화 버튼  - biMaximize : 최대화 버튼  - biHelp : 도움말 버튼 FormStyle      폼의 종류를 지정한다. 하나의 윈도우안에 여러 개의 윈도우가 열리는 MDI 프로그램을 만들때 사용하는 속성   - fsNormal : 표준적인 폼  -  ...

C++ - Form(Delphi, C++ Builder) Birth and Death

Birth : OnCreate -> OnShow -> OnActivate -> OnPaint -> OnResize -> OnPaint ...  Death :  OnCloseQuery -> OnClose -> OnDeactivate -> OnHide -> OnDestroy In Windows, most elements of the user interface are windows. In Delphi, every project has at least one window - program's main window. All windows of a Delphi application are based on TForm object. FORM Form objects are the basic building blocks of a Delphi application, the actual windows with which a user interacts when they run the application. Forms have their own properties, events, and methods with which you can control their appearance and behavior.  A form is actually a Delphi component, but unlike other components, a form doesn't appear on the component palette. We normally create a form object by starting a new application (File | New Application). This newly created form will be, by default, the application's main form - the first form created at runtime. Not...

C++ - C++ 함수 만들기 (고려사항)

C++ 함수 만들기 (고려사항) Return 값을 표기 인자 값의 정확한 타입을 표기 인자 값과 내부 변수를 구별 해당 인자 값을 어떻게 활용하는지 표기 포인터(*) 제거 int GetStringSize(); => int nGetStringSize() => 함수 호출시에 리턴값을 알 수 있음. => n: int, sz: String, p: Point, L: Long int nGetStringSize(TCHAR* szName, int nNameSize) => 함수의 인자값이 어떤 형태인지 알 수 있다. int nGetStringSize(TCHAR* _szName, int _nNameSize) => “_”를 이용하여 이 변수는 함수 인자값으로 받아온 변수라는 것을 알 수 있다. int nGetStringSize(TCHAR* szName, int nNameSize) 함수에 Name을 복사하여 Buffer에 담는 함수라고 하고 인자를 추가하면 int nGetStringSize(TCHAR* szName, int nNameSize, TCHAR* _szBuffer) int nGetStringSize(TCHAR* szName, int nNameSize, TCHAR* _szOutPutBuffer); 두번째가 가독성이 좋음. 이것을 좀더 수정하면 int nGetStringSize(__in TCHAR* szName, __in int nNameSize, __out TCHAR*   _szOutPutBuffer); __in, __out, __inout 은 표기만을 위한 매크로 int nGetStringSize(__in TCHAR* szName, __in int nNameSize, __out TCHAR*   _szOutPutBuffer, __inout INT& _nOutPutBuffer...

C++ - 함수 호출 규약

cdecl - 함수에 인자를 전달할때는 stack에 저장되어 전달된다. - 인자정리방법은  caller 방식 을 따른다.    caller는 함수가 호출되고 기능을 한 후 되돌아가서 인자공간이 정리되는 방식입니다. - 주로 c 또는 c++ 에서 기본으로 사용하는 함수호출규약. [출처]   함수호출규약 cdecl , stdcall , fastcall | 작성자   SLiya stdcall - 인자전달방법으로 stack을 통한다. - 인자정리방법이  callee방식 을 따른다.   이부분이 cdecl과 다릅니다. callee는 호출된 함수내에서 인자를 해제한 후 돌아가는 방식입니다.  이 방식은 인자공간이 해제되는 공간이 정해져 있어서 가변인자함수를 사용하기 어렵다. - 윈도우 API (WinAPI)에서 사용되는 함수호출규약 [출처]   함수호출규약 cdecl , stdcall , fastcall | 작성자   SLiya __fastcall - 인자전달방법으로  stack 과 register를 사용 한다.  레지스터는 메모리보다 동작 방식이 빠르기 때문에 다른 함수호출규약에 비해 실행속도가 빠르다.  그러나 c언어에서는 그대로 사용하면 형태만 따르기 때문에 코드가 늘어나서 오히려 느려질 수도 있다.  그렇기 때문에 c언어에서는 특별한 방식을 사용해야한다.  레지스터는 ECX와 EDX를 사용하는데 첫번째 인자를 ECX에 두번째 인자를 EDX에 세번째인자부터는 stack에 저장한다. - 인자정리방법으로  callee 방식 을 따른다. - 주로 델파이언어라는 곳에서 기본적인 함수호출규약으로 사용한다. [출처]   함수호출규약 cdecl , stdcall , fastcall | 작성자 ...