빌더(TWx) 님이 쓰신 글 :
: 궁금이... 님이 쓰신 글 :
: : 안녕하세요 도움 많이 받고 있는 사람입니다.
: : 개발 환경은 2009 c++에서 하고 있구요
: : 폼에 border를 bsNone으로 하고 패널을 맨위에 위치시키기 위해 아래 글과 같이 질문 올렸더니
: : 감사하게도 빌더님이 아래 소스와 같이 WndProc을 사용하면 된다고 하여 적용하였더니 잘되더군요
: : 문제는 메뉴에서 서브폼을 불러 컨트롤 할려고 했더니 모든 이벤트를 메인 WndProc에서 먹는것 같더라고요
: : 아예 동작을 안합니다.
: : 그리고 서브폼에서도 WndProc 함수가 필요해서 선언하고
: : default:
: : TForm::WndProc(M);
: : 이쪽에 브레이크를 걸고 실행시키면 서브폼에서도 메시지가 넘어옵니다.
: : 근데 서브폼이 아예 동작을 안하네요 왜일까요?(마우스이벤트, 버튼등 모든게)
: : 간절히 답변 부탁드립니다.
: : 글머 수고하세요
: :
: :
: :
: :
: :
: : void __fastcall TForm1::WndProc(TMessage &M)
: : {
: : static RECT rect = {0};
: :
: : switch (M.Msg)
: : {
: : case WM_CREATE:
: : AdjustWindowRectEx(&rect, GetWindowLongPtr(Handle, GWL_STYLE) & ~WS_CAPTION, FALSE, NULL);
: : rect.left *= -1;
: : rect.top *= -1;
: : return;
: :
: : case WM_NCACTIVATE:
: : return;
: :
: : case WM_NCCALCSIZE:
: : if (M.LParam)
: : {
: : NCCALCSIZE_PARAMS* sz = (NCCALCSIZE_PARAMS*)M.LParam;
: : // sz->rgrc[0].top += 3; 상단 보더를 완전히 없애려면 코멘트 처리
: : sz->rgrc[0].left += rect.left;
: : sz->rgrc[0].right -= rect.right;
: : sz->rgrc[0].bottom -= rect.bottom;
: : return;
: : }
: : break;
: :
: : default:
: : TForm::WndProc(M);
: : }
: : }
: :
:
:
:
: 답변:
:
:
: 서브 폼이 있어요?
: 메세지가 라우팅 되도록 하려면...
:
:
:
: void __fastcall TForm1::WndProc(TMessage &M)
: {
: static RECT rect = {0};
:
: switch (M.Msg)
: {
: case WM_CREATE:
: AdjustWindowRectEx(&rect, GetWindowLongPtr(Handle, GWL_STYLE) & ~WS_CAPTION, FALSE, NULL);
: rect.left *= -1;
: rect.top *= -1;
: M.Result = 1;
: break;
:
: case WM_NCACTIVATE:
: M.Result = 1;
: break;
:
: case WM_NCCALCSIZE:
: if (M.LParam)
: {
: NCCALCSIZE_PARAMS* sz = (NCCALCSIZE_PARAMS*)M.LParam;
: // sz->rgrc[0].top += 3;
: sz->rgrc[0].left += rect.left;
: sz->rgrc[0].right -= rect.right;
: sz->rgrc[0].bottom -= rect.bottom;
: M.Result = 1;
: }
: break;
:
: default:
: TForm::WndProc(M);
: }
: }
:
:
매번 친절한 답변 정말 감사합니다.
가끔 느끼는 거지만 이런 답변을 해주시는게 가치로 환산할수 없는 큰 은혜로 생각됩니다.
복 많이 받으실거예요