?? 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 DestroyAllControlsHWND 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 + -