2016-06-03 4 views
0

투명 배경이있는 Windows 10 스타일의 전체 화면 모달 대화 상자를 복제하려고합니다. 제목 표시 줄을 제외하고는 모든 것이 완벽하게 작동합니다.MS Access 2016 - AcDialog로 열린 양식에서 제목 표시 줄 제거

How it looks now

나는 그것을 제거 할 수 없다. 또한 창 투명성을 위해 서브 클래 싱하는 다른 API를 비활성화했습니다. 테두리 스타일을 없음으로 설정하면 모든 제목 표시 줄 컨트롤이 숨겨집니다. 이 양식은을 팝업으로 설정하고

Property Sheet from the Form

모달 나는이처럼 열려 :

DoCmd.OpenForm "Modal_Full_Screen", acNormal, , , , acDialog 

이 내가 그것을 제거하려고 Form_Load 이벤트에서 만드는 API 호출은 다음과 같습니다

Dim lStyle As Long 
SetWindowLong Me.hwnd, GWL_EXSTYLE, GetWindowLong(Me.hwnd, GWL_EXSTYLE) And Not WS_EX_DLGMODALFRAME 

SetWindowPos Me.hwnd, 0, 0, 0, 0, 0, SWP_FRAMECHANGED Or SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER 
lStyle = GetWindowLong(Me.hwnd, GWL_STYLE) 
lStyle = lStyle And Not (WS_BORDER Or WS_DLGFRAME Or WS_MAXIMIZEBOX Or WS_MINIMIZEBOX Or WS_THICKFRAME Or WS_CAPTION) 
Call SetWindowLong(Me.hwnd, GWL_STYLE, lStyle) 
SetWindowPos Me.hwnd, 0, 0, 0, 0, 0, SWP_FRAMECHANGED Or SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER 

확실히 처리를 중단하고 입력을 기다리고 싶습니다. 팝업 창이 닫히는 것을 기다리는 동안 루프를 놓는 트릭을 알고 있지만, DoEvents의 팬이 아니며, 빠른 머신에서 특히 스택을 크래킹하는 경향이 있습니다.

제목 표시 줄 이벤트를 사용하지 않도록 설정하거나 잡을 수있는 방법이 없으면 클릭하고 끌어 전체 화면에서 창을 복원합니다 (그러나 두 번 클릭하면 최대화되지는 않습니다).

답변

2

여기에 잘못 될 수있는 여러 가지가 있습니다.

확인할 첫 번째 작업은 폼에로드 이벤트 형식의 창 핸들이 실제로 있는지 여부입니다. 그렇지 않을 수도 있습니다. (.net의 WinForms에는 없습니다.) 호출시 중단 점을 SetWindowLong으로 설정하거나 API 호출을하기 전에 hwnd 값이 0인지 확인하십시오.

확인해야 할 두 번째 사항은 해당 API 호출의 반환 값이 실제로 무엇인지 확인하는 것입니다. SetWindowLong은 함수가 실패한 경우 0을 반환합니다. 먼저 윈도우 스타일이 0이면 호출 전에 SetLastError(0)을 호출하고 GetLastError의 결과를 사용하여 호출이 실제로 실패했는지 확인해야합니다.

SetLastError(0) 
result = SetWindowLong(...) 
if result = 0: 
    lastError = GetLastError() 
    if lastError <> 0: 
     ' Handle the error here. 
    else: 
     ' The window style is actually 0. 

는 또한 SetWindowPos의 반환 값에 대한 설명서를 확인 : 의사에서이처럼 보인다. (Windows API BOOL 유형은 실제로 32 비트 정수임을 기억하십시오.) GetWindowLong을 사용하여 아직 창에 적용된 창 스타일이 있는지 여부를 확인해야합니다. 왜냐하면 창이 아직 초기화 중이며 아직 초기화되지 않았기 때문입니다. WM_CREATE 아직 미정 상태 일 수 있습니다. 어떤 것이 멋지게 점검 할 다음 문제로 이어집니다.

양식의 핸들이 유효하고 API 호출이 모두 성공했다고 가정하면 속성 중에 속성이 적용될 때 초기화하는 동안 창 스타일이 다시 설정되는 것이 좋습니다. 이 문제를 해결하려면 양식을 마지막으로 표시하고 사용자에게 표시 할 때 발생하는 양식의 Activate 이벤트로 스타일 사용자 정의를 이동할 수 있습니다.

아무 것도 작동하지 않으면 윈도우 프로 시저를 서브 클래스 화하고 WM_NCHITTEST 메시지를 처리 ​​할 수 ​​있습니다. 영어로, 그것은 "Window Message - 비 클라이언트 히트 테스트"입니다. 메시지는 창 관리자가 창 프로 시저에 전송하여 주어진 지점에서 마우스의 어느 부분이 창에 있는지 결정합니다.비 클라이언트 영역의 모든 것을 비활성화하려면 메시지를 HTCLIENT으로 응답하십시오.이 메시지는 창 관리자에게 마우스가 해당 영역에 있음을 나타냅니다. 이 메시지는 백그라운드로 드래그 할 수있는 양식을 만드는 방법이기도합니다.

제목 표시 줄을 완전히 없애려면 테두리 스타일을 None으로 설정하여 관리 할 수 ​​없습니다. 다른 옵션은 WM_NCPAINT 메시지를 처리하고 비 클라이언트 영역을 수동으로 그립니다. 해당 메시지에 응답하는 방법에 대한 예는 documentation을 참조하십시오.

두 가지 솔루션 모두 꽤 많은 프로그래밍 작업이 필요하지만 여기 StackOverflow 및 웹의 다른 곳에서 많은 예제가 있습니다. 페인트를 처리하려면 최소 4 ~ 5 개의 추가 API 호출이 필요합니다. 양식에서 제목 표시 줄을 제거하는 것이 얼마나 중요한지에 따라 다릅니다.


1 크게 지나치게 단순화하기 위해, 비 클라이언트 영역은 제목 표시 줄, 시스템 메뉴, 최소화 및 최대화 버튼, 창 경계를 나타냅니다. 클라이언트 영역은 그 밖의 모든 것입니다.

+0

나는 당신에게 케이프를 사야한다, 당신은 오늘 나의 영웅이다. GWL_Style을 찾는 첫 번째 GetWindowLong이 잘못된 인덱스 오류를 던지고있었습니다. GWL_Style이 Null 인 상수에 대한 선언문은 비공개입니다. 이제 완벽하게 작동합니다. 고맙습니다. 훌륭한 진단 교훈이었습니다. – Delecron

+0

낚시를 할 사람을 가르치십시오. 다행 했어. – theB