📄 dialog.c
字号:
/*
** $Id: dialog.c,v 1.41 2004/08/12 09:35:37 snig Exp $
**
** dialog.c: The Dialog module.
**
** Copyright (C) 2003 Feynman Software.
** Copyright (C) 1999 ~ 2002 Wei Yongming.
**
** Current maintainer: Wei Yongming.
**
** Create date: 1999.09.10
*/
/*
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
#include "minigui.h"
#include "gdi.h"
#include "window.h"
#include "control.h"
#include "cliprect.h"
#include "gal.h"
#include "internals.h"
#include "ctrlclass.h"
void GUIAPI DestroyAllControls (HWND hDlg)
{
PMAINWIN pDlg = (PMAINWIN)hDlg;
PCONTROL pCtrl = (PCONTROL)(pDlg->hFirstChild);
PCONTROL pNext;
while (pCtrl) {
pNext = pCtrl->next;
DestroyWindow ((HWND)pCtrl);
pCtrl = pNext;
}
}
#define dlgDestroyAllControls DestroyAllControls
HWND GUIAPI CreateMainWindowIndirectParam (PDLGTEMPLATE pDlgTemplate,
HWND hOwner, WNDPROC WndProc, LPARAM lParam)
{
MAINWINCREATE CreateInfo;
HWND hMainWin;
int i;
PCTRLDATA pCtrlData;
HWND hCtrl;
HWND hFocus;
if (pDlgTemplate->controlnr > 0 && !pDlgTemplate->controls)
return HWND_INVALID;
hOwner = GetMainWindowHandle (hOwner);
CreateInfo.dwReserved = pDlgTemplate->dwAddData;
CreateInfo.dwStyle = pDlgTemplate->dwStyle & ~WS_VISIBLE;
CreateInfo.dwExStyle = pDlgTemplate->dwExStyle;
CreateInfo.spCaption = pDlgTemplate->caption;
CreateInfo.hMenu = pDlgTemplate->hMenu;
CreateInfo.hCursor = GetSystemCursor (IDC_ARROW);
CreateInfo.hIcon = pDlgTemplate->hIcon;
CreateInfo.MainWindowProc = WndProc ? WndProc : DefaultMainWinProc;
CreateInfo.lx = pDlgTemplate->x;
CreateInfo.ty = pDlgTemplate->y;
CreateInfo.rx = pDlgTemplate->x + pDlgTemplate->w;
CreateInfo.by = pDlgTemplate->y + pDlgTemplate->h;
CreateInfo.iBkColor = GetWindowElementColor (BKC_DIALOG);
CreateInfo.dwAddData = pDlgTemplate->dwAddData;
CreateInfo.hHosting = hOwner;
hMainWin = CreateMainWindow (&CreateInfo);
if (hMainWin == HWND_INVALID)
return HWND_INVALID;
for (i = 0; i < pDlgTemplate->controlnr; i++) {
pCtrlData = pDlgTemplate->controls + i;
hCtrl = CreateWindowEx (pCtrlData->class_name,
pCtrlData->caption,
pCtrlData->dwStyle | WS_CHILD,
pCtrlData->dwExStyle,
pCtrlData->id,
pCtrlData->x,
pCtrlData->y,
pCtrlData->w,
pCtrlData->h,
hMainWin,
pCtrlData->dwAddData);
if (hCtrl == HWND_INVALID) {
dlgDestroyAllControls (hMainWin);
DestroyMainWindow (hMainWin);
MainWindowThreadCleanup (hMainWin);
return HWND_INVALID;
}
}
hFocus = GetNextDlgTabItem (hMainWin, (HWND)0, FALSE);
if (SendMessage (hMainWin, MSG_INITDIALOG, hFocus, lParam)) {
if (hFocus)
SetFocus (hFocus);
}
ShowWindow (hMainWin, SW_SHOWNORMAL);
return hMainWin;
}
BOOL GUIAPI DestroyMainWindowIndirect (HWND hMainWin)
{
dlgDestroyAllControls (hMainWin);
DestroyMainWindow (hMainWin);
ThrowAwayMessages (hMainWin);
MainWindowThreadCleanup (hMainWin);
return TRUE;
}
int GUIAPI DialogBoxIndirectParam (PDLGTEMPLATE pDlgTemplate,
HWND hOwner, WNDPROC DlgProc, LPARAM lParam)
{
MAINWINCREATE CreateInfo;
HWND hDlg;
int retCode = IDCANCEL;
HWND hFocus;
MSG Msg;
int isActive;
if (pDlgTemplate->controlnr > 0 && !pDlgTemplate->controls)
return -1;
hOwner = GetMainWindowHandle (hOwner);
//CreateInfo.dwReserved = pDlgTemplate->dwAddData;
CreateInfo.dwReserved = (DWORD)pDlgTemplate;
CreateInfo.dwStyle = pDlgTemplate->dwStyle & ~WS_VISIBLE;
CreateInfo.dwExStyle = pDlgTemplate->dwExStyle;
CreateInfo.spCaption = pDlgTemplate->caption;
CreateInfo.hMenu = pDlgTemplate->hMenu;
CreateInfo.hCursor = GetSystemCursor (IDC_ARROW);
CreateInfo.hIcon = pDlgTemplate->hIcon;
CreateInfo.MainWindowProc = DlgProc;
CreateInfo.lx = pDlgTemplate->x;
CreateInfo.ty = pDlgTemplate->y;
CreateInfo.rx = pDlgTemplate->x + pDlgTemplate->w;
CreateInfo.by = pDlgTemplate->y + pDlgTemplate->h;
CreateInfo.iBkColor = GetWindowElementColor (BKC_DIALOG);
//CreateInfo.dwAddData = (DWORD)pDlgTemplate;
CreateInfo.dwAddData = (DWORD)pDlgTemplate->dwAddData;
CreateInfo.hHosting = hOwner;
hDlg = CreateMainWindow (&CreateInfo);
if (hDlg == HWND_INVALID)
return -1;
SetWindowAdditionalData2 (hDlg, (DWORD)(&retCode));
if (hOwner)
EnableWindow (hOwner, FALSE);
hFocus = GetNextDlgTabItem (hDlg, (HWND)0, FALSE);
if (SendMessage (hDlg, MSG_INITDIALOG, hFocus, lParam)) {
if (hFocus)
SetFocus (hFocus);
}
ShowWindow (hDlg, SW_SHOWNORMAL);
while( GetMessage (&Msg, hDlg) ) {
TranslateMessage (&Msg);
DispatchMessage (&Msg);
}
isActive = (GetActiveWindow() == hDlg);
dlgDestroyAllControls (hDlg);
DestroyMainWindow (hDlg);
ThrowAwayMessages (hDlg);
MainWindowThreadCleanup (hDlg);
if (hOwner) {
EnableWindow (hOwner, TRUE);
if(isActive)
{
ShowWindow (hOwner, SW_SHOWNORMAL);
SetActiveWindow (hOwner);
}
}
return retCode;
}
BOOL GUIAPI EndDialog (HWND hDlg, int endCode)
{
DWORD dwAddData2;
dwAddData2 = GetWindowAdditionalData2 (hDlg);
if (dwAddData2 == 0)
return FALSE;
*((int *)(dwAddData2)) = endCode;
PostQuitMessage (hDlg);
return TRUE;
}
int GUIAPI DefaultDialogProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
HWND hCurFocus;
switch (message) {
case MSG_CREATE:
{
int i;
PCTRLDATA pCtrlData;
HWND hCtrl;
/*
PDLGTEMPLATE pDlgTmpl
= (PDLGTEMPLATE)(((PMAINWINCREATE)lParam)->dwAddData);
*/
PDLGTEMPLATE pDlgTmpl
= (PDLGTEMPLATE)(((PMAINWINCREATE)lParam)->dwReserved);
for (i = 0; i < pDlgTmpl->controlnr; i++) {
pCtrlData = pDlgTmpl->controls + i;
if (pCtrlData->class_name) {
hCtrl = CreateWindowEx (pCtrlData->class_name,
pCtrlData->caption,
pCtrlData->dwStyle | WS_CHILD,
pCtrlData->dwExStyle,
pCtrlData->id,
pCtrlData->x,
pCtrlData->y,
pCtrlData->w,
pCtrlData->h,
hWnd,
pCtrlData->dwAddData);
}
else
break;
if (hCtrl == HWND_INVALID) {
dlgDestroyAllControls (hWnd);
return -1;
}
}
/* set back dwAddData to be the value from dialog template */
//SetWindowAdditionalData (hWnd, pDlgTmpl->dwAddData);
return 0;
}
case MSG_DLG_GETDEFID:
{
HWND hDef;
hDef = GetDlgDefPushButton (hWnd);
if (hDef)
return GetDlgCtrlID (hDef);
return 0;
}
case MSG_DLG_SETDEFID:
{
HWND hOldDef;
HWND hNewDef;
hNewDef = GetDlgItem (hWnd, wParam);
if (SendMessage (hNewDef, MSG_GETDLGCODE, 0, 0L) & DLGC_PUSHBUTTON) {
hOldDef = GetDlgDefPushButton (hWnd);
if (hOldDef) {
ExcludeWindowStyle (hOldDef, BS_DEFPUSHBUTTON);
InvalidateRect (hOldDef, NULL, TRUE);
}
IncludeWindowStyle (hNewDef, BS_DEFPUSHBUTTON);
InvalidateRect (hNewDef, NULL, TRUE);
return (int)hOldDef;
}
break;
}
case MSG_COMMAND:
if (wParam == IDCANCEL) {
HWND hCancel;
hCancel = GetDlgItem (hWnd, IDCANCEL);
if (hCancel && IsWindowEnabled (hCancel)
&& IsWindowVisible (hCancel))
EndDialog (hWnd, IDCANCEL);
else
Ping ();
}
break;
case MSG_CLOSE:
{
HWND hCancel;
hCancel = GetDlgItem (hWnd, IDCANCEL);
if (hCancel && IsWindowEnabled (hCancel)
&& IsWindowVisible (hCancel))
EndDialog (hWnd, IDCANCEL);
else
Ping ();
return 0;
}
case MSG_KEYDOWN:
if ((hCurFocus = GetFocusChild (hWnd))
&& SendMessage (hCurFocus, MSG_GETDLGCODE, 0, 0L) & DLGC_WANTALLKEYS)
break;
switch (wParam) {
case SCANCODE_ESCAPE:
SendMessage (hWnd, MSG_COMMAND, IDCANCEL, 0L);
return 0;
case SCANCODE_TAB:
{
HWND hNewFocus;
if (hCurFocus && SendMessage (hCurFocus, MSG_GETDLGCODE, 0, 0L) & DLGC_WANTTAB)
break;
if (lParam & KS_SHIFT)
hNewFocus = GetNextDlgTabItem (hWnd, hCurFocus, TRUE);
else
hNewFocus = GetNextDlgTabItem (hWnd, hCurFocus, FALSE);
if (hNewFocus != hCurFocus) {
SetFocus (hNewFocus);
// SendMessage (hWnd, MSG_DLG_SETDEFID, GetDlgCtrlID (hNewFocus), 0L);
}
return 0;
}
case SCANCODE_ENTER:
{
HWND hDef;
if (hCurFocus && SendMessage (hCurFocus, MSG_GETDLGCODE, 0, 0L) & DLGC_WANTENTER)
break;
if (SendMessage (hCurFocus, MSG_GETDLGCODE, 0, 0L) & DLGC_PUSHBUTTON)
break;
hDef = GetDlgDefPushButton (hWnd);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -