키워드 : 대화 상자, 대화 상자, 방지 가능
1. 문제가 발생했습니다
문제는 Stanley_XU에서 나옵니다. 닫기 버튼 만 가져 오기를 희망합니다 (도움이 될 수 있음). 왼쪽 상단에 프로그램에 대한 아이콘이 없으며 대화 상자가 창 크기를 변경할 수 있습니다.
Borderstyle 및 Bordericons 특성은 VCL에서 TForm에 대해 창 스타일의 설정을 단순화하기 위해 설정됩니다 (그렇지 않으면 Setwindowlong 및 getwindowlong과 같은 API 기능을 호출해야 함). tformborderstyle 및 tbordericon의 정의 및 설명은 다음과 같습니다.
가치 의미
BSDIALOG RESIZIZING;
BSSINGE는 단일 라인 테두리;
BSNONENOTRESIZAL;
BSSizable 표준 재판용 테두리
bssingingle과 같은 bstoolwindow는 더 작은 캡션이 있습니다
bssizetoolwin은 더 작은 캡션으로 bssizable입니다
ttbordericon = (bisystemmenu, biminimize, bimaximize, bihelp);
tbordericons = tbordericon 세트;
가치 의미
BisystemMenu 양식에는 제어 메뉴 (시스템 메뉴라고도 함)가 있습니다.
양식의 이중화에는 최소화 버튼이 있습니다
bimaximize 양식에는 최대화 버튼이 있습니다
Bihelp Borderstyle이 Bsdialog 또는 Biminimize 및 Bimaximize가 제외되고, 질문 마크는 양식의 제목 표시 줄에 나타나고 클릭하면 Cursor가 Crhelp로 변경됩니다.
분명히 Borderstyle 및 Bordericons는 일반적인 요구 만 충족 할 수 있으며 크기를 수정할 수있는 대화 상자를 구현하는 것은 불가능합니다.
일반적으로 말하면, 최대화 할 수 없지만 크기를 변경할 수있는 창을 얻으려면 Borderstyle을 BSSIZAIZEL으로 설정하고 Biminimize를 제거하고 경계를 제거하면 결과는 다음과 같습니다. 창은 수정 될 수 있지만 있습니다. 왼쪽 상단의 아이콘, :
그림 1 아이콘이있는 대화 상자
왼쪽 상단에 아이콘이 있습니다.
우리의 목표는 아래의 두 가지 효과입니다. 왼쪽 상단에 아이콘이 없지만 창의 크기가 변경 될 수 있습니다.
그림 2 파일 열기 대화 상자
그림 3 폴더를 찾아보십시오. 대화 상자
2. 문제의 절반이 해결됩니다
MSDN을 검색하고 크기를 변경할 수있는 속성 페이지를 디자인하는 방법을 가르쳐주는 기사를 찾았습니다 (MFC에서는 MFC에서 CPROPERTYPAGE 하위 페이지로 나타나서 CDIALOG에서 상속하고 일반적으로 크기를 수정할 수없는 CPROPERTYPAGE 하위 페이지로 나타납니다) "상영 가능한 MFC 속성을 설계하는 방법 시트, 기사에 소개 된 방법은 속성 페이지가 작성되기 전에 창 스타일을 수정 한 다음 WM_Size 메시지를 수동으로 처리하는 것입니다.
int 콜백 CMYPROPERTYSEET :: XMNPROPSHEETCALLBACK (HWND HWND, UINT 메시지, LPARAM LPARAM)
{
extern int 콜백 afxpropsheetcallback (hwnd, uint message, lparam lparam);
// XMN : MFC의 콜백 호출
int nres = afxpropsheetcallback (hwnd, message, lparam);
스위치 (메시지)
{
CASE PSCB_PRECREATE :
// 우리 자신의 창 스타일을 설정합니다
((lpdlgtemplate) lparam)-> style | = (ds_3dlook | ds_setfont
| WS_SYSMENU |
부서지다;
}
반환 nres;
}
동일한 방법을 VCL 형태로 사용하려고 시도했습니다. 디자인 할 때 Borderstyle을 BSDialog로 설정 한 다음 CreateParams 방법에 과부하하십시오. 그러나 결과는 대화 상자가 두꺼운 테두리가되기 때문에 (WS_THICKFRAME 스타일이 있기 때문에) 마우스는 각 테두리로 이동 한 후 자동으로 변경 될 수 있으며 왼쪽 상단에 아이콘이 없지만 창은 크기를 변경할 수 없습니다. (추가 된 WM_SIZE 메시지 처리 프로세스가 트리거되지 않습니다). 문제는 무엇입니까?
그림 4 아직 완전히 만족스럽지 않은 대화 상자
3. 문제를 해결하십시오
Forms.pas의 소스 코드를 확인하고 문제를 발견했습니다. TcustomForm의 WM_NCCREATE 메시지 처리 프로세스에는 양식의 시스템 메뉴를 수정하는 데 사용되는 ModifySystemMenu 임베딩 프로세스가 있습니다. 아래의 빨간색 텍스트는 "시스템 메뉴를 대화 상자처럼 보이게 만듭니다"라고 표시됩니다. 다음 코드 문장은 시스템 메뉴 항목을 "이동"및 "닫는"지점으로 삭제했습니다.
절차 tcustomform.wmnccreate (var 메시지 : twmnccreate);
절차 modifysystemmenu;
var
Sysmenu : hmenu;
시작하다
...
{시스템 메뉴를 수정하여}
sysmenu : = getsystemmenu (핸들, 거짓);
fborderstyle = bsdialog 인 경우
시작하다
{시스템 메뉴를 대화 만하기처럼 보이게합니다.
이동 및 닫기}
deletemenu (sysmenu, sc_tasklist, mf_bycommand);
deletemenu (sysmenu, 7, mf_byposition);
deletemenu (sysmenu, 5, mf_byposition);
deletemenu (sysmenu, sc_maximize, mf_bycommand);
deletemenu (sysmenu, sc_minimize, mf_bycommand);
deletemenu (sysmenu, sc_size, mf_bycommand);
deletemenu (sysmenu, sc_restore, mf_bycommand);
다른 끝
...
끝;
시작하다
상속;
setmenu (fmenu);
그렇지 않은 경우 (ComponentState에서 CSDESIGNING) MODIFYSYSTEMMENU;
끝;
따라서 문제는 "sc_size"가 삭제되기 때문에 창 스타일에는 변형이 있습니다. ws_thickframe (창 크기는 수정 될 수 있음)이지만 wm_size 메시지에 응답하지 않습니다 (sc_size는 삭제 됨).
솔루션은 매우 간단합니다. 자신의 WM_NCCREATE 메시지 처리 프로세스를 구현하고 시스템 메뉴를 수동으로 수정하십시오.
절차 tzocdlgresizable.wmnccreate (var 메시지 : twmnccreate);
// 다음 코드는 form.pas line 4047, delphi 7 sp1에서 복사됩니다.
절차 modifysystemmenu;
var
Sysmenu : hmenu;
시작하다
sysmenu : = getsystemmenu (핸들, 거짓);
{시스템 메뉴를 대화 만하기처럼 보이게합니다.
이동, 크기 및 가까운 명령}
deletemenu (sysmenu, sc_tasklist, mf_bycommand);
deletemenu (sysmenu, 7, mf_byposition);
// 닫기 전에 분리기를 제거하지 마십시오.
// deletemenu (sysmenu, 5, mf_byposition);
deletemenu (sysmenu, sc_maximize, mf_bycommand);
deletemenu (sysmenu, sc_minimize, mf_bycommand);
{크기 명령을 제거하지 마십시오. 그렇지 않으면 우리는
대화 상담 기능}
// deletemenu (sysmenu, sc_size, mf_bycommand);
deletemenu (sysmenu, sc_restore, mf_bycommand);
끝;
시작하다
{TCUSTOMFORM의 WM_NCCREATE 처리기를 건너 뛰십시오
시스템 메뉴의 크기 명령.}
상속 된 defaulthandler (메시지);
// 시스템 메뉴를 우리 자신의 방식으로 처리합니다.
modifysystemmenu;
끝;
4. tzocdlgresizable 클래스
TForm에서 상속 된 클래스로 캡슐화하는 최종 솔루션은 그림 1과 동일합니다 (그림 2와 같은 시스템 메뉴를 원한다면 사용하면 상속을받을 수 있습니다 tzocdlgresizable.
BTW : 특정 상황에 대해서는 TZOCDLGRESIZAL에 SizeGrip 속성을 추가했습니다.
그림 5 아이콘이없는 SizeGrip이있는 대화 상자
다운로드 (EXE 및 소스 코드)
http://www.zocsoft.com/temp/resizable_dialog.rar
5. 참조 자료 :
MSDN : Resized 가능한 MFC 속성 시트를 설계하는 방법
견적 주소 : "델파이의 크기를 변경할 수있는 대화 상자 구현"