궁금이... 님이 쓰신 글 :
: 안녕하세요 도움 많이 받고 있는 사람입니다.
: 개발 환경은 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);
}
}