⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dialog.c

📁 在ADS环境下MiniGUI的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
** $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 + -